testdef, gestion des sources de données (#74289) #115

Merged
vdeniaud merged 2 commits from wip/74289-testdef-gestion-des-sources-de-d into main 2023-02-28 10:28:26 +01:00
2 changed files with 49 additions and 14 deletions

View File

@ -264,11 +264,16 @@ def test_validation_item_field(pub):
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.run(formdef)
# no check on invalid value
formdata.data['1'] = 'xxx'
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.run(formdef)
formdata.data['1'] = None
testdef = TestDef.create_from_formdata(formdef, formdata)
with pytest.raises(TestError) as excinfo:
testdef.run(formdef)
assert str(excinfo.value) == 'Invalid value "xxx" for field "Test": invalid value selected.'
assert str(excinfo.value) == 'Empty value for field "Test": required field.'
def test_item_field_display_value(pub):
@ -322,11 +327,26 @@ def test_item_field_structured_value(pub):
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = datetime.datetime(2021, 1, 1, 0, 0).timetuple()
formdata.data['1'] = '2'
formdata.data = {
'1': '2',
'1_raw': '2',
'1_display': 'deux',
'1_structured': {'id': '2', 'text': 'deux', 'more': 'bar'},
}
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.run(formdef)
# change in data source doesn't affect test
formdef.fields[1].data_source = {
'type': 'jsonvalue',
'value': json.dumps([{'id': '2', 'text': 'deux', 'more': 'foo'}]),
}
testdef.run(formdef)
formdef.fields[1].data_source = data_source = {'type': 'jsonvalue', 'value': json.dumps([])}
testdef.run(formdef)
def test_validation_items_field(pub):
formdef = FormDef()
@ -342,11 +362,10 @@ def test_validation_items_field(pub):
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.run(formdef)
# no check on invalid value
formdata.data['1'] = ['foo', 'xxx']
testdef = TestDef.create_from_formdata(formdef, formdata)
with pytest.raises(TestError) as excinfo:
testdef.run(formdef)
assert str(excinfo.value) == 'Invalid value "xxx" for field "Test": invalid value selected.'
testdef.run(formdef)
formdata.data['1'] = []
testdef = TestDef.create_from_formdata(formdef, formdata)

View File

@ -80,6 +80,11 @@ class TestDef(sql.TestDef):
field_data[field.id] = value
for suffix in ('raw', 'display', 'structured'):
key = '%s_%s' % (field.id, suffix)
if key in formdata.data:
field_data[key] = formdata.data[key]
testdef.data = {
'fields': field_data,
'user': formdata.user.get_json_export_dict() if formdata.user else None,
@ -185,7 +190,16 @@ class TestDef(sql.TestDef):
value = self.data['fields'].get(field.id)
value = field.from_json_value(value)
self.run_widget_validation(field, value)
field.set_value(formdata.data, value)
if field.type in ('item', 'items') and field.data_source:
# add values without requesting data source
formdata.data[field.id] = value
for suffix in ('raw', 'display', 'structured'):
key = '%s_%s' % (field.id, suffix)
if key in self.data['fields']:
formdata.data[key] = self.data['fields'][key]
else:
field.set_value(formdata.data, value)
get_publisher().substitutions.invalidate_cache()
@ -205,7 +219,13 @@ class TestDef(sql.TestDef):
def run_widget_validation(self, field, value):
widget = field.add_to_form(self.form)
widget.set_value(value)
if field.type in ('item', 'items'):
# avoid clearing value on invalid choice
widget.value = value
else:
widget.set_value(value)
widget.transfer_form_value(get_publisher().get_request())
if isinstance(widget, FileWithPreviewWidget):
@ -215,13 +235,6 @@ class TestDef(sql.TestDef):
widget._parsed = False
widget.parse()
# set better error for item fields where an invalid choice is selected
if field.type == 'item' and value and widget.value != value:
widget.set_error(get_selection_error_text())
elif field.type == 'items' and value and widget.value != value:
value = ','.join(set(value) - set(widget.value))
widget.set_error(get_selection_error_text())
if widget.has_error():
field_label = _('"%s"') % field.label
if not widget.error:
@ -233,6 +246,9 @@ class TestDef(sql.TestDef):
'field': field_label,
}
if widget.error == get_selection_error_text():
return
if field.convert_value_to_str:
value = field.convert_value_to_str(value)