863 lines
26 KiB
Python
863 lines
26 KiB
Python
import datetime
|
|
import os
|
|
|
|
import pytest
|
|
from django.utils.html import escape
|
|
from django.utils.timezone import make_aware
|
|
|
|
from wcs import workflow_tests
|
|
from wcs.formdef import FormDef, fields
|
|
from wcs.qommon.http_request import HTTPRequest
|
|
from wcs.testdef import TestDef, WebserviceResponse
|
|
from wcs.workflows import Workflow, WorkflowBackofficeFieldsFormDef, WorkflowCriticalityLevel
|
|
|
|
from ..utilities import 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()
|
|
|
|
if not pub.site_options.has_section('options'):
|
|
pub.site_options.add_section('options')
|
|
pub.site_options.set('options', 'enable-workflow-tests', 'true')
|
|
with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd:
|
|
pub.site_options.write(fd)
|
|
|
|
FormDef.wipe()
|
|
TestDef.wipe()
|
|
WebserviceResponse.wipe()
|
|
return pub
|
|
|
|
|
|
def test_workflow_tests_link_feature_flag(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)
|
|
assert 'Workflow tests' in resp.text
|
|
|
|
pub.site_options.set('options', 'enable-workflow-tests', 'false')
|
|
with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd:
|
|
pub.site_options.write(fd)
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
|
|
assert 'Workflow tests' not in resp.text
|
|
|
|
|
|
def test_workflow_tests_options(pub):
|
|
create_superuser(pub)
|
|
user = pub.user_class(name='test user')
|
|
user.email = 'test@example.com'
|
|
user.store()
|
|
|
|
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/workflow/' % testdef.id)
|
|
resp = resp.click('Options')
|
|
|
|
resp.form['agent'] = user.id
|
|
resp = resp.form.submit('submit').follow()
|
|
|
|
testdef = TestDef.get(testdef.id)
|
|
assert testdef.agent_id == str(user.id)
|
|
|
|
|
|
def test_workflow_tests_disabled_no_agent(pub):
|
|
user = 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/workflow/' % testdef.id)
|
|
assert 'Backoffice user is not defined, workflow tests will not be executed.' in resp.text
|
|
|
|
resp = resp.click('Open test options')
|
|
resp.form['agent'] = user.id
|
|
resp.form.submit().follow()
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert 'Backoffice user is not defined' not in resp.text
|
|
assert 'Open test options' not in resp.text
|
|
|
|
|
|
def test_workflow_tests_edit_actions(pub):
|
|
user = 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.agent_id = user.id
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
|
|
resp = resp.click('Workflow tests')
|
|
|
|
assert 'There are no workflow test actions yet.' in resp.text
|
|
assert len(resp.pyquery('.biglist li')) == 0
|
|
|
|
option_labels = [x[2] for x in resp.form['type'].options]
|
|
assert (
|
|
option_labels.index('Assert email is sent')
|
|
< option_labels.index('Assert form status')
|
|
< option_labels.index('—')
|
|
< option_labels.index('Move forward in time')
|
|
< option_labels.index('Simulate click on action button')
|
|
)
|
|
|
|
# add workflow test action through sidebar form
|
|
resp.form['type'] = 'button-click'
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert 'There are no workflow test actions yet.' not in resp.text
|
|
assert len(resp.pyquery('.biglist li')) == 1
|
|
assert resp.pyquery('.biglist li .label').text() == 'Simulate click on action button'
|
|
assert 'not configured' in resp.text
|
|
|
|
resp = resp.click('Edit')
|
|
resp.form['button_name'] = 'Accept'
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert 'not configured' not in resp.text
|
|
assert resp.text.count(escape('Click on "Accept"')) == 1
|
|
|
|
resp = resp.click('Duplicate').follow()
|
|
assert resp.text.count(escape('Click on "Accept"')) == 2
|
|
|
|
resp = resp.click('Edit', index=0)
|
|
resp.form['button_name'] = 'Reject'
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert resp.text.count(escape('Click on "Accept"')) == 1
|
|
assert resp.text.count(escape('Click on "Reject"')) == 1
|
|
|
|
resp = resp.click('Delete', index=0)
|
|
resp = resp.form.submit().follow()
|
|
assert resp.text.count(escape('Click on "Accept"')) == 1
|
|
assert resp.text.count(escape('Click on "Reject"')) == 0
|
|
|
|
# simulate invalid action
|
|
testdef = TestDef.get(testdef.id)
|
|
testdef.workflow_tests.actions[0].key = 'xxx'
|
|
testdef.store()
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert 'There are no workflow test actions yet.' in resp.text
|
|
|
|
|
|
def test_workflow_tests_action_button_click(pub):
|
|
create_superuser(pub)
|
|
user = pub.user_class(name='test user')
|
|
user.store()
|
|
|
|
workflow = Workflow(name='Workflow One')
|
|
new_status = workflow.add_status(name='New status')
|
|
workflow.store()
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'test title'
|
|
formdef.workflow_id = workflow.id
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.ButtonClick(id='1', button_name='Button 4'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert escape('Click on "Button 4" by backoffice user') in resp.text
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
|
|
assert 'Workflow has no action that displays a button.' in resp.text
|
|
|
|
jump = new_status.add_action('choice')
|
|
jump.label = 'Button 1'
|
|
jump.status = new_status.id
|
|
|
|
jump = new_status.add_action('choice')
|
|
jump.label = 'Button 2'
|
|
jump.status = new_status.id
|
|
|
|
jump = new_status.add_action('choice')
|
|
jump.label = 'Button no target status'
|
|
|
|
workflow.add_global_action('Action 1')
|
|
|
|
interactive_action = workflow.add_global_action('Interactive action (should not be shown)')
|
|
interactive_action.add_action('form')
|
|
|
|
workflow.store()
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
|
|
assert resp.form['button_name'].options == [
|
|
('Action 1', False, 'Action 1'),
|
|
('Button 1', False, 'Button 1'),
|
|
('Button 2', False, 'Button 2'),
|
|
('Button 4 (not available)', True, 'Button 4 (not available)'),
|
|
]
|
|
|
|
resp.form['button_name'] = 'Button 1'
|
|
resp.form['who'] = 'submitter'
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert escape('Click on "Button 1" by submitter') in resp.text
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
|
|
resp.form['who'] = 'other'
|
|
resp.form['who_id'].force_value(user.id)
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert escape('Click on "Button 1" by test user') in resp.text
|
|
|
|
user.remove_self()
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert escape('Click on "Button 1" by missing user') in resp.text
|
|
|
|
|
|
def test_workflow_tests_action_assert_status(pub):
|
|
create_superuser(pub)
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'test title'
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.AssertStatus(id='1', status_name='Deleted status'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
|
|
|
|
assert resp.form['status_name'].options == [
|
|
('Just Submitted', False, 'Just Submitted'),
|
|
('New', False, 'New'),
|
|
('Rejected', False, 'Rejected'),
|
|
('Accepted', False, 'Accepted'),
|
|
('Finished', False, 'Finished'),
|
|
('Deleted status (not available)', False, 'Deleted status (not available)'),
|
|
]
|
|
|
|
|
|
def test_workflow_tests_action_skip_time(pub):
|
|
create_superuser(pub)
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'test title'
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.SkipTime(id='1'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
|
|
|
|
resp.form['seconds'] = '1 day 1 hour 1 minute'
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert TestDef.get(testdef.id).workflow_tests.actions[0].seconds == 25 * 60 * 60 + 60
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
|
|
assert resp.form['seconds'].value == '1 day, 1 hour and 1 minute'
|
|
|
|
resp = resp.form.submit().follow()
|
|
assert TestDef.get(testdef.id).workflow_tests.actions[0].seconds == 25 * 60 * 60 + 60
|
|
|
|
|
|
def test_workflow_tests_action_assert_email(pub):
|
|
create_superuser(pub)
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'test title'
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.AssertEmail(id='1'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert 'not configured' not in resp.text
|
|
assert 'Email to' not in resp.text
|
|
|
|
# empty configuration is allowed
|
|
resp = resp.click('Edit')
|
|
resp = resp.form.submit().follow()
|
|
|
|
resp = resp.click('Edit')
|
|
resp.form['subject_strings$element0'] = 'abc'
|
|
resp.form['body_strings$element0'] = 'def'
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert 'Email to' not in resp.text
|
|
|
|
assert_email = TestDef.get(testdef.id).workflow_tests.actions[0]
|
|
assert assert_email.subject_strings == ['abc']
|
|
assert assert_email.body_strings == ['def']
|
|
|
|
resp = resp.click('Edit')
|
|
resp.form['addresses$element0'] = 'test@entrouvert.com'
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert escape('Email to "test@entrouvert.com"') in resp.text
|
|
|
|
assert_email.addresses = ['a@entrouvert.com', 'b@entrouvert.com', 'c@entrouvert.com']
|
|
assert_email.parent.store()
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert escape('Email to "a@entrouvert.com" (+2)') in resp.text
|
|
|
|
|
|
def test_workflow_tests_action_assert_sms(pub):
|
|
create_superuser(pub)
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'test title'
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.AssertSMS(id='1'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert 'not configured' not in resp.text
|
|
assert 'SMS to' not in resp.text
|
|
|
|
# empty configuration is allowed
|
|
resp = resp.click('Edit')
|
|
resp = resp.form.submit().follow()
|
|
|
|
resp = resp.click('Edit')
|
|
resp.form['phone_numbers$element0'] = '0123456789'
|
|
resp.form['body'] = 'Hello'
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert 'SMS to 0123456789' in resp.text
|
|
|
|
assert_sms = TestDef.get(testdef.id).workflow_tests.actions[0]
|
|
assert assert_sms.phone_numbers == ['0123456789']
|
|
assert assert_sms.body == 'Hello'
|
|
|
|
assert_sms.phone_numbers = ['0123456789', '0123456781', '0123456782']
|
|
assert_sms.parent.store()
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert escape('SMS to 0123456789 (+2)') in resp.text
|
|
|
|
|
|
def test_workflow_tests_action_assert_anonymise(pub):
|
|
create_superuser(pub)
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'test title'
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.AssertAnonymise(id='1'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert 'Edit' not in resp.text
|
|
|
|
|
|
def test_workflow_tests_action_assert_redirect(pub):
|
|
create_superuser(pub)
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'test title'
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.AssertRedirect(id='1'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert 'not configured' in resp.text
|
|
|
|
resp = resp.click('Edit')
|
|
resp.form['url'] = 'http://example.com'
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert 'not configured' not in resp.text
|
|
assert 'http://example.com' in resp.text
|
|
|
|
|
|
def test_workflow_tests_action_assert_history_message(pub):
|
|
create_superuser(pub)
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'test title'
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.AssertHistoryMessage(id='1'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert 'not configured' in resp.text
|
|
|
|
resp = resp.click('Edit')
|
|
resp.form['message'] = 'Hello'
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert 'not configured' not in resp.text
|
|
|
|
|
|
def test_workflow_tests_action_assert_alert(pub):
|
|
create_superuser(pub)
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'test title'
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.AssertAlert(id='1'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert 'not configured' in resp.text
|
|
|
|
resp = resp.click('Edit')
|
|
resp.form['message'] = 'Hello'
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert 'not configured' not in resp.text
|
|
|
|
|
|
def test_workflow_tests_action_assert_criticality(pub):
|
|
create_superuser(pub)
|
|
|
|
workflow = Workflow(name='Workflow One')
|
|
workflow.add_status(name='New status')
|
|
workflow.store()
|
|
|
|
formdef = FormDef()
|
|
formdef.workflow_id = workflow.id
|
|
formdef.name = 'test title'
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.AssertCriticality(id='1'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
assert 'not configured' in resp.text
|
|
|
|
resp = resp.click('Edit')
|
|
assert 'Workflow has no criticality levels.' in resp.text
|
|
|
|
workflow.criticality_levels = [
|
|
WorkflowCriticalityLevel(name='green'),
|
|
WorkflowCriticalityLevel(name='red'),
|
|
]
|
|
workflow.store()
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
|
|
resp.form['level_id'].select(text='green')
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert 'not configured' not in resp.text
|
|
assert escape('Criticality is "green"') in resp.text
|
|
|
|
|
|
def test_workflow_tests_action_assert_backoffice_field(pub):
|
|
create_superuser(pub)
|
|
|
|
workflow = Workflow(name='Workflow One')
|
|
workflow.add_status(name='New status')
|
|
|
|
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
|
|
workflow.backoffice_fields_formdef.fields = [
|
|
fields.StringField(id='bo1', label='Text'),
|
|
fields.StringField(id='bo2', label='Text 2'),
|
|
]
|
|
workflow.store()
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'test title'
|
|
formdef.workflow = workflow
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.AssertBackofficeFieldValues(id='1'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
|
|
assert resp.form['fields$element0$field_id'].options == [
|
|
('', False, ''),
|
|
('bo1', False, 'Text - Text (line)'),
|
|
('bo2', False, 'Text 2 - Text (line)'),
|
|
]
|
|
|
|
resp.form['fields$element0$field_id'] = 'bo2'
|
|
resp.form['fields$element0$value'] = 'xxx'
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert_bakoffice_field_values = TestDef.get(testdef.id).workflow_tests.actions[0]
|
|
assert assert_bakoffice_field_values.fields == [
|
|
{'field_id': 'bo2', 'value': 'xxx'},
|
|
]
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
|
|
assert resp.form['fields$element0$field_id'].value == 'bo2'
|
|
assert resp.form['fields$element0$value'].value == 'xxx'
|
|
|
|
|
|
def test_workflow_tests_action_assert_webservice_call(pub):
|
|
create_superuser(pub)
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'test title'
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.AssertWebserviceCall(id='1'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
|
|
assert 'you must define corresponding webservice response' in resp.text
|
|
|
|
resp = resp.click('Add webservice response')
|
|
assert 'There are no webservice responses yet.' in resp.text
|
|
|
|
response = WebserviceResponse()
|
|
response.testdef_id = testdef.id
|
|
response.name = 'Fake response'
|
|
response.store()
|
|
|
|
response2 = WebserviceResponse()
|
|
response2.testdef_id = testdef.id
|
|
response2.name = 'Fake response 2'
|
|
response2.store()
|
|
|
|
response3 = WebserviceResponse()
|
|
response3.testdef_id = testdef.id + 1
|
|
response3.name = 'Other response'
|
|
response3.store()
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
|
|
assert resp.form['webservice_response_uuid'].options == [
|
|
(str(response.uuid), False, 'Fake response'),
|
|
(str(response2.uuid), False, 'Fake response 2'),
|
|
]
|
|
assert resp.form['call_count'].value == '1'
|
|
|
|
resp.form['webservice_response_uuid'] = response.uuid
|
|
resp.form['call_count'] = 2
|
|
resp = resp.form.submit().follow()
|
|
|
|
assert 'Fake response' in resp.text
|
|
assert 'Broken' not in resp.text
|
|
|
|
assert_webservice_call = TestDef.get(testdef.id).workflow_tests.actions[0]
|
|
assert assert_webservice_call.webservice_response_uuid == response.uuid
|
|
assert assert_webservice_call.call_count == 2
|
|
|
|
response.remove_self()
|
|
resp = app.get('/backoffice/forms/1/tests/%s/workflow/' % testdef.id)
|
|
|
|
assert 'Broken, missing webservice response' in resp.text
|
|
assert 'Fake response' not in resp.text
|
|
|
|
|
|
def test_workflow_tests_actions_reorder(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.workflow_tests.actions = [
|
|
workflow_tests.ButtonClick(id='0', button_name='First'),
|
|
workflow_tests.ButtonClick(id='1', button_name='Second'),
|
|
workflow_tests.ButtonClick(id='2', button_name='Third'),
|
|
workflow_tests.ButtonClick(id='3', button_name='Fourth'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
url = '/backoffice/forms/%s/tests/%s/workflow/update_order' % (formdef.id, testdef.id)
|
|
|
|
# missing element in params: do nothing
|
|
resp = app.get(url + '?order=0;3;1;2;')
|
|
assert resp.json == {'success': 'ko'}
|
|
|
|
# missing order in params: do nothing
|
|
resp = app.get(url + '?element=0')
|
|
assert resp.json == {'success': 'ko'}
|
|
|
|
resp = app.get(url + '?order=0;3;1;2;&element=3')
|
|
assert resp.json == {'success': 'ok'}
|
|
testdef = TestDef.get(testdef.id)
|
|
assert [x.id for x in testdef.workflow_tests.actions] == ['0', '3', '1', '2']
|
|
|
|
# unknown id: ignored
|
|
resp = app.get(url + '?order=0;1;2;3;4;&element=3')
|
|
assert resp.json == {'success': 'ok'}
|
|
testdef = TestDef.get(testdef.id)
|
|
assert [x.id for x in testdef.workflow_tests.actions] == ['0', '1', '2', '3']
|
|
|
|
# missing id: do nothing
|
|
resp = app.get(url + '?order=0;3;1;&element=3')
|
|
assert resp.json == {'success': 'ko'}
|
|
testdef = TestDef.get(testdef.id)
|
|
assert [x.id for x in testdef.workflow_tests.actions] == ['0', '1', '2', '3']
|
|
|
|
|
|
def test_workflow_tests_run(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')
|
|
new_status = workflow.add_status(name='New status')
|
|
|
|
sendmail = new_status.add_action('sendmail')
|
|
sendmail.to = ['test@example.org']
|
|
sendmail.subject = 'Hello'
|
|
sendmail.body = 'abc'
|
|
|
|
jump = new_status.add_action('choice')
|
|
jump.label = 'Loop on status'
|
|
jump.status = new_status.id
|
|
jump.by = [role.id]
|
|
|
|
workflow.store()
|
|
|
|
formdef = FormDef()
|
|
formdef.name = 'test title'
|
|
formdef.workflow_id = workflow.id
|
|
formdef.store()
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
|
|
testdef = TestDef.create_from_formdata(formdef, formdata)
|
|
testdef.agent_id = user.id
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.ButtonClick(id='1', button_name='Loop on status'),
|
|
]
|
|
testdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/results/')
|
|
resp = resp.click('Run tests').follow()
|
|
|
|
assert len(resp.pyquery('tr')) == 1
|
|
assert 'Success!' in resp.text
|
|
|
|
# change button label
|
|
jump.label = 'xxx'
|
|
workflow.store()
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/results/')
|
|
resp = resp.click('Run tests').follow()
|
|
|
|
assert escape('Workflow error: Button "Loop on status" is not displayed.') in resp.text
|
|
|
|
resp = resp.click('Display details')
|
|
|
|
assert 'Form status when error occured: New status' in resp.text
|
|
assert resp.pyquery('li#test-action').text() == 'Test action: Simulate click on action button'
|
|
assert (
|
|
resp.pyquery('li#test-action a').attr('href')
|
|
== 'http://example.net/backoffice/forms/1/tests/%s/workflow/#1' % testdef.id
|
|
)
|
|
|
|
testdef.workflow_tests.actions = []
|
|
testdef.store()
|
|
|
|
resp = app.get(resp.request.url)
|
|
assert 'Form status when error occured: New status' in resp.text
|
|
assert resp.pyquery('li#test-action').text() == 'Test action: deleted'
|
|
|
|
testdef.workflow_tests.actions = [
|
|
workflow_tests.AssertEmail(id='1', body_strings=['def']),
|
|
]
|
|
testdef.store()
|
|
|
|
resp = app.get('/backoffice/forms/1/tests/results/')
|
|
resp = resp.click('Run tests').follow()
|
|
assert escape('Email body does not contain "def".') in resp.text
|
|
|
|
resp = resp.click('Display details')
|
|
assert 'Form status when error occured: New status' in resp.text
|
|
assert 'Email body: \nabc' in resp.text
|
|
assert resp.pyquery('li#test-action').text() == 'Test action: Assert email is sent'
|
|
|
|
|
|
def test_workfow_tests_creation_from_formdata(pub):
|
|
create_superuser(pub)
|
|
|
|
workflow = Workflow(name='Workflow One')
|
|
new_status = workflow.add_status(name='New status')
|
|
end_status = workflow.add_status(name='End status')
|
|
|
|
jump = new_status.add_action('jump')
|
|
jump.status = end_status.id
|
|
|
|
workflow.store()
|
|
|
|
formdef = FormDef()
|
|
formdef.workflow_id = workflow.id
|
|
formdef.name = 'test title'
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
|
|
formdata = formdef.data_class()()
|
|
formdata.just_created()
|
|
formdata.receipt_time = make_aware(datetime.datetime(2022, 1, 1, 0, 0))
|
|
formdata.store()
|
|
formdata.perform_workflow()
|
|
formdata.store()
|
|
|
|
resp = app.get('/backoffice/forms/%s/tests/new' % formdef.id)
|
|
resp.form['name'] = 'First test'
|
|
resp.form['creation_mode'] = 'formdata-wf'
|
|
resp.form['formdata'].select(text='1-1 - Unknown User - 2022-01-01 00:00')
|
|
resp = resp.form.submit().follow()
|
|
|
|
testdef = TestDef.select()[0]
|
|
assert len(testdef.workflow_tests.actions) == 1
|
|
assert testdef.workflow_tests.actions[0].key == 'assert-status'
|
|
assert testdef.workflow_tests.actions[0].status_name == 'End status'
|