Compare commits

..

4 Commits

Author SHA1 Message Date
Frédéric Péters 075906753c backoffice: add warning if total number of data fields is too large (#88452)
gitea/wcs/pipeline/head This commit looks good Details
2024-03-29 08:32:21 +01:00
Valentin Deniaud dc473b7378 workflow_tests: preserve response of webservice assertion on test duplication (#88729)
gitea/wcs/pipeline/head This commit looks good Details
2024-03-27 11:23:33 +01:00
Frédéric Péters d0358afa40 tests: check update of items relations (#88687)
gitea/wcs/pipeline/head This commit looks good Details
2024-03-26 14:53:21 +01:00
Frédéric Péters 4d5b309986 misc: use custom id in breadcrumb (#88557)
gitea/wcs/pipeline/head This commit looks good Details
2024-03-23 12:15:31 +01:00
10 changed files with 99 additions and 27 deletions

View File

@ -3717,7 +3717,7 @@ def test_form_edit_field_warnings(pub):
assert (
resp.pyquery('.warningnotice')
.text()
.startswith('There are 2201 data fields, including fields in blocks.')
.startswith('There are at least 2201 data fields, including fields in blocks.')
)
FormDef.wipe()

View File

@ -1167,6 +1167,11 @@ def test_tests_duplicate(pub):
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
@ -1196,6 +1201,8 @@ def test_tests_duplicate(pub):
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')

View File

@ -664,13 +664,13 @@ def test_workflow_tests_action_assert_webservice_call(pub):
response3.store()
resp = app.get('/backoffice/forms/1/tests/%s/workflow/1/' % testdef.id)
assert resp.form['webservice_response_id'].options == [
(str(response.id), False, 'Fake response'),
(str(response2.id), False, 'Fake response 2'),
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_id'] = 1
resp.form['webservice_response_uuid'] = response.uuid
resp.form['call_count'] = 2
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_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
response.remove_self()

View File

@ -398,6 +398,7 @@ def test_backoffice_card_item_link_id_template(pub):
resp = resp.form.submit('submit')
assert resp.location.endswith('/backoffice/data/foo/blah/')
resp = resp.follow()
assert resp.pyquery('.breadcrumbs a')[-1].attrib['href'] == '/backoffice/data/foo/blah/'
resp = app.get('/backoffice/data/foo/')
assert [x.attrib['href'] for x in resp.pyquery('table a')] == ['blah/', 'test/']

View File

@ -1626,6 +1626,57 @@ def test_card_update_related_cascading_loop(pub):
assert carddata2.data['2_display'] == 'card1 card2 card1 None'
def test_card_update_related_items_relation(pub):
CardDef.wipe()
FormDef.wipe()
carddef = CardDef()
carddef.name = 'foo'
carddef.fields = [
StringField(id='1', label='Test', varname='foo'),
]
carddef.digest_templates = {'default': '{{ form_var_foo }}'}
carddef.store()
carddef.data_class().wipe()
carddata1 = carddef.data_class()()
carddata1.data = {'1': 'card1'}
carddata1.just_created()
carddata1.store()
carddata2 = carddef.data_class()()
carddata2.data = {'1': 'card2'}
carddata2.just_created()
carddata2.store()
formdef = FormDef()
formdef.name = 'foo'
formdef.fields = [
ItemField(id='1', label='Test', data_source={'type': 'carddef:foo'}),
ItemsField(id='2', label='Test2', data_source={'type': 'carddef:foo'}),
]
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'1': '1', '2': ['1', '2']}
formdata.data['1_display'] = formdef.fields[0].store_display_value(formdata.data, formdef.fields[0].id)
formdata.data['2_display'] = formdef.fields[1].store_display_value(formdata.data, formdef.fields[1].id)
assert formdata.data['1_display'] == 'card1'
assert formdata.data['2_display'] == 'card1, card2'
formdata.just_created()
formdata.store()
pub.cleanup()
carddef = carddef.get(carddef.id)
carddata1 = carddef.data_class().get(carddata1.id)
carddata1.data = {'1': 'card1-change1'}
carddata1.store()
formdata.refresh_from_storage()
assert formdata.data['1_display'] == 'card1-change1'
assert formdata.data['2_display'] == 'card1-change1, card2'
def test_card_update_related_deleted(pub):
BlockDef.wipe()
CardDef.wipe()

View File

@ -989,7 +989,7 @@ def test_workflow_tests_webservice(pub):
testdef.workflow_tests.actions = [
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:
@ -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).'
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)
@ -1021,8 +1021,8 @@ def test_workflow_tests_webservice(pub):
response2.store()
testdef.workflow_tests.actions = [
workflow_tests.AssertWebserviceCall(webservice_response_id=response.id, call_count=1),
workflow_tests.AssertWebserviceCall(webservice_response_id=response2.id, call_count=1),
workflow_tests.AssertWebserviceCall(webservice_response_uuid=response.uuid, call_count=1),
workflow_tests.AssertWebserviceCall(webservice_response_uuid=response2.uuid, call_count=1),
]
testdef.run(formdef)
@ -1032,8 +1032,8 @@ def test_workflow_tests_webservice(pub):
testdef.run(formdef)
testdef.workflow_tests.actions = [
workflow_tests.AssertWebserviceCall(webservice_response_id=response.id, 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),
workflow_tests.AssertWebserviceCall(webservice_response_uuid=response.uuid, call_count=1),
]
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).'
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:
@ -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).'
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:

View File

@ -394,7 +394,7 @@ class FieldsDirectory(Directory):
# warn before DATA_UPLOAD_MAX_NUMBER_FIELDS
r += htmltext('<div class="warningnotice">')
r += htmltext('<p>%s %s</p>') % (
_('There are %d data fields, including fields in blocks.')
_('There are at least %d data fields, including fields in blocks.')
% self.objectdef.get_total_count_data_fields(),
_('It is close to the system limits and no new fields should be added.'),
)

View File

@ -1030,7 +1030,7 @@ class FormStatusPage(Directory, FormTemplateMixin):
return Directory._q_lookup(self, component)
def _q_traverse(self, path):
get_response().breadcrumb.append((str(self.filled.id) + '/', self.filled.get_display_id()))
get_response().breadcrumb.append((self.filled.identifier + '/', self.filled.get_display_id()))
return super()._q_traverse(path)
def wfedit(self, action_id):

View File

@ -21,6 +21,7 @@ import io
import json
import socket
import urllib.parse
import uuid
import xml.etree.ElementTree as ET
from contextlib import contextmanager
@ -75,8 +76,8 @@ class TestDefXmlProxy(XmlStorableObject):
}
excluded_fields = ['id', 'object_type', 'object_id']
extra_fields = [
('workflow_tests', 'workflow_tests'),
('_webservice_responses', 'webservice_responses'),
('workflow_tests', 'workflow_tests'),
]
return [
@ -674,6 +675,7 @@ class WebserviceResponse(XmlStorableObject):
_names = 'webservice-response'
xml_root_node = 'webservice-response'
uuid = None
testdef_id = None
name = ''
payload = None
@ -684,6 +686,7 @@ class WebserviceResponse(XmlStorableObject):
post_data = None
XML_NODES = [
('uuid', 'str'),
('testdef_id', 'int'),
('name', 'str'),
('payload', 'str'),
@ -694,6 +697,10 @@ class WebserviceResponse(XmlStorableObject):
('post_data', 'kv_data'),
]
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.uuid = str(uuid.uuid4())
def __str__(self):
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.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.profile import FieldNode
@ -661,20 +661,22 @@ class AssertWebserviceCall(WorkflowTestAction):
label = _('Assert webservice call')
key = 'assert-webservice-call'
webservice_response_id = None
webservice_response_uuid = None
call_count = 1
optional_fields = ['call_count']
XML_NODES = WorkflowTestAction.XML_NODES + [
('webservice_response_id', 'str'),
('webservice_response_uuid', 'str'),
('call_count', 'int'),
]
@property
def details_label(self):
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:
return webservice_responses[0].name
@ -694,13 +696,17 @@ class AssertWebserviceCall(WorkflowTestAction):
def perform(self, formdata):
try:
response = WebserviceResponse.get(self.webservice_response_id)
except KeyError:
response = [
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'))
call_count = 0
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)
call_count += 1
@ -712,7 +718,7 @@ class AssertWebserviceCall(WorkflowTestAction):
def fill_admin_form(self, form, formdef):
webservice_response_options = [
(response.id, response.name, response.id)
(response.uuid, response.name, response.uuid)
for response in self.parent.testdef.get_webservice_responses()
]
@ -721,11 +727,11 @@ class AssertWebserviceCall(WorkflowTestAction):
form.add(
SingleSelectWidget,
'webservice_response_id',
'webservice_response_uuid',
title=_('Webservice response'),
options=webservice_response_options,
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)