workflow_tests: preserve response of webservice assertion on test duplication (#88729)
gitea/wcs/pipeline/head This commit looks good Details

This commit is contained in:
Valentin Deniaud 2024-03-27 10:33:56 +01:00
parent d0358afa40
commit dc473b7378
5 changed files with 44 additions and 24 deletions

View File

@ -1167,6 +1167,11 @@ def test_tests_duplicate(pub):
response.name = 'Response xxx' response.name = 'Response xxx'
response.store() response.store()
testdef.workflow_tests.actions.append(
workflow_tests.AssertWebserviceCall(id='3', webservice_response_uuid=response.uuid),
)
testdef.store()
app = login(get_app(pub)) app = login(get_app(pub))
assert TestDef.count() == 1 assert TestDef.count() == 1
@ -1196,6 +1201,8 @@ def test_tests_duplicate(pub):
assert testdef2.workflow_tests.actions[0].button_name == 'Go to end status' assert testdef2.workflow_tests.actions[0].button_name == 'Go to end status'
assert testdef1.get_webservice_responses()[0].name == 'Changed' assert testdef1.get_webservice_responses()[0].name == 'Changed'
assert testdef2.get_webservice_responses()[0].name == 'Response xxx' 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 = app.get('/backoffice/forms/1/tests/%s/' % testdef.id)
resp = resp.click('Duplicate') resp = resp.click('Duplicate')

View File

@ -664,13 +664,13 @@ def test_workflow_tests_action_assert_webservice_call(pub):
response3.store() response3.store()
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id) resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
assert resp.form['webservice_response_id'].options == [ assert resp.form['webservice_response_uuid'].options == [
(str(response.id), False, 'Fake response'), (str(response.uuid), False, 'Fake response'),
(str(response2.id), False, 'Fake response 2'), (str(response2.uuid), False, 'Fake response 2'),
] ]
assert resp.form['call_count'].value == '1' assert resp.form['call_count'].value == '1'
resp.form['webservice_response_id'] = 1 resp.form['webservice_response_uuid'] = response.uuid
resp.form['call_count'] = 2 resp.form['call_count'] = 2
resp = resp.form.submit().follow() resp = resp.form.submit().follow()
@ -678,7 +678,7 @@ def test_workflow_tests_action_assert_webservice_call(pub):
assert 'Broken' not in resp.text assert 'Broken' not in resp.text
assert_webservice_call = TestDef.get(testdef.id).workflow_tests.actions[0] assert_webservice_call = TestDef.get(testdef.id).workflow_tests.actions[0]
assert assert_webservice_call.webservice_response_id == '1' assert assert_webservice_call.webservice_response_uuid == response.uuid
assert assert_webservice_call.call_count == 2 assert assert_webservice_call.call_count == 2
response.remove_self() response.remove_self()

View File

@ -989,7 +989,7 @@ def test_workflow_tests_webservice(pub):
testdef.workflow_tests.actions = [ testdef.workflow_tests.actions = [
workflow_tests.AssertStatus(status_name='End status'), workflow_tests.AssertStatus(status_name='End status'),
workflow_tests.AssertWebserviceCall(webservice_response_id=response.id, call_count=1), workflow_tests.AssertWebserviceCall(webservice_response_uuid=response.uuid, call_count=1),
] ]
with pytest.raises(WorkflowTestError) as excinfo: with pytest.raises(WorkflowTestError) as excinfo:
@ -1004,7 +1004,7 @@ def test_workflow_tests_webservice(pub):
assert str(excinfo.value) == 'Webservice response Fake response was used 2 times (instead of 1).' assert str(excinfo.value) == 'Webservice response Fake response was used 2 times (instead of 1).'
testdef.workflow_tests.actions = [ testdef.workflow_tests.actions = [
workflow_tests.AssertWebserviceCall(webservice_response_id=response.id, call_count=2), workflow_tests.AssertWebserviceCall(webservice_response_uuid=response.uuid, call_count=2),
] ]
testdef.run(formdef) testdef.run(formdef)
@ -1021,8 +1021,8 @@ def test_workflow_tests_webservice(pub):
response2.store() response2.store()
testdef.workflow_tests.actions = [ testdef.workflow_tests.actions = [
workflow_tests.AssertWebserviceCall(webservice_response_id=response.id, call_count=1), workflow_tests.AssertWebserviceCall(webservice_response_uuid=response.uuid, call_count=1),
workflow_tests.AssertWebserviceCall(webservice_response_id=response2.id, call_count=1), workflow_tests.AssertWebserviceCall(webservice_response_uuid=response2.uuid, call_count=1),
] ]
testdef.run(formdef) testdef.run(formdef)
@ -1032,8 +1032,8 @@ def test_workflow_tests_webservice(pub):
testdef.run(formdef) testdef.run(formdef)
testdef.workflow_tests.actions = [ testdef.workflow_tests.actions = [
workflow_tests.AssertWebserviceCall(webservice_response_id=response.id, call_count=1), workflow_tests.AssertWebserviceCall(webservice_response_uuid=response.uuid, call_count=1),
workflow_tests.AssertWebserviceCall(webservice_response_id=response.id, call_count=1), workflow_tests.AssertWebserviceCall(webservice_response_uuid=response.uuid, call_count=1),
] ]
with pytest.raises(WorkflowTestError) as excinfo: with pytest.raises(WorkflowTestError) as excinfo:
@ -1041,7 +1041,7 @@ def test_workflow_tests_webservice(pub):
assert str(excinfo.value) == 'Webservice response Fake response was used 0 times (instead of 1).' assert str(excinfo.value) == 'Webservice response Fake response was used 0 times (instead of 1).'
testdef.workflow_tests.actions = [ testdef.workflow_tests.actions = [
workflow_tests.AssertWebserviceCall(webservice_response_id=response.id, call_count=0), workflow_tests.AssertWebserviceCall(webservice_response_uuid=response.uuid, call_count=0),
] ]
with pytest.raises(WorkflowTestError) as excinfo: with pytest.raises(WorkflowTestError) as excinfo:
@ -1049,7 +1049,7 @@ def test_workflow_tests_webservice(pub):
assert str(excinfo.value) == 'Webservice response Fake response was used 1 times (instead of 0).' assert str(excinfo.value) == 'Webservice response Fake response was used 1 times (instead of 0).'
testdef.workflow_tests.actions = [ testdef.workflow_tests.actions = [
workflow_tests.AssertWebserviceCall(webservice_response_id='xxx', call_count=1), workflow_tests.AssertWebserviceCall(webservice_response_uuid='xxx', call_count=1),
] ]
with pytest.raises(WorkflowTestError) as excinfo: with pytest.raises(WorkflowTestError) as excinfo:

View File

@ -21,6 +21,7 @@ import io
import json import json
import socket import socket
import urllib.parse import urllib.parse
import uuid
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
from contextlib import contextmanager from contextlib import contextmanager
@ -75,8 +76,8 @@ class TestDefXmlProxy(XmlStorableObject):
} }
excluded_fields = ['id', 'object_type', 'object_id'] excluded_fields = ['id', 'object_type', 'object_id']
extra_fields = [ extra_fields = [
('workflow_tests', 'workflow_tests'),
('_webservice_responses', 'webservice_responses'), ('_webservice_responses', 'webservice_responses'),
('workflow_tests', 'workflow_tests'),
] ]
return [ return [
@ -674,6 +675,7 @@ class WebserviceResponse(XmlStorableObject):
_names = 'webservice-response' _names = 'webservice-response'
xml_root_node = 'webservice-response' xml_root_node = 'webservice-response'
uuid = None
testdef_id = None testdef_id = None
name = '' name = ''
payload = None payload = None
@ -684,6 +686,7 @@ class WebserviceResponse(XmlStorableObject):
post_data = None post_data = None
XML_NODES = [ XML_NODES = [
('uuid', 'str'),
('testdef_id', 'int'), ('testdef_id', 'int'),
('name', 'str'), ('name', 'str'),
('payload', 'str'), ('payload', 'str'),
@ -694,6 +697,10 @@ class WebserviceResponse(XmlStorableObject):
('post_data', 'kv_data'), ('post_data', 'kv_data'),
] ]
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.uuid = str(uuid.uuid4())
def __str__(self): def __str__(self):
return self.name return self.name

View File

@ -33,7 +33,7 @@ from wcs.qommon.form import (
) )
from wcs.qommon.humantime import humanduration2seconds, seconds2humanduration, timewords from wcs.qommon.humantime import humanduration2seconds, seconds2humanduration, timewords
from wcs.qommon.xml_storage import XmlStorableObject from wcs.qommon.xml_storage import XmlStorableObject
from wcs.testdef import TestError, WebserviceResponse from wcs.testdef import TestError
from wcs.wf.backoffice_fields import SetBackofficeFieldRowWidget, SetBackofficeFieldsTableWidget from wcs.wf.backoffice_fields import SetBackofficeFieldRowWidget, SetBackofficeFieldsTableWidget
from wcs.wf.profile import FieldNode from wcs.wf.profile import FieldNode
@ -661,20 +661,22 @@ class AssertWebserviceCall(WorkflowTestAction):
label = _('Assert webservice call') label = _('Assert webservice call')
key = 'assert-webservice-call' key = 'assert-webservice-call'
webservice_response_id = None webservice_response_uuid = None
call_count = 1 call_count = 1
optional_fields = ['call_count'] optional_fields = ['call_count']
XML_NODES = WorkflowTestAction.XML_NODES + [ XML_NODES = WorkflowTestAction.XML_NODES + [
('webservice_response_id', 'str'), ('webservice_response_uuid', 'str'),
('call_count', 'int'), ('call_count', 'int'),
] ]
@property @property
def details_label(self): def details_label(self):
webservice_responses = [ webservice_responses = [
x for x in self.parent.testdef.get_webservice_responses() if x.id == self.webservice_response_id x
for x in self.parent.testdef.get_webservice_responses()
if x.uuid == self.webservice_response_uuid
] ]
if webservice_responses: if webservice_responses:
return webservice_responses[0].name return webservice_responses[0].name
@ -694,13 +696,17 @@ class AssertWebserviceCall(WorkflowTestAction):
def perform(self, formdata): def perform(self, formdata):
try: try:
response = WebserviceResponse.get(self.webservice_response_id) response = [
except KeyError: x
for x in self.parent.testdef.get_webservice_responses()
if x.uuid == self.webservice_response_uuid
][0]
except IndexError:
raise WorkflowTestError(_('Broken, missing webservice response')) raise WorkflowTestError(_('Broken, missing webservice response'))
call_count = 0 call_count = 0
for used_response in formdata.used_webservice_responses.copy(): for used_response in formdata.used_webservice_responses.copy():
if used_response.id == self.webservice_response_id: if used_response.uuid == self.webservice_response_uuid:
formdata.used_webservice_responses.remove(used_response) formdata.used_webservice_responses.remove(used_response)
call_count += 1 call_count += 1
@ -712,7 +718,7 @@ class AssertWebserviceCall(WorkflowTestAction):
def fill_admin_form(self, form, formdef): def fill_admin_form(self, form, formdef):
webservice_response_options = [ webservice_response_options = [
(response.id, response.name, response.id) (response.uuid, response.name, response.uuid)
for response in self.parent.testdef.get_webservice_responses() for response in self.parent.testdef.get_webservice_responses()
] ]
@ -721,11 +727,11 @@ class AssertWebserviceCall(WorkflowTestAction):
form.add( form.add(
SingleSelectWidget, SingleSelectWidget,
'webservice_response_id', 'webservice_response_uuid',
title=_('Webservice response'), title=_('Webservice response'),
options=webservice_response_options, options=webservice_response_options,
required=True, required=True,
value=self.webservice_response_id, value=self.webservice_response_uuid,
) )
form.add(IntWidget, 'call_count', title=_('Call count'), required=True, value=self.call_count) form.add(IntWidget, 'call_count', title=_('Call count'), required=True, value=self.call_count)