From 964b283e19a3d3823fb3b9a442a83a5a6a9c03da Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Tue, 10 Jan 2023 11:43:53 +0100 Subject: [PATCH] testdef: add support for blocks (#73332) --- tests/test_testdef.py | 49 +++++++++++++++++++++++++++++++++++++++++++ wcs/testdef.py | 26 ++++++++++++++++++++--- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/tests/test_testdef.py b/tests/test_testdef.py index 2d6fcf882..2fcece330 100644 --- a/tests/test_testdef.py +++ b/tests/test_testdef.py @@ -4,6 +4,7 @@ import time import pytest from wcs import fields +from wcs.blocks import BlockDef from wcs.formdef import FormDef from wcs.qommon.http_request import HTTPRequest from wcs.qommon.upload_storage import PicklableUpload @@ -439,6 +440,54 @@ def test_validation_file_field(pub): assert str(excinfo.value) == 'Invalid value "hop.pdf" for field "File": forbidden file type.' +def test_validation_block_field(pub): + block = BlockDef() + block.name = 'foobar' + block.fields = [ + fields.StringField(id='1', label='Text', varname='text'), + fields.StringField(id='2', label='Hop'), + ] + block.store() + + formdef = FormDef() + formdef.name = 'test title' + formdef.fields = [ + fields.PageField( + id='0', + label='1st page', + type='page', + post_conditions=[ + { + 'condition': {'type': 'django', 'value': 'form_var_blockdata_1_text == "a"'}, + 'error_message': '', + } + ], + ), + fields.BlockField(id='1', label='Block Data', varname='blockdata', type='block:foobar', max_items=3), + ] + formdef.store() + + formdata = formdef.data_class()() + formdata.just_created() + formdata.receipt_time = datetime.datetime(2021, 1, 1, 0, 0).timetuple() + formdata.data['1'] = {'data': [{'1': 'a'}, {'1': 'b'}]} + + testdef = TestDef.create_from_formdata(formdef, formdata) + with pytest.raises(TestError) as excinfo: + testdef.run(formdef) + assert str(excinfo.value) == 'Empty value for field "Hop" (of field "Block Data"): required field.' + + formdata.data['1'] = {'data': [{'1': 'a', '2': 'z'}, {'1': 'b', '2': 'z'}]} + testdef = TestDef.create_from_formdata(formdef, formdata) + with pytest.raises(TestError) as excinfo: + testdef.run(formdef) + assert str(excinfo.value) == 'Page 1 post condition was not met (form_var_blockdata_1_text == "a").' + + formdata.data['1'] = {'data': [{'1': 'b', '2': 'z'}, {'1': 'a', '2': 'z'}]} + testdef = TestDef.create_from_formdata(formdef, formdata) + testdef.run(formdef) + + def test_computed_field_support(pub): formdef = FormDef() formdef.name = 'test title' diff --git a/wcs/testdef.py b/wcs/testdef.py index acc6ac4e9..d207c5b92 100644 --- a/wcs/testdef.py +++ b/wcs/testdef.py @@ -237,20 +237,40 @@ class TestDef(sql.TestDef): value = ','.join(set(value) - set(widget.value)) widget.set_error(get_selection_error_text()) - if widget.error: + if widget.has_error(): + field_label = _('"%s"') % field.label + if not widget.error: + widget = self.get_error_subwidget(widget) + value = widget.value + field = widget.field + field_label = _('"%(subfield)s" (of field %(field)s)') % { + 'subfield': field.label, + 'field': field_label, + } + if field.convert_value_to_str: value = field.convert_value_to_str(value) error_msg = 'Invalid value "%s"' % value if value else _('Empty value') raise TestError( - '%(error)s for field "%(label)s": %(details)s.' + '%(error)s for field %(label)s: %(details)s.' % { 'error': error_msg, - 'label': field.label, + 'label': field_label, 'details': widget.error, } ) + def get_error_subwidget(self, widget): + for widget in widget.get_widgets(): + if widget.error: + return widget + + if hasattr(widget, 'get_widgets'): + widget = self.get_error_subwidget(widget) + if widget: + return widget + def export_to_json(self): return { 'name': self.name, -- 2.39.0