1433 lines
44 KiB
Python
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
|