testdef, ne pas enregistrer d'erreurs sur le formulaire (#76502) #235
|
@ -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'
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue