workflow_tests: allow testing anonymise workflow action (#88108)

This commit is contained in:
Valentin Deniaud 2024-03-13 14:33:43 +01:00
parent c0d2d36b3c
commit 03669bb847
5 changed files with 104 additions and 4 deletions

View File

@ -418,6 +418,28 @@ def test_workflow_tests_action_assert_sms(pub):
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_backoffice_field(pub):
create_superuser(pub)

View File

@ -603,6 +603,51 @@ def test_workflow_tests_sms(pub):
assert 'SMS body: "Hello"' in excinfo.value.details
def test_workflow_tests_anonymise(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.agent_id = user.id
testdef.workflow_tests.actions = [
workflow_tests.AssertAnonymise(),
]
with pytest.raises(WorkflowTestError) as excinfo:
testdef.run(formdef)
assert str(excinfo.value) == 'Form was not anonymised.'
anonymise_action = new_status.add_action('anonymise')
workflow.store()
formdef.refresh_from_storage()
testdef.run(formdef)
anonymise_action.mode = 'intermediate'
workflow.store()
formdef.refresh_from_storage()
testdef.run(formdef)
anonymise_action.mode = 'unlink_user'
workflow.store()
formdef.refresh_from_storage()
testdef.run(formdef)
def test_workflow_tests_backoffice_fields(pub):
user = pub.user_class(name='test user')
user.store()
@ -864,6 +909,9 @@ def test_workflow_tests_create_from_formdata(pub, http_requests, freezer):
sendsms.to = ['0123456789']
sendsms.body = 'Hello'
anonymise_action = transition_status.add_action('anonymise')
anonymise_action.mode = 'intermediate'
jump = transition_status.add_action('jump')
jump.status = end_status.id
@ -896,7 +944,7 @@ def test_workflow_tests_create_from_formdata(pub, http_requests, freezer):
testdef.run(formdef)
actions = testdef.workflow_tests.actions
assert len(actions) == 9
assert len(actions) == 10
assert actions[0].key == 'assert-status'
assert actions[0].status_name == 'Status with timeout jump'
@ -914,6 +962,7 @@ def test_workflow_tests_create_from_formdata(pub, http_requests, freezer):
assert actions[5].key == 'assert-email'
assert actions[6].key == 'assert-backoffice-field'
assert actions[7].key == 'assert-sms'
assert actions[8].key == 'assert-anonymise'
assert actions[-1].key == 'assert-status'
assert actions[-1].status_name == 'End status'

View File

@ -31,9 +31,11 @@
</span>
</span>
<p class="commands">
<span class="edit">
<a href="{{ action.id }}/" rel="popup" title="{% trans "Edit" %}">{% trans "Edit" %}</a>
</span>
{% if action.editable %}
<span class="edit">
<a href="{{ action.id }}/" rel="popup" title="{% trans "Edit" %}">{% trans "Edit" %}</a>
</span>
{% endif %}
<span class="duplicate">
<a href="{{ action.id }}/duplicate" title="{% trans "Duplicate" %}">{% trans "Duplicate" %}</a>
</span>

View File

@ -82,5 +82,15 @@ class AnonymiseWorkflowStatusItem(WorkflowStatusItem):
default_value=self.__class__.mode,
)
def get_workflow_test_action(self, formdata, *args, **kwargs):
original_perform = self.perform
def perform(formdata):
original_perform(formdata)
formdata.anonymisation_performed = True
setattr(self, 'perform', perform)
return self
register_item_class(AnonymiseWorkflowStatusItem)

View File

@ -93,6 +93,7 @@ class WorkflowTests(XmlStorableObject):
formdata.sent_sms = []
formdata.sent_emails = []
formdata.used_webservice_responses = self.testdef.used_webservice_responses = []
formdata.anonymisation_performed = False
formdata.perform_workflow()
for action in self.actions:
@ -105,6 +106,7 @@ class WorkflowTests(XmlStorableObject):
formdata.sent_sms.clear()
formdata.sent_emails.clear()
formdata.used_webservice_responses.clear()
formdata.anonymisation_performed = False
try:
action.perform(formdata)
@ -146,6 +148,7 @@ class WorkflowTests(XmlStorableObject):
'set-backoffice-fields': AssertBackofficeFieldValues,
'button': ButtonClick,
'timeout-jump': SkipTime,
'anonymise': AssertAnonymise,
}
previous_trace = None
@ -196,6 +199,7 @@ class WorkflowTestAction(XmlStorableObject):
optional_fields = []
is_assertion = True
editable = True
XML_NODES = [
('id', 'str'),
@ -760,3 +764,16 @@ class AssertSMS(WorkflowTestAction):
title=_('Body'),
value=self.body,
)
class AssertAnonymise(WorkflowTestAction):
label = _('Assert anonymisation is performed')
key = 'assert-anonymise'
editable = False
details_label = ''
def perform(self, formdata):
if not formdata.anonymisation_performed:
raise WorkflowTestError(_('Form was not anonymised.'))