testdef: allow test to expect an error (#74807)

This commit is contained in:
Valentin Deniaud 2023-03-02 16:31:12 +01:00 committed by Gitea
parent 11625292a0
commit 874e91ec67
2 changed files with 73 additions and 4 deletions

View File

@ -876,3 +876,52 @@ def test_computed_field_value_too_long(pub):
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.run(formdef)
def test_expected_error(pub):
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_text|length > 5'},
'error_message': 'Not enough chars.',
}
],
),
fields.StringField(id='1', label='Text', varname='text', validation={'type': 'digits'}),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = datetime.datetime(2021, 1, 1, 0, 0).timetuple()
formdata.data['1'] = '123456'
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.run(formdef)
formdata.data['1'] = '1'
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_text|length > 5).'
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.data['expected_error'] = 'Not enough chars.'
testdef.run(formdef)
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.data['expected_error'] = 'Other error.'
with pytest.raises(TestError) as excinfo:
testdef.run(formdef)
assert str(excinfo.value) == 'Expected error "Other error." but got error "Not enough chars." instead.'
formdata.data['1'] = 'abcdef'
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.data['expected_error'] = 'Only digits are allowed'
testdef.run(formdef)

View File

@ -32,7 +32,9 @@ from .qommon.storage import Equal
class TestError(Exception):
pass
def __init__(self, msg, error=None):
self.msg = msg
self.error = error
class TestDef(sql.TestDef):
@ -121,8 +123,24 @@ class TestDef(sql.TestDef):
get_publisher()._set_request(true_request)
def run(self, objectdef):
expected_error = self.data.get('expected_error')
with self.fake_request():
self._run(objectdef)
try:
self._run(objectdef)
except TestError as e:
if not expected_error:
raise e
if e.error != expected_error:
raise TestError(
_('Expected error "%(expected_error)s" but got error "%(error)s" instead.')
% {'expected_error': expected_error, 'error': e.error}
)
else:
if expected_error:
raise TestError(
_('Expected error "%s" but test completed with success.') % expected_error
)
def _run(self, objectdef):
formdata = self.build_formdata(objectdef)
@ -223,7 +241,8 @@ class TestDef(sql.TestDef):
if not Field.evaluate_condition(formdata.data, objectdef, condition):
raise TestError(
_('Page %(no)d post condition was not met (%(condition)s).')
% {'no': page.index, 'condition': condition.get('value')}
% {'no': page.index, 'condition': condition.get('value')},
error=post_condition.get('error_message'),
)
except RuntimeError:
raise TestError(_('Failed to evaluate page %d post condition.') % page.index)
@ -269,7 +288,8 @@ class TestDef(sql.TestDef):
'error': error_msg,
'label': field_label,
'details': widget.error,
}
},
error=widget.error,
)
def handle_computed_fields(self, fields, formdata, exclude_frozen=False):