testdef, gestion des sources de données (#74289) #115
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue