wcs/tests/admin_pages/test_tests.py

1433 lines
44 KiB
Python

import datetime
import os
import pytest
from django.utils.html import escape
from django.utils.timezone import make_aware
from webtest import Upload
from wcs import fields, workflow_tests
from wcs.blocks import BlockDef
from wcs.carddef import CardDef
from wcs.formdef import FormDef
from wcs.qommon.http_request import HTTPRequest
from wcs.qommon.upload_storage import PicklableUpload
from wcs.testdef import TestDef, TestResult, WebserviceResponse
from wcs.workflow_tests import WorkflowTests
from wcs.workflows import Workflow, WorkflowBackofficeFieldsFormDef
from wcs.wscalls import NamedWsCall
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app, login
from .test_all import create_superuser
@pytest.fixture
def pub():
pub = create_temporary_pub()
req = HTTPRequest(None, {'SCRIPT_NAME': '/', 'SERVER_NAME': 'example.net'})
pub.set_app_dir(req)
pub.cfg['identification'] = {'methods': ['password']}
pub.write_cfg()
FormDef.wipe()
TestDef.wipe()
TestResult.wipe()
WorkflowTests.wipe()
WebserviceResponse.wipe()
return pub
def teardown_module(module):
clean_temporary_pub()
def test_tests_page(pub):
user = create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.StringField(id='1', label='Text', varname='text'),
]
formdef.store()
app = login(get_app(pub))
resp = app.get(formdef.get_admin_url())
resp = resp.click('Tests')
assert 'There are no tests yet.' in resp.text
resp = resp.click('New')
resp.form['name'] = 'First test'
resp = resp.form.submit()
testdef = TestDef.select()[0]
assert testdef.agent_id == str(user.id)
resp = resp.follow()
assert 'Edit test data' in resp.text
resp.form['f1'] = 'abcdefg'
resp = resp.form.submit('submit')
assert resp.location == 'http://example.net/backoffice/forms/1/tests/1/'
resp = resp.follow()
assert 'First test' in resp.text
assert 'abcdefg' in resp.text
assert 'This test is empty' not in resp.text
resp = app.get('/backoffice/forms/1/tests/')
assert 'First test' in resp.text
assert 'no tests yet' not in resp.text
resp = resp.click('New')
resp.form['name'] = 'Second test'
# submit but skip redirection to edit page
resp.form.submit()
resp = app.get('/backoffice/forms/1/tests/')
assert 'First test' in resp.text
assert 'Second test' in resp.text
resp = resp.click('Second test')
assert 'This test is empty' in resp.text
# test run with empty test is allowed
app.get('/backoffice/forms/1/tests/results/run').follow()
def test_tests_page_breadcrumb(pub):
create_superuser(pub)
formdef = FormDef()
formdef.name = 'Short title'
formdef.store()
app = login(get_app(pub))
resp = app.get(formdef.get_admin_url() + 'tests/')
assert 'Short title' in resp.text
formdef.name = 'This is a long title'
formdef.store()
resp = app.get(formdef.get_admin_url() + 'tests/')
assert 'This is a long…' in resp.text
def test_tests_page_creation_from_formdata(pub):
user = create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.StringField(id='1', label='Text', varname='text'),
]
formdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/new')
assert 'creation_mode' not in resp.form.fields
assert 'formdata' not in resp.form.fields
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.data['1'] = 'abcdefg'
formdata.user_id = user.id
formdata.store()
resp = app.get('/backoffice/forms/%s/tests/new' % formdef.id)
resp.form['name'] = 'First test'
resp.form['creation_mode'] = 'formdata'
resp.form['formdata'].select(text='1-1 - admin - 2021-01-01 00:00')
resp = resp.form.submit().follow()
assert 'First test' in resp.text
assert 'abcdefg' in resp.text
testdef = TestDef.select()[0]
assert testdef.data['user']['id'] == 1
assert testdef.agent_id == str(user.id)
assert not testdef.is_in_backoffice
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2022, 1, 1, 0, 0))
formdata.data['1'] = 'hijklmn'
formdata.backoffice_submission = True
formdata.store()
resp = app.get('/backoffice/forms/1/tests/new')
resp.form['name'] = 'Second test'
resp.form['creation_mode'] = 'formdata'
resp.form['formdata'].select(text='1-2 - Unknown User - 2022-01-01 00:00')
resp = resp.form.submit().follow()
assert 'Second test' in resp.text
assert 'hijklmn' in resp.text
testdef = TestDef.select()[1]
assert testdef.data['user'] is None
assert testdef.is_in_backoffice
def test_tests_page_deprecated_fields(pub):
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.TableField(id='1', label='Table'),
]
formdef.store()
create_superuser(pub)
app = login(get_app(pub))
resp = app.get(formdef.get_admin_url())
resp = resp.click('Tests')
assert 'Run' not in resp.text
assert 'deprecated fields' in resp.text
def test_tests_import_export(pub):
user = create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [fields.StringField(id='1', varname='test field', label='Test')]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.data['1'] = 'a'
formdata.user_id = user.id
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.workflow_tests.actions = [
workflow_tests.ButtonClick(id='1', button_name='Go to end status'),
workflow_tests.AssertStatus(id='2', status_name='End status'),
]
testdef.name = 'First test'
testdef.store()
response = WebserviceResponse()
response.testdef_id = testdef.id
response.name = 'Response xxx'
response.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
export_resp = resp.click('Export')
assert 'filename=test-first-test.wcs' in export_resp.headers['content-disposition']
resp = resp.click('Delete')
resp = resp.form.submit().follow()
assert 'First test' not in resp.text
assert WorkflowTests.count() == 0
assert WebserviceResponse.count() == 0
resp = resp.click('Import')
resp.form['file'] = Upload('export.wcs', export_resp.body)
resp = resp.form.submit().follow()
assert TestDef.count() == 1
assert WorkflowTests.count() == 1
assert WebserviceResponse.count() == 1
assert 'First test' in resp.text
assert escape('Test "First test" has been successfully imported.') in resp.text
imported_testdef = TestDef.select()[0]
assert imported_testdef.name == testdef.name
assert imported_testdef.data == testdef.data
resp = resp.click('Import')
resp.form['file'] = Upload('export.wcs', export_resp.body)
resp = resp.form.submit().follow()
assert TestDef.count() == 2
assert WorkflowTests.count() == 2
assert WebserviceResponse.count() == 2
assert len(resp.pyquery('li a:contains("First test")')) == 2
assert escape('Test "First test" has been successfully imported.') in resp.text
resp = resp.click('Import')
resp.form['file'] = Upload('export.wcs', b'invalid')
resp = resp.form.submit()
assert 'Invalid File' in resp.text
formdef2 = FormDef()
formdef2.name = 'test title'
formdef2.store()
resp = app.get('/backoffice/forms/%s/tests/' % formdef2.id)
resp = resp.click('Import')
resp.form['file'] = Upload('export.wcs', export_resp.body)
resp = resp.form.submit().follow()
assert len(TestDef.select_for_objectdef(formdef2)) == 1
assert len(resp.pyquery('li a:contains("First test")')) == 1
def test_tests_status_page(pub):
user = create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [fields.StringField(id='1', varname='test_field', label='Test Field')]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.data['1'] = 'This is a test'
formdata.user_id = user.id
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/')
resp = resp.click('First test')
assert 'Test Field' in resp.text
assert 'This is a test' in resp.text
resp = resp.click('Inspect')
resp.form['django-condition'] = 'form_var_test_field == "This is a test"'
resp = resp.form.submit()
assert 'Condition result' in resp.text
assert 'result-true' in resp.text
def test_tests_status_page_block_field(pub):
create_superuser(pub)
block = BlockDef()
block.name = 'foobar'
block.fields = [fields.ItemField(id='1', label='Test item', items=['foo', 'bar', 'baz'])]
block.store()
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.BlockField(id='1', label='Block Data', varname='blockdata', block_slug='foobar', max_items=3),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.data['1'] = {'data': [{'1': 'foo'}]}
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
assert resp.pyquery('div.field-type-block div.field-type-item p.label').text() == 'Test item'
assert resp.pyquery('div.field-type-block div.field-type-item div.value').text() == 'foo'
def test_tests_status_page_image_field(pub):
create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [fields.FileField(id='1', label='File', varname='foo', max_file_size='1ko')]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
upload = PicklableUpload('test.jpeg', 'image/jpeg')
with open(os.path.join(os.path.dirname(__file__), '..', 'image-with-gps-data.jpeg'), 'rb') as jpg:
upload.receive([jpg.read()])
formdata.data['1'] = upload
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
assert 'download?f=1&thumbnail=1' in resp.text
resp = app.get('/backoffice/forms/1/tests/%s/download?f=1&thumbnail=1' % testdef.id)
resp.follow(status=404)
def test_tests_edit(pub):
create_superuser(pub)
user = pub.user_class(name='test user')
user.email = 'test@example.com'
user.store()
new_user = pub.user_class(name='new user')
new_user.email = 'new@example.com'
new_user.store()
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [fields.StringField(id='1', label='Text', varname='text')]
formdef.store()
formdata = formdef.data_class()()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.user_id = user.id
formdata.data = {'1': 'xxx'}
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
assert 'First test' in resp.text
assert 'test user' in resp.text
resp = resp.click('Options')
resp.form['name'] = 'Second test'
resp.form['user'] = new_user.id
resp = resp.form.submit('submit').follow()
assert 'Second test' in resp.text
assert 'new user' in resp.text
resp = resp.click('Options')
resp.form['user'] = ''
resp = resp.form.submit('submit').follow()
assert 'Second test' in resp.text
assert 'new user' not in resp.text
resp = resp.click('Options')
resp.form['user'] = new_user.id
resp = resp.form.submit('submit').follow()
assert 'Second test' in resp.text
assert 'new user' in resp.text
def test_tests_edit_data(pub):
user = create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.PageField(id='0', label='1st page'),
fields.StringField(id='1', label='Text 1', varname='text1'),
fields.PageField(id='2', label='2nd page'),
fields.StringField(id='3', label='Text 2', varname='text2'),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.data['1'] = 'test 1'
formdata.data['3'] = 'test 2'
formdata.user_id = user.id
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
assert 'test 1' in resp.text
assert 'test 2' in resp.text
resp = resp.click('Edit data')
resp.form['f1'] = 'test 3'
resp = resp.form.submit('submit')
assert 'Save data' in resp.text
resp = resp.form.submit('submit').follow() # change nothing on second page
assert 'test 1' not in resp.text
assert 'test 3' in resp.text
assert 'test 2' in resp.text
resp = resp.click('Edit data')
resp.form['f1'] = 'test 4'
resp = resp.form.submit('submit')
resp = resp.form.submit('cancel')
assert resp.location.endswith('/backoffice/forms/1/tests/%s/' % testdef.id)
resp = resp.follow()
assert 'test 4' not in resp.text
assert 'test 3' in resp.text
assert 'test 2' in resp.text
def test_tests_edit_data_mark_as_failing(pub):
create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.PageField(
id='0',
label='1st page',
post_conditions=[
{
'condition': {'type': 'django', 'value': 'form_var_text|length > 5'},
'error_message': 'Not enough chars.',
}
],
),
fields.StringField(id='1', label='Text', varname='text', validation={'type': 'digits'}),
fields.CommentField(id='2', label='comment field'),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.data['1'] = '12345'
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
resp = resp.click('Edit data')
assert 'Mark as failing' not in resp.text
resp.form['f1'] = '123456'
resp = resp.form.submit('submit').follow()
assert '123456' in resp.text
resp = resp.click('Edit data')
assert 'Mark as failing' not in resp.text
# two errors on page
resp.form['f1'] = '123a'
resp = resp.form.submit('submit')
assert 'Mark as failing' not in resp.text
# one error
resp.form['f1'] = '1234'
resp = resp.form.submit('submit')
assert 'If test should fail on error "Not enough chars.", click button below.' in resp.text
assert 'Mark as failing' in resp.text
# other error
resp.forms[0]['f1'] = 'abcdefg'
resp = resp.forms[0].submit('submit')
assert (
'If test should fail on error "You should enter digits only, for example: 123.", click button below.'
in resp.text
)
assert 'Mark as failing' in resp.text
# click mark as failing button
resp = resp.forms[1].submit().follow()
assert 'abcdefg' in resp.text
assert (
escape('This test is expected to fail on error "You should enter digits only, for example: 123.".')
in resp.text
)
resp = resp.click('Edit data')
assert (
'This test is expected to fail on error "You should enter digits only, for example: 123.".'
in resp.text
)
resp.form['f1'] = '1234567'
resp = resp.form.submit('submit').follow()
assert 'This test is expected to fail' not in resp.text
# only post is allowed
app.get('/backoffice/forms/1/tests/%s/edit-data/mark-as-failing' % testdef.id, status=404)
def test_tests_edit_data_mark_as_failing_hidden_error(pub):
create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.StringField(id='0', label='Text', varname='text', validation={'type': 'digits'}),
fields.StringField(
id='1',
label='Text 2',
varname='text2',
validation={'type': 'digits'},
condition={'type': 'django', 'value': 'form_var_text == "a"'},
),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.data['0'] = 'not-digits'
formdata.data['1'] = 'also-not-digits'
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/%s/edit-data/' % testdef.id)
resp = resp.form.submit('submit')
assert (
'If test should fail on error "You should enter digits only, for example: 123.", click button below.'
in resp.text
)
def test_tests_edit_data_mark_as_failing_required_field(pub):
create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.StringField(id='1', label='Text', varname='text'),
fields.StringField(id='2', label='Text 2', varname='text2', validation={'type': 'digits'}),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
resp = resp.click('Edit data')
assert 'Mark as failing' not in resp.text
# required field errors cannot be used to mark test as failing
resp = resp.form.submit('submit')
assert resp.pyquery('#form_error_f1').text() == 'required field'
assert resp.pyquery('#form_error_f2').text() == 'required field'
assert 'Mark as failing' not in resp.text
# mark as failing button can appear even when missing required field
resp.form['f2'] = 'abc'
resp = resp.form.submit('submit')
assert resp.pyquery('#form_error_f1').text() == 'required field'
assert 'Mark as failing' in resp.text
assert (
'If test should fail on error "You should enter digits only, for example: 123.", click button below.'
in resp.text
)
def test_tests_edit_data_is_in_backoffice(pub):
create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.PageField(
id='0',
label='1st page',
post_conditions=[
{
'condition': {'type': 'django', 'value': 'not is_in_backoffice'},
'error_message': 'Must not be in backoffice',
}
],
),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.data['1'] = '12345'
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
resp = resp.click('Edit data')
assert 'Current submission mode is frontoffice.' in resp.text
assert 'Switch to backoffice mode.' in resp.text
resp = resp.form.submit('submit').follow()
resp = resp.click('Edit data')
assert 'Current submission mode is frontoffice.' in resp.text
resp = resp.click('Switch to backoffice mode.').follow()
assert 'Current submission mode is backoffice.' in resp.text
assert 'Switch to frontoffice mode.' in resp.text
resp = resp.form.submit('submit')
assert 'Must not be in backoffice' in resp.text
resp = resp.click('Switch to frontoffice mode.').follow()
assert 'Current submission mode is frontoffice.' in resp.text
resp = resp.form.submit('submit').follow()
# check test passes
resp = app.get('/backoffice/forms/1/tests/results/run').follow()
assert 'Success!' in resp.text
@pytest.mark.parametrize('formdef_class', [FormDef, CardDef])
def test_tests_edit_data_live_url(formdef_class, pub):
create_superuser(pub)
formdef = formdef_class()
formdef.name = 'test title'
formdef.fields = [
fields.StringField(id='1', label='Test', varname='foo'),
fields.StringField(
id='2',
label='Condi',
varname='bar',
required=True,
condition={'type': 'django', 'value': 'form_var_foo == "ok"'},
),
]
formdef.store()
formdef.data_class().wipe()
app = login(get_app(pub))
resp = app.get(formdef.get_admin_url() + 'tests/')
resp = resp.click('New')
resp.form['name'] = 'Test'
resp = resp.form.submit().follow()
resp.form['f1'] = 'ok'
live_url = resp.html.find('form').attrs['data-live-url']
live_resp = app.post(live_url, params=resp.form.submit_fields())
assert live_resp.json['result']['2']['visible'] is True
resp.form['f1'] = 'nok'
live_resp = app.post(live_url, params=resp.form.submit_fields())
assert live_resp.json['result']['2']['visible'] is False
def test_tests_manual_run(pub):
user = create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.StringField(id='1', label='String', varname='string'),
]
formdef.store()
app = login(get_app(pub))
resp = app.get(formdef.get_admin_url() + 'tests/')
resp = resp.click('Test results')
assert 'No test results yet.' in resp.text
assert 'Run tests' not in resp.text
# create test
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.data['1'] = 'a'
formdata.user_id = user.id
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
resp = app.get('/backoffice/forms/1/tests/results/')
assert 'No test results yet.' in resp.text
resp = resp.click('Run tests')
result = TestResult.select()[-1]
assert resp.location == 'http://example.net/backoffice/forms/1/tests/results/%s/' % result.id
resp = resp.follow()
assert 'Started by: Manual run.' in resp.text
assert len(resp.pyquery('tr')) == 1
assert 'Success!' in resp.text
assert 'Display details' not in resp.text
resp = resp.click('First test')
assert 'Edit data' in resp.text
resp = app.get('/backoffice/forms/1/tests/results/')
assert 'No test results yet.' not in resp.text
assert len(resp.pyquery('tr')) == 1
assert len(resp.pyquery('span.test-success')) == 1
assert len(resp.pyquery('span.test-failure')) == 0
# add required field
formdef.fields.append(fields.StringField(id='2', label='String field', varname='string'))
formdef.store()
resp = app.get('/backoffice/forms/1/tests/') # run from test listing page
resp = resp.click('Run tests')
result = TestResult.select()[-1]
assert resp.location == 'http://example.net/backoffice/forms/1/tests/results/%s/' % result.id
resp = app.get('/backoffice/forms/1/tests/results/')
assert len(resp.pyquery('tr')) == 2
assert len(resp.pyquery('span.test-success')) == 2
resp = resp.click('#%s' % result.id)
assert 'Started by: Manual run.' in resp.text
assert 'Success!' in resp.text
resp = resp.click('Display details')
assert 'String field' in resp.text
# add validation to first field
formdef.fields[0].validation = {'type': 'digits'}
formdef.store()
resp = app.get('/backoffice/forms/1/tests/results/')
resp = resp.click('Run tests')
result = TestResult.select()[-1]
assert resp.location == 'http://example.net/backoffice/forms/1/tests/results/%s/' % result.id
resp = app.get('/backoffice/forms/1/tests/results/')
assert len(resp.pyquery('tr')) == 3
assert len(resp.pyquery('span.test-success')) == 2
assert len(resp.pyquery('span.test-failure')) == 1
resp = resp.click('#%s' % result.id)
assert 'Started by: Manual run.' in resp.text
assert 'Success!' not in resp.text
assert 'You should enter digits only, for example: 123.' in resp.text
assert 'disabled' not in resp.text
resp = resp.click('Run tests again')
resp = app.get('/backoffice/forms/1/tests/results/')
assert len(resp.pyquery('tr')) == 4
TestDef.remove_object(testdef.id)
resp = app.get('/backoffice/forms/1/tests/results/%s/' % result.id)
assert 'disabled' in resp.text
# access unknown test result
app.get('/backoffice/forms/1/tests/results/42/', status=404)
def test_tests_result_recorded_errors(pub):
create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.ComputedField(
id='1',
label='Computed',
varname='computed',
value_template='{{ forms|objects:"test-title"|filter_by:"unknown"|filter_value:"xxx"|count }}',
freeze_on_initial_value=True,
),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/results/run').follow()
resp = resp.click('Display details')
assert 'Missing required fields' not in resp.text
assert 'Recorded errors:' in resp.text
assert escape('Invalid filter "unknown"') in resp.text
def test_tests_result_sent_requests(pub, http_requests):
create_superuser(pub)
wscall = NamedWsCall()
wscall.name = 'Hello world'
wscall.request = {'url': 'http://remote.example.net/json'}
wscall.store()
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.PageField(
id='0',
label='1st page',
post_conditions=[
{
'condition': {'type': 'django', 'value': 'form_var_computed_foo == "bar"'},
'error_message': '',
}
],
),
fields.ComputedField(
id='1',
label='Computed',
varname='computed',
value_template='{{ webservice.hello_world }}',
freeze_on_initial_value=True,
),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/results/run').follow()
assert 'Success!' in resp.text
assert http_requests.count() == 1
http_requests.empty()
resp = resp.click('Display details')
assert 'Sent requests:' in resp.text
assert 'GET http://remote.example.net/json' in resp.text
assert 'Used webservice response:' not in resp.text
response = WebserviceResponse()
response.testdef_id = testdef.id
response.name = 'Response xxx'
response.url = 'http://remote.example.net/json'
response.payload = '{"foo": "wrong"}'
response.store()
resp = app.get('/backoffice/forms/1/tests/results/run').follow()
assert 'Success!' not in resp.text
assert http_requests.count() == 0
resp = resp.click('Display details')
result_url = resp.request.url
assert 'Sent requests:' in resp.text
assert 'GET http://remote.example.net/json' in resp.text
assert 'Used webservice response:' in resp.text
resp = resp.click('Response xxx')
assert 'Edit webservice response' in resp.text
response.remove_self()
resp = app.get(result_url)
assert 'Used webservice response:' in resp.text
assert 'Response xxx' not in resp.text
assert 'deleted' in resp.text
wscall.request['method'] = 'POST'
wscall.store()
resp = app.get('/backoffice/forms/1/tests/results/run').follow()
assert 'Success!' not in resp.text
assert http_requests.count() == 0
resp = resp.click('Display details')
assert 'Sent requests:' in resp.text
assert 'POST http://remote.example.net/json' in resp.text
assert 'Request was blocked since it is not a GET request.' in resp.text
assert 'Recorded errors:' in resp.text
assert 'error in HTTP request to remote.example.net (method must be GET)' in resp.text
resp = resp.click('You can create corresponding webservice response here.')
assert 'Webservice responses' in resp.text
def test_tests_result_error_field(pub):
create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.StringField(id='0', label='Text Field', varname='text', validation={'type': 'digits'}),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.data['0'] = 'not-digits'
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/results/run')
result_url = resp.location
resp = resp.follow()
assert escape('Invalid value "not-digits" for field "Text Field"') in resp.text
resp = resp.click('Display details')
assert 'Field linked to error:' in resp.text
assert 'deleted' not in resp.text
resp = resp.click('Text Field')
assert resp.pyquery('h2').text() == 'Text Field'
formdef.fields = []
formdef.store()
resp = app.get(result_url)
resp = resp.click('Display details')
assert 'Text Field' not in resp.text
assert 'deleted' in resp.text
def test_tests_result_inspect(pub):
user = create_superuser(pub)
role = pub.role_class(name='test role')
role.store()
user.roles = [role.id]
user.store()
workflow = Workflow(name='Workflow One')
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
workflow.backoffice_fields_formdef.fields = [
fields.StringField(id='1', label='Text BO', varname='text_bo'),
]
new_status = workflow.add_status(name='New status')
set_backoffice_fields = new_status.add_action('set-backoffice-fields')
set_backoffice_fields.fields = [{'field_id': '1', 'value': 'goodbye'}]
jump = new_status.add_action('choice')
jump.label = 'Loop on status'
jump.status = new_status.id
jump.by = [role.id]
wscall = new_status.add_action('webservice_call')
wscall.url = 'http://example.com/json'
wscall.varname = 'test_webservice'
wscall.qs_data = {'a': 'b'}
workflow.store()
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.StringField(id='0', label='Text Field', varname='text'),
]
formdef.workflow = workflow
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.data['0'] = 'hello'
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.agent_id = user.id
testdef.is_in_backoffice = True
testdef.workflow_tests.actions = [
workflow_tests.ButtonClick(id='1', button_name='Loop on status'),
]
testdef.store()
response = WebserviceResponse()
response.testdef_id = testdef.id
response.name = 'Fake response'
response.url = 'http://example.com/json'
response.payload = '{"foo": "bar"}'
response.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/results/run')
result_url = resp.location
resp = resp.follow()
resp = resp.click('Display inspect')
assert 'form_var_text' in resp.text
assert 'form_var_text_bo' in resp.text
assert 'form_workflow_data_test_webservice_response_foo' in resp.text
assert [x.text_content() for x in resp.pyquery('div#inspect-timeline a')] == [
'New status',
'Backoffice Data',
'Webservice',
'Action button - Manual Jump Loop on status',
'Backoffice Data',
'Webservice',
]
resp.form['django-condition'] = 'form_var_text == "hello"'
resp = resp.form.submit()
assert 'Condition result' in resp.text
assert 'result-true' in resp.text
resp.form['django-condition'] = 'form_var_text_bo == "goodbye"'
resp = resp.form.submit()
assert 'Condition result' in resp.text
assert 'result-true' in resp.text
resp.form['django-condition'] = 'form_submission_backoffice'
resp = resp.form.submit()
assert 'Condition result' in resp.text
assert 'result-true' in resp.text
# check inspect is not accessible for old results
light_test_result = TestResult.select()[-1]
test_result = TestResult.get(light_test_result.id)
del test_result.results[0]['formdata']
test_result.store()
resp = app.get(result_url)
assert 'Display inspect' not in resp.text
def test_tests_run_order(pub):
create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.StringField(id='1', label='String', varname='string', validation={'type': 'digits'})
]
formdef.store()
app = login(get_app(pub))
formdata = formdef.data_class()()
formdata.just_created()
formdata.data['1'] = 'a'
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'Failing test'
testdef.store()
formdata.data['1'] = '1'
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'Passing test'
testdef.store()
resp = app.get('/backoffice/forms/1/tests/results/')
resp = resp.click('Run tests').follow()
assert resp.text.count('Success!') == 1
assert resp.text.count('You should enter digits only, for example: 123.') == 1
assert resp.text.index('Failing test') < resp.text.index('Passing test')
def test_tests_duplicate(pub):
user = create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [fields.StringField(id='1', varname='test field', label='Test')]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.data['1'] = 'abcdefg'
formdata.user_id = user.id
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.workflow_tests.actions = [
workflow_tests.ButtonClick(id='1', button_name='Go to end status'),
workflow_tests.AssertStatus(id='2', status_name='End status'),
]
testdef.store()
response = WebserviceResponse()
response.testdef_id = testdef.id
response.name = 'Response xxx'
response.store()
testdef.workflow_tests.actions.append(
workflow_tests.AssertWebserviceCall(id='3', webservice_response_uuid=response.uuid),
)
testdef.store()
app = login(get_app(pub))
assert TestDef.count() == 1
assert WorkflowTests.count() == 1
assert WebserviceResponse.count() == 1
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
resp = resp.click('Duplicate')
resp = resp.form.submit().follow()
assert 'First test (copy)' in resp.text
assert 'abcdefg' in resp.text
assert TestDef.count() == 2
assert WorkflowTests.count() == 2
assert WebserviceResponse.count() == 2
testdef1, testdef2 = TestDef.select(order_by='id')
testdef1.workflow_tests.actions[0].button_name = 'Changed'
testdef1.store()
response = testdef1.get_webservice_responses()[0]
response.name = 'Changed'
response.store()
testdef1, testdef2 = TestDef.select(order_by='id')
assert testdef1.workflow_tests.actions[0].button_name == 'Changed'
assert testdef2.workflow_tests.actions[0].button_name == 'Go to end status'
assert testdef1.get_webservice_responses()[0].name == 'Changed'
assert testdef2.get_webservice_responses()[0].name == 'Response xxx'
assert testdef1.workflow_tests.actions[2].details_label == 'Changed'
assert testdef2.workflow_tests.actions[2].details_label == 'Response xxx'
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
resp = resp.click('Duplicate')
resp = resp.form.submit().follow()
assert 'First test (copy 2)' in resp.text
assert 'abcdefg' in resp.text
assert TestDef.count() == 3
def test_form_with_test_duplicate(pub):
user = create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [fields.StringField(id='1', varname='test field', label='Test')]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.data['1'] = 'abcdefg'
formdata.user_id = user.id
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/')
resp = resp.click('Duplicate')
resp = resp.form.submit().follow()
assert resp.pyquery('#appbar h2').text() == 'test title (copy)'
def test_tests_page_with_empty_map_field(pub):
create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [fields.MapField(id='1', label='Map', varname='map')]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
formdata.data['1'] = None
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
assert 'First test' in resp.text
def test_tests_card(pub):
create_superuser(pub)
carddef = CardDef()
carddef.name = 'test title'
carddef.fields = [
fields.StringField(id='1', label='Text', varname='text'),
]
carddef.store()
app = login(get_app(pub))
resp = app.get(carddef.get_admin_url())
resp = resp.click('Tests')
assert 'There are no tests yet.' in resp.text
resp = resp.click('New')
resp.form['name'] = 'First test'
resp = resp.form.submit().follow()
assert 'Edit test data' in resp.text
resp.form['f1'] = 'abcdefg'
resp = resp.form.submit('submit')
testdef = TestDef.select()[0]
assert resp.location == 'http://example.net/backoffice/cards/%s/tests/%s/' % (carddef.id, testdef.id)
resp = resp.follow()
assert 'First test' in resp.text
assert 'abcdefg' in resp.text
assert 'This test is empty' not in resp.text
resp = app.get('/backoffice/cards/%s/tests/' % carddef.id)
assert 'First test' in resp.text
assert 'no tests yet' not in resp.text
resp = resp.click('Run tests')
result = TestResult.select()[-1]
assert resp.location == 'http://example.net/backoffice/cards/%s/tests/results/%s/' % (
carddef.id,
result.id,
)
resp = resp.follow()
assert len(resp.pyquery('tr')) == 1
assert 'Success!' in resp.text
resp = app.get('/backoffice/cards/%s/tests/results/' % carddef.id)
assert len(resp.pyquery('span.test-success')) == 1
def test_tests_exclude_self(pub):
create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.PageField(
id='0',
label='1st page',
post_conditions=[
{
'condition': {'type': 'django', 'value': 'form_objects|exclude_self|first'},
'error_message': '',
}
],
),
]
formdef.store()
submitted_formdata = formdef.data_class()()
submitted_formdata.just_created()
submitted_formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
submitted_formdata.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = make_aware(datetime.datetime(2021, 1, 1, 0, 0))
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/new')
resp.form['name'] = 'First test'
resp = resp.form.submit().follow()
assert 'Edit test data' in resp.text
resp = resp.form.submit('submit').follow()
assert 'First test' in resp.text
def test_tests_webservice_response(pub):
create_superuser(pub)
formdef = FormDef()
formdef.name = 'test title'
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.store()
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.name = 'First test'
testdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
resp = resp.click('Webservice response')
assert 'There are no webservice responses yet.' in resp.text
resp = resp.click('New')
resp.form['name'] = 'Test response'
resp = resp.form.submit().follow()
resp = resp.form.submit('submit')
assert resp.pyquery('.error').text() == 'required field required field'
resp = app.get('/backoffice/forms/1/tests/%s/webservice-responses/' % testdef.id)
assert 'Test response' in resp.text
assert 'There are no webservice responses yet.' not in resp.text
assert '(not configured)' in resp.text
resp = resp.click('Test response')
resp.form['url'] = 'http://example.com/'
resp.form['payload'] = '{"a": "b"}'
resp.form['status_code'] = '400'
resp.form['qs_data$element0key'] = 'foo'
resp.form['method'] = 'POST (JSON)'
resp.form['post_data$element0key'] = 'bar'
resp = resp.form.submit('submit').follow()
assert 'Test response' in resp.text
assert '(not configured)' not in resp.text
response = testdef.get_webservice_responses()[0]
assert response.name == 'Test response'
assert response.url == 'http://example.com/'
assert response.payload == '{"a": "b"}'
assert response.status_code == 400
assert response.qs_data == {'foo': ''}
assert response.method == 'POST'
assert response.post_data == {'bar': ''}
resp = resp.click('Duplicate').follow()
assert 'Test response' in resp.text
assert 'not configured' not in resp.text
assert 'Test response (copy)' in resp.text
response = testdef.get_webservice_responses()[1]
assert response.name == 'Test response (copy)'
assert response.url == 'http://example.com/'
assert response.payload == '{"a": "b"}'
resp = resp.click('Remove', href=response.id)
resp = resp.form.submit().follow()
assert 'Test response (copy)' not in resp.text
resp = resp.click('Test response')
resp.form['payload'] = '{"a"}'
resp = resp.form.submit()
assert "Invalid JSON: Expecting ':' delimiter: line 1 column 5 (char 4)" in resp.text
resp.form['url'] = 'xxx'
resp.form['payload'] = '{}'
resp = resp.form.submit()
assert 'must start with http://' in resp.text