testdef, ne pas enregistrer d'erreurs sur le formulaire (#76502) #235

Merged
fpeters merged 2 commits from wip/76502-testdef-ne-pas-enregistrer-d-err into main 2023-05-02 16:37:27 +02:00
4 changed files with 46 additions and 7 deletions

View File

@ -1,8 +1,10 @@
import datetime
import json
import time
from unittest import mock
import pytest
from quixote import get_publisher
from wcs import fields
from wcs.blocks import BlockDef
@ -980,3 +982,31 @@ def test_expected_error(pub):
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.data['expected_error'] = 'Only digits are allowed'
testdef.run(formdef)
def test_record_error_raises_exception(pub, monkeypatch):
formdef = FormDef()
formdef.name = 'test title'
formdef.fields = [
fields.StringField(id='1', label='String field digits'),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = datetime.datetime(2021, 1, 1, 0, 0).timetuple()
formdata.data['1'] = '1'
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.run(formdef)
def record_error():
try:
1 / 0
except ZeroDivisionError as e:
get_publisher().record_error('Error', formdef=formdef, exception=e)
with pytest.raises(ZeroDivisionError) as excinfo:
with mock.patch('wcs.qommon.form.StringWidget.parse', side_effect=record_error):
testdef.run(formdef)
assert str(excinfo.value) == 'division by zero'

View File

@ -625,8 +625,10 @@ class Field:
return changed
@staticmethod
def evaluate_condition(dict_vars, formdef, condition):
return PageCondition(condition, {'dict_vars': dict_vars, 'formdef': formdef}).evaluate()
def evaluate_condition(dict_vars, formdef, condition, record_errors=True):
return PageCondition(
condition, {'dict_vars': dict_vars, 'formdef': formdef}, record_errors
).evaluate()
def is_visible(self, dict, formdef):
try:

View File

@ -867,7 +867,7 @@ class FileWithPreviewWidget(CompositeWidget):
def set_value(self, value):
try:
self.value = value
if self.value:
if self.value and self.get_value_from_token:
if not hasattr(self.value, 'token') or not get_session().get_tempfile(self.value.token):
# it has no token, or its token is not in the session; this may be
# because the file value has not been created when filling a form,

View File

@ -123,14 +123,21 @@ class TestDef(sql.TestDef):
@contextmanager
def fake_request(self):
def record_error(self, error_summary=None, context=None, exception=None, *args, **kwargs):
raise exception
real_record_error = get_publisher().record_error
true_request = get_publisher().get_request()
wsgi_request = WSGIRequest({'REQUEST_METHOD': 'POST', 'wsgi.input': io.StringIO()})
fake_request = CompatHTTPRequest(wsgi_request)
try:
get_publisher()._set_request(fake_request)
get_publisher().record_error = record_error
yield
finally:
get_publisher()._set_request(true_request)
get_publisher().record_error = real_record_error
def run(self, objectdef):
self.missing_required_fields = []
@ -252,7 +259,7 @@ class TestDef(sql.TestDef):
for post_condition in page.post_conditions or []:
condition = post_condition.get('condition', {})
try:
if not Field.evaluate_condition(formdata.data, objectdef, condition):
if not Field.evaluate_condition(formdata.data, objectdef, condition, record_errors=False):
raise TestError(
_('Page %(no)d post condition was not met (%(condition)s).')
% {'no': page.index, 'condition': condition.get('value')},
@ -263,12 +270,12 @@ class TestDef(sql.TestDef):
def run_widget_validation(self, field, value):
widget = field.add_to_form(self.form)
widget.set_value(value)
widget.transfer_form_value(get_publisher().get_request())
if isinstance(widget, FileWithPreviewWidget):
widget.get_value_from_token = False
widget.value = value
widget.set_value(value)
widget.transfer_form_value(get_publisher().get_request())
widget._parsed = False
widget.parse()