wcs/tests/form_pages/test_draft.py

824 lines
28 KiB
Python

import datetime
import time
from unittest import mock
import pytest
from django.utils.timezone import make_aware
from webtest import Upload
from wcs import fields
from wcs.blocks import BlockDef
from wcs.formdef import FormDef
from wcs.qommon.storage import NothingToUpdate
from wcs.sql_criterias import Equal
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app, login
from .test_all import create_formdef, create_user, get_displayed_tracking_code
def pytest_generate_tests(metafunc):
if 'pub' in metafunc.fixturenames:
metafunc.parametrize('pub', ['sql', 'sql-lazy'], indirect=True)
@pytest.fixture
def pub(request):
pub = create_temporary_pub(lazy_mode=bool('lazy' in request.param))
pub.cfg['identification'] = {'methods': ['password']}
pub.cfg['language'] = {'language': 'en'}
pub.write_cfg()
return pub
def teardown_module(module):
clean_temporary_pub()
def test_form_discard_draft(pub, nocache):
create_user(pub)
formdef = create_formdef()
formdef.fields = [fields.StringField(id='0', label='string')]
formdef.enable_tracking_codes = False
formdef.store()
formdef.data_class().wipe()
# anonymous user, no tracking code (-> no draft)
app = get_app(pub)
resp = app.get('/test/')
resp.form['f0'] = 'foobar'
resp = resp.form.submit('submit')
resp = resp.form.submit('previous')
assert [x.status for x in formdef.data_class().select()] == []
assert 'Cancel' in resp.text
assert 'Discard' not in resp.text
resp = resp.form.submit('cancel')
# anonymous user, tracking code (-> draft)
formdef.enable_tracking_codes = True
formdef.store()
app = get_app(pub)
resp = app.get('/test/')
resp.form['f0'] = 'foobar'
resp = resp.form.submit('submit')
resp = resp.form.submit('previous')
assert [x.status for x in formdef.data_class().select()] == ['draft']
assert 'Cancel' not in resp.text
assert 'Discard' in resp.text
resp = resp.form.submit('cancel')
assert [x.status for x in formdef.data_class().select()] == [] # discarded
# logged-in user, no tracking code
formdef.enable_tracking_codes = False
formdef.store()
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
resp.form['f0'] = 'foobar'
resp = resp.form.submit('submit')
resp = resp.form.submit('previous')
assert [x.status for x in formdef.data_class().select()] == ['draft']
assert 'Cancel' not in resp.text
assert 'Discard' in resp.text
resp = resp.form.submit('cancel')
assert [x.status for x in formdef.data_class().select()] == [] # discarded
# logged-in user, tracking code
formdef.enable_tracking_codes = True
formdef.store()
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
resp.form['f0'] = 'foobar'
resp = resp.form.submit('submit')
resp = resp.form.submit('previous')
assert [x.status for x in formdef.data_class().select()] == ['draft']
assert 'Cancel' not in resp.text
assert 'Discard' in resp.text
resp = resp.form.submit('cancel')
assert [x.status for x in formdef.data_class().select()] == [] # discarded
# anonymous user, tracking code, recalled
formdef.enable_tracking_codes = True
formdef.store()
app = get_app(pub)
resp = app.get('/test/')
resp.form['f0'] = 'foobar'
resp = resp.form.submit('submit')
resp = resp.form.submit('previous')
assert [x.status for x in formdef.data_class().select()] == ['draft']
assert 'Cancel' not in resp.text
assert 'Discard' in resp.text
tracking_code = get_displayed_tracking_code(resp)
resp = get_app(pub).get('/')
resp.form['code'] = tracking_code
resp = resp.form.submit().follow().follow().follow()
assert resp.forms[1]['f0'].value == 'foobar'
assert 'Cancel' in resp.text
assert 'Discard Draft' in resp.text
resp = resp.forms[1].submit('cancel')
assert [x.status for x in formdef.data_class().select()] == ['draft']
# logged-in user, no tracking code, recalled
formdef.data_class().wipe()
formdef.enable_tracking_codes = False
formdef.store()
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
resp.form['f0'] = 'foobar'
resp = resp.form.submit('submit')
resp = resp.form.submit('previous')
assert [x.status for x in formdef.data_class().select()] == ['draft']
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
resp = resp.click('Continue with draft').follow()
assert 'Cancel' in resp.text
assert 'Discard Draft' in resp.text
resp = resp.forms[1].submit('cancel')
assert [x.status for x in formdef.data_class().select()] == ['draft']
def test_form_invalid_previous_data(pub):
create_user(pub)
formdef = create_formdef()
formdef.fields = [fields.DateField(id='0', label='date')]
formdef.enable_tracking_codes = True
formdef.store()
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
formdef.data_class().wipe()
tracking_code = get_displayed_tracking_code(resp)
assert tracking_code is not None
resp.forms[0]['f0'] = time.strftime('%Y-%m-%d', time.localtime())
resp = resp.forms[0].submit('submit') # -> validation page
formdef.fields[0].minimum_is_future = True
formdef.store()
# load the formdata as a draft
resp = login(get_app(pub), username='foo', password='foo').get('/')
resp.forms[0]['code'] = tracking_code
resp = resp.forms[0].submit().follow().follow().follow()
assert resp.forms[1]['f0'].value == time.strftime('%Y-%m-%d', time.localtime())
resp = resp.forms[1].submit('submit') # -> submit
assert 'This form has already been submitted.' not in resp.text
assert 'Unexpected field error' in resp.text
def test_form_draft_with_file(pub):
create_user(pub)
formdef = create_formdef()
formdef.fields = [fields.FileField(id='0', label='file')]
formdef.enable_tracking_codes = True
formdef.store()
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
formdef.data_class().wipe()
assert '<h3>Tracking code</h3>' in resp.text
tracking_code = get_displayed_tracking_code(resp)
assert tracking_code is not None
resp.forms[0]['f0$file'] = Upload('test.txt', b'foobar', 'text/plain')
resp = resp.forms[0].submit('submit')
tracking_code_2 = get_displayed_tracking_code(resp)
assert tracking_code == tracking_code_2
# check we can load the formdata as a draft
resp = login(get_app(pub), username='foo', password='foo').get('/')
resp.forms[0]['code'] = tracking_code
resp = resp.forms[0].submit()
resp = resp.follow()
resp = resp.follow()
assert resp.location.startswith('http://example.net/test/?mt=')
resp = resp.follow()
resp = resp.forms[1].submit('previous')
assert resp.pyquery('.filename').text() == 'test.txt'
# check file is downloadable
r2 = resp.click('test.txt')
assert r2.content_type == 'text/plain'
assert r2.text == 'foobar'
# check submitted form keeps the file
resp = resp.forms[1].submit('submit') # -> confirmation page
resp = resp.forms[1].submit('submit') # -> done
resp = resp.follow()
assert resp.click('test.txt').follow().text == 'foobar'
def test_form_draft_with_file_direct_validation(pub):
create_user(pub)
formdef = create_formdef()
formdef.fields = [fields.FileField(id='0', label='file')]
formdef.enable_tracking_codes = True
formdef.store()
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
formdef.data_class().wipe()
tracking_code = get_displayed_tracking_code(resp)
resp.forms[0]['f0$file'] = Upload('test2.txt', b'foobar2', 'text/plain')
resp = resp.forms[0].submit('submit')
resp = login(get_app(pub), username='foo', password='foo').get('/')
resp.forms[0]['code'] = tracking_code
resp = resp.forms[0].submit().follow().follow().follow()
assert 'test2.txt' in resp.text
# check submitted form keeps the file
resp = resp.forms[1].submit('submit') # -> done
resp = resp.follow()
assert resp.click('test2.txt').follow().text == 'foobar2'
def test_form_draft_with_date(pub):
create_user(pub)
formdef = create_formdef()
formdef.fields = [fields.DateField(id='0', label='date')]
formdef.enable_tracking_codes = True
formdef.store()
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
formdef.data_class().wipe()
tracking_code = get_displayed_tracking_code(resp)
resp.forms[0]['f0'] = '2012-02-12'
resp = resp.forms[0].submit('submit')
resp = login(get_app(pub), username='foo', password='foo').get('/')
resp.forms[0]['code'] = tracking_code
resp = resp.forms[0].submit().follow().follow().follow()
assert '2012-02-12' in resp.text
# check submitted form keeps the date
resp = resp.forms[1].submit('submit') # -> done
resp = resp.follow()
assert '2012-02-12' in resp.text
def test_form_draft_save_on_error_page(pub):
create_user(pub)
formdef = create_formdef()
formdef.fields = [
fields.StringField(id='1', label='string1', required=False),
fields.StringField(id='2', label='string2', required=True),
]
formdef.enable_tracking_codes = True
formdef.store()
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
formdef.data_class().wipe()
tracking_code = get_displayed_tracking_code(resp)
resp.forms[0]['f1'] = 'plop'
resp = resp.forms[0].submit('submit')
assert resp.pyquery('#form_error_f2').text() == 'required field'
resp = login(get_app(pub), username='foo', password='foo').get('/')
resp.forms[0]['code'] = tracking_code
resp = resp.forms[0].submit().follow().follow().follow()
assert resp.forms[1]['f1'].value == 'plop'
@pytest.mark.parametrize('tracking_code', [True, False])
def test_form_direct_draft_access(pub, tracking_code):
user = create_user(pub)
formdef = create_formdef()
formdef.fields = [fields.StringField(id='0', label='string')]
formdef.enable_tracking_codes = tracking_code
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'0': 'foobar'}
formdata.status = 'draft'
formdata.store()
resp = get_app(pub).get('/test/%s/' % formdata.id, status=302)
assert resp.location.startswith('http://example.net/login')
formdata.user_id = user.id
formdata.store()
resp = get_app(pub).get('/test/%s/' % formdata.id, status=302)
assert resp.location.startswith('http://example.net/login')
resp = login(get_app(pub), 'foo', 'foo').get('/test/%s/' % formdata.id, status=302)
assert resp.location.startswith('http://example.net/test/?mt=')
formdata.user_id = 1000
formdata.store()
resp = login(get_app(pub), 'foo', 'foo').get('/test/%s/' % formdata.id, status=403)
def test_form_new_table_rows_field_draft_recall(pub):
formdef = create_formdef()
formdef.enable_tracking_codes = True
formdef.fields = [
fields.PageField(id='0', label='1st page'),
fields.StringField(id='1', label='string'),
fields.PageField(id='2', label='2nd page'),
]
formdef.store()
formdef.data_class().wipe()
formdef.store()
app = get_app(pub)
resp = app.get('/test/')
resp.form['f1'] = 'test'
resp = resp.form.submit('submit')
resp = resp.form.submit('submit')
assert 'Check values then click submit.' in resp.text
tracking_code = get_displayed_tracking_code(resp)
assert tracking_code is not None
# add new table rows field to formdef
formdef.fields.append(fields.TableRowsField(id='3', label='table', columns=['a', 'b'], required=False))
formdef.store()
# restore form on validation page
resp = get_app(pub).get('/')
resp.form['code'] = tracking_code
resp = resp.form.submit().follow().follow().follow()
# validate form
resp = resp.forms[1].submit()
resp = resp.follow()
assert 'The form has been recorded' in resp.text
assert formdef.data_class().count() == 1
assert formdef.data_class().select()[0].data['1'] == 'test'
assert formdef.data_class().select()[0].data['3'] is None
def test_form_recall_draft(pub):
user = create_user(pub)
formdef = create_formdef()
formdef.data_class().wipe()
app = login(get_app(pub), username='foo', password='foo')
resp = app.get('/test/')
assert 'You already started to fill this form.' not in resp.text
draft = formdef.data_class()()
draft.user_id = user.id
draft.status = 'draft'
draft.data = {}
draft.store()
app = login(get_app(pub), username='foo', password='foo')
resp = app.get('/test/')
assert 'You already started to fill this form.' in resp.text
assert 'href="%s/"' % draft.id in resp.text
draft2 = formdef.data_class()()
draft2.user_id = user.id
draft2.status = 'draft'
draft2.data = {}
draft2.store()
app = login(get_app(pub), username='foo', password='foo')
resp = app.get('/test/')
assert 'You already started to fill this form.' in resp.text
assert 'href="%s/"' % draft.id in resp.text
assert 'href="%s/"' % draft2.id in resp.text
def test_form_max_drafts(pub):
user = create_user(pub)
formdef = create_formdef()
formdef.fields = [fields.StringField(id='0', label='string')]
formdef.store()
formdef.data_class().wipe()
# create another draft, not linked to user, to check it's not deleted
another_draft = formdef.data_class()()
another_draft.status = 'draft'
another_draft.receipt_time = make_aware(datetime.datetime(2023, 11, 23, 0, 0))
another_draft.store()
drafts = []
for i in range(4):
draft = formdef.data_class()()
draft.user_id = user.id
draft.status = 'draft'
draft.receipt_time = make_aware(datetime.datetime(2023, 11, 23, 0, i))
draft.store()
drafts.append(draft)
app = login(get_app(pub), username='foo', password='foo')
resp = app.get('/test/')
assert resp.pyquery('.drafts-recall a').length == 4
resp.form['f0'] = 'hello'
resp = resp.form.submit('submit')
assert formdef.data_class().count([Equal('status', 'draft')]) == 6
resp = app.get('/test/')
assert resp.pyquery('.drafts-recall a').length == 5
resp.form['f0'] = 'hello2'
resp = resp.form.submit('submit')
assert formdef.data_class().count([Equal('status', 'draft')]) == 6
assert not formdef.data_class().has_key(drafts[0].id) # oldest draft was removed
formdef.drafts_max_per_user = '3'
formdef.store()
resp = app.get('/test/')
resp.form['f0'] = 'hello2'
resp = resp.form.submit('submit')
assert formdef.data_class().count([Equal('status', 'draft')]) == 4
def test_form_draft_temporary_access_url(pub):
FormDef.wipe()
formdef = FormDef()
formdef.enable_tracking_codes = True
formdef.name = 'test'
formdef.fields = [
fields.PageField(id='0', label='1st page'),
fields.StringField(id='1', label='string'),
fields.PageField(id='2', label='2nd page'),
fields.CommentField(
id='3', label='<a href="{% temporary_access_url bypass_checks=True %}">label</a>'
),
]
formdef.store()
resp = get_app(pub).get('/test/')
resp.forms[0]['f1'] = 'foo'
resp = resp.forms[0].submit('submit') # next page
assert '/code/' in resp.pyquery('.comment-field a').attr.href
resp = resp.click('label').follow().follow()
resp = resp.forms[1].submit('previous')
assert resp.forms[1]['f1'].value == 'foo'
def test_form_previous_on_submitted_draft(pub):
FormDef.wipe()
formdef = FormDef()
formdef.name = 'test'
formdef.fields = [
fields.PageField(id='0', label='1st page'),
fields.StringField(id='1', label='string'),
fields.PageField(id='2', label='2nd page'),
fields.StringField(id='3', label='string 2'),
]
formdef.enable_tracking_codes = True
formdef.store()
formdef.data_class().wipe()
app = get_app(pub)
resp = app.get('/test/')
resp.form['f1'] = 'foobar'
resp = resp.form.submit('submit') # -> page 2
resp.form['f3'] = 'foobar2'
resp = resp.form.submit('submit') # -> validation
resp.form.submit('submit').follow() # -> submit
# simulate the user going back and then clicking on previous
resp = resp.form.submit('previous').follow()
assert 'This form has already been submitted.' in resp.text
# again but simulate browser stuck on the validation page while the form
# is being recorded and the magictoken not yet being removed when the user
# clicks the "previous page" button
resp = app.get('/test/')
resp.form['f1'] = 'foobar'
resp = resp.form.submit('submit') # -> page 2
resp.form['f3'] = 'foobar2'
resp = resp.form.submit('submit') # -> validation
with mock.patch('wcs.sql.Session.remove_magictoken') as remove_magictoken:
resp.form.submit('submit').follow() # -> submit
assert remove_magictoken.call_count == 1
resp = resp.form.submit('previous').follow() # -> page 2
assert 'This form has already been submitted.' in resp.text
def test_form_add_row_on_submitted_draft(pub):
FormDef.wipe()
BlockDef.wipe()
block = BlockDef()
block.name = 'foobar'
block.fields = [fields.StringField(id='123', required=True, label='Test1')]
block.store()
formdef = FormDef()
formdef.name = 'test'
formdef.fields = [
fields.PageField(id='0', label='1st page'),
fields.StringField(id='1', label='string'),
fields.PageField(id='2', label='2nd page'),
fields.BlockField(id='3', label='block', block_slug='foobar', max_items=3),
]
formdef.enable_tracking_codes = True
formdef.confirmation = False
formdef.store()
formdef.data_class().wipe()
app = get_app(pub)
resp = app.get('/test/')
resp.form['f1'] = 'foobar'
resp = resp.form.submit('submit') # -> page 2
resp.form['f3$element0$f123'] = 'foo'
with mock.patch('wcs.sql.Session.remove_magictoken') as remove_magictoken:
resp.form.submit('submit').follow() # -> submit
assert remove_magictoken.call_count == 1
# simulate the user going back and then clicking on "add block row" button
resp = resp.form.submit('f3$add_element').follow()
assert 'This form has already been submitted.' in resp.text
def test_nothing_to_update_add_row(pub):
FormDef.wipe()
BlockDef.wipe()
block = BlockDef()
block.name = 'foobar'
block.fields = [fields.StringField(id='123', required=True, label='Test1')]
block.store()
formdef = FormDef()
formdef.name = 'test'
formdef.fields = [
fields.PageField(id='1', label='1st page'),
fields.BlockField(id='2', label='block', block_slug='foobar', max_items=3),
]
formdef.enable_tracking_codes = True
formdef.confirmation = True
formdef.store()
formdef.data_class().wipe()
app = get_app(pub)
resp = app.get('/test/')
resp.form['f2$element0$f123'] = 'foo'
with mock.patch('wcs.sql.SqlDataMixin.store') as sql_data_store:
sql_data_store.side_effect = NothingToUpdate
resp = resp.form.submit('f2$add_element').follow()
assert 'Technical error saving draft, please try again.' in resp.text
def test_draft_store_page_id(pub):
formdef = create_formdef()
formdef.enable_tracking_codes = True
formdef.fields = [
fields.PageField(id='0', label='1st page'),
fields.StringField(id='1', label='string 1'),
fields.PageField(id='2', label='2nd page'),
fields.StringField(id='3', label='string 2'),
fields.PageField(id='4', label='3rd page'),
fields.StringField(id='5', label='string 3'),
]
formdef.store()
first_page_id = formdef.fields[0].id
second_page_id = formdef.fields[2].id
third_page_id = formdef.fields[4].id
formdef.data_class().wipe()
app = get_app(pub)
resp = app.get('/test/')
resp.form['f1'] = 'test'
# autosave
assert app.post('/test/autosave', params=resp.form.submit_fields()).json == {'result': 'success'}
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '0'
assert formdata.page_id == first_page_id
assert formdata.data['1'] == 'test'
assert formdata.data['3'] is None
assert formdata.data['5'] is None
resp = resp.form.submit('submit')
# first page submitted, the draft in on the seconde page
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '1'
assert formdata.page_id == second_page_id
assert formdata.data['1'] == 'test'
assert formdata.data['3'] is None
assert formdata.data['5'] is None
resp.form['f3'] = 'foo'
# autosave
assert app.post('/test/autosave', params=resp.form.submit_fields()).json == {'result': 'success'}
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '1'
assert formdata.page_id == second_page_id
assert formdata.data['1'] == 'test'
assert formdata.data['3'] == 'foo'
assert formdata.data['5'] is None
resp = resp.form.submit('submit')
# second page submitted, the draft in on the third page
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '2'
assert formdata.page_id == third_page_id
assert formdata.data['1'] == 'test'
assert formdata.data['3'] == 'foo'
assert formdata.data['5'] is None
resp.form['f5'] = 'bar'
assert app.post('/test/autosave', params=resp.form.submit_fields()).json == {'result': 'success'}
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '2'
assert formdata.page_id == third_page_id
assert formdata.data['1'] == 'test'
assert formdata.data['3'] == 'foo'
assert formdata.data['5'] == 'bar'
resp = resp.form.submit('submit')
# third page submitted, the draft in on the confirmation page
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '3'
assert formdata.page_id == '_confirmation_page'
assert formdata.data['1'] == 'test'
assert formdata.data['3'] == 'foo'
assert formdata.data['5'] == 'bar'
resp = resp.form.submit('previous')
# back to third page
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '2'
assert formdata.page_id == third_page_id
assert formdata.data['1'] == 'test'
assert formdata.data['3'] == 'foo'
assert formdata.data['5'] == 'bar'
def test_draft_store_page_id_no_confirmation(pub):
formdef = create_formdef()
formdef.enable_tracking_codes = True
formdef.fields = [
fields.PageField(id='0', label='1st page'),
fields.StringField(id='1', label='string 1'),
fields.PageField(id='2', label='2nd page'),
fields.StringField(id='3', label='string 2'),
fields.PageField(id='4', label='3rd page'),
fields.StringField(id='5', label='string 3'),
]
formdef.confirmation = False
formdef.store()
first_page_id = formdef.fields[0].id
second_page_id = formdef.fields[2].id
third_page_id = formdef.fields[4].id
formdef.data_class().wipe()
app = get_app(pub)
resp = app.get('/test/')
resp.form['f1'] = 'test'
# autosave
assert app.post('/test/autosave', params=resp.form.submit_fields()).json == {'result': 'success'}
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '0'
assert formdata.page_id == first_page_id
assert formdata.data['1'] == 'test'
assert formdata.data['3'] is None
assert formdata.data['5'] is None
resp = resp.form.submit('submit')
# first page submitted, the draft in on the seconde page
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '1'
assert formdata.page_id == second_page_id
assert formdata.data['1'] == 'test'
assert formdata.data['3'] is None
assert formdata.data['5'] is None
resp.form['f3'] = 'foo'
# autosave
assert app.post('/test/autosave', params=resp.form.submit_fields()).json == {'result': 'success'}
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '1'
assert formdata.page_id == second_page_id
assert formdata.data['1'] == 'test'
assert formdata.data['3'] == 'foo'
assert formdata.data['5'] is None
resp = resp.form.submit('submit')
# second page submitted, the draft in on the third page
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '2'
assert formdata.page_id == third_page_id
assert formdata.data['1'] == 'test'
assert formdata.data['3'] == 'foo'
assert formdata.data['5'] is None
resp.form['f5'] = 'bar'
assert app.post('/test/autosave', params=resp.form.submit_fields()).json == {'result': 'success'}
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '2'
assert formdata.page_id == third_page_id
assert formdata.data['1'] == 'test'
assert formdata.data['3'] == 'foo'
assert formdata.data['5'] == 'bar'
resp = resp.form.submit('submit')
# third page submitted, no more draft
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'wf-new'
def test_draft_store_page_id_when_no_page(pub):
formdef = create_formdef()
formdef.enable_tracking_codes = True
formdef.fields = [
fields.StringField(id='1', label='string 1'),
fields.StringField(id='2', label='string 2'),
]
formdef.store()
formdef.data_class().wipe()
app = get_app(pub)
resp = app.get('/test/')
resp.form['f1'] = 'test'
resp.form['f2'] = 'bar'
# autosave
assert app.post('/test/autosave', params=resp.form.submit_fields()).json == {'result': 'success'}
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '0'
assert formdata.page_id == '_first_page'
assert formdata.data['1'] == 'test'
assert formdata.data['2'] == 'bar'
resp = resp.form.submit('submit')
# fields submitted, the draft in on the confirmation page
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '1'
assert formdata.page_id == '_confirmation_page'
assert formdata.data['1'] == 'test'
# back to first page
resp = resp.form.submit('previous')
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '0'
assert formdata.page_id == '_first_page'
assert formdata.data['1'] == 'test'
def test_draft_store_page_id_when_no_page_and_no_confirmation(pub):
formdef = create_formdef()
formdef.enable_tracking_codes = True
formdef.fields = [
fields.StringField(id='1', label='string 1'),
fields.StringField(id='2', label='string 2'),
]
formdef.confirmation = False
formdef.store()
formdef.data_class().wipe()
app = get_app(pub)
resp = app.get('/test/')
resp.form['f1'] = 'test'
resp.form['f2'] = 'bar'
# autosave
assert app.post('/test/autosave', params=resp.form.submit_fields()).json == {'result': 'success'}
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'draft'
assert formdata.page_no == '0'
assert formdata.page_id == '_first_page'
assert formdata.data['1'] == 'test'
assert formdata.data['2'] == 'bar'
resp = resp.form.submit('submit')
# fields submitted, no more draft
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'wf-new'