testdef: allow test to expect an error (#74807)
This commit is contained in:
parent
11625292a0
commit
874e91ec67
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue