Projet

Général

Profil

0003-formdefs-report-all-missing-things-in-one-time-57753.patch

Lauréline Guérin, 04 novembre 2021 14:51

Télécharger (7,21 ko)

Voir les différences:

Subject: [PATCH 3/4] formdefs: report all missing things in one time (#57753)

 tests/test_formdef_import.py  | 30 ++++++++++++++++++++++++++++--
 tests/test_workflow_import.py | 16 ++++++++++++----
 wcs/formdef.py                | 15 ++++++++++-----
 3 files changed, 50 insertions(+), 11 deletions(-)
tests/test_formdef_import.py
396 396

  
397 397
    formdef.fields = [fields.StringField(id='1', type='string', data_source={'type': 'foobar'})]
398 398
    export = ET.tostring(export_to_indented_xml(formdef))
399
    with pytest.raises(FormdefImportError, match='Unknown datasources'):
399
    with pytest.raises(FormdefImportError) as excinfo:
400 400
        FormDef.import_from_xml(io.BytesIO(export))
401
    assert excinfo.value.msg == 'Unknown referenced objects'
402
    assert excinfo.value.details == 'Unknown datasources: foobar'
401 403

  
402 404
    # carddef as datasource
403 405
    carddef = CardDef()
......
454 456

  
455 457
    BlockDef.wipe()
456 458
    export = ET.tostring(export_to_indented_xml(formdef))
457
    with pytest.raises(FormdefImportError, match='Unknown field type'):
459
    with pytest.raises(FormdefImportError) as excinfo:
458 460
        FormDef.import_from_xml(io.BytesIO(export))
461
    assert excinfo.value.msg == 'Unknown referenced objects'
462
    assert excinfo.value.details == 'Unknown field types: block:foobar'
459 463

  
460 464

  
461 465
def test_duplicated_field_ids(pub):
......
824 828
    assert custom_views[0].order_by == 'receipt_time'
825 829
    assert custom_views[0].formdef_id == formdef2.id
826 830
    assert custom_views[0].formdef_type == 'formdef'
831

  
832

  
833
def test_import_formdef_multiple_errors(pub):
834
    BlockDef.wipe()
835

  
836
    formdef = FormDef()
837
    formdef.name = 'foo'
838
    formdef.fields = [
839
        fields.BlockField(id='1', type='block:foobar'),
840
        fields.BlockField(id='2', type='block:foobaz'),
841
        fields.StringField(id='3', type='string', data_source={'type': 'foobar'}),
842
        fields.StringField(id='4', type='string', data_source={'type': 'carddef:unknown'}),
843
    ]
844

  
845
    export = ET.tostring(export_to_indented_xml(formdef))
846
    with pytest.raises(FormdefImportError) as excinfo:
847
        FormDef.import_from_xml(io.BytesIO(export))
848
    assert excinfo.value.msg == 'Unknown referenced objects'
849
    assert (
850
        excinfo.value.details
851
        == 'Unknown field types: block:foobar, block:foobaz; Unknown datasources: carddef:unknown, foobar'
852
    )
tests/test_workflow_import.py
927 927

  
928 928
    for wf in [wf1, wf2, wf3]:
929 929
        export = ET.tostring(export_to_indented_xml(wf))
930
        with pytest.raises(WorkflowImportError, match='Unknown datasources'):
930
        with pytest.raises(WorkflowImportError) as excinfo:
931 931
            Workflow.import_from_xml(io.BytesIO(export))
932
        assert excinfo.value.msg == 'Unknown referenced objects'
933
        assert excinfo.value.details == 'Unknown datasources: foobar'
932 934

  
933 935
    # carddef as datasource
934 936
    CardDef.wipe()
......
951 953

  
952 954
    for wf in [wf1, wf2, wf3]:
953 955
        export = ET.tostring(export_to_indented_xml(wf))
954
        with pytest.raises(WorkflowImportError, match='Unknown datasources'):
956
        with pytest.raises(WorkflowImportError) as excinfo:
955 957
            Workflow.import_from_xml(io.BytesIO(export))
958
        assert excinfo.value.msg == 'Unknown referenced objects'
959
        assert excinfo.value.details == 'Unknown datasources: carddef:unknown'
956 960

  
957 961
    # carddef custom view as datasource
958 962
    pub.custom_view_class.wipe()
......
978 982

  
979 983
    for wf in [wf1, wf2, wf3]:
980 984
        export = ET.tostring(export_to_indented_xml(wf))
981
        with pytest.raises(WorkflowImportError, match='Unknown datasources'):
985
        with pytest.raises(WorkflowImportError) as excinfo:
982 986
            Workflow.import_from_xml(io.BytesIO(export))
987
        assert excinfo.value.msg == 'Unknown referenced objects'
988
        assert excinfo.value.details == 'Unknown datasources: carddef:foo:unknown'
983 989

  
984 990

  
985 991
def test_workflow_with_block(pub):
......
1012 1018
    BlockDef.wipe()
1013 1019
    for wf in [wf1, wf2, wf3]:
1014 1020
        export = ET.tostring(export_to_indented_xml(wf))
1015
        with pytest.raises(WorkflowImportError, match='Unknown field type'):
1021
        with pytest.raises(WorkflowImportError) as excinfo:
1016 1022
            Workflow.import_from_xml(io.BytesIO(export))
1023
        assert excinfo.value.msg == 'Unknown referenced objects'
1024
        assert excinfo.value.details == 'Unknown field types: block:foobar'
1017 1025

  
1018 1026

  
1019 1027
def test_workflow_with_category(pub):
wcs/formdef.py
1190 1190
            setattr(formdef, boolean_attribute, value.text == 'true')
1191 1191

  
1192 1192
        formdef.fields = []
1193
        unknown_field_types = set()
1193 1194
        for i, field in enumerate(tree.find('fields')):
1194 1195
            try:
1195 1196
                field_o = fields.get_field_class_by_type(field.findtext('type'))()
1196 1197
            except KeyError:
1197
                raise FormdefImportError(_('Unknown field type'), details=field.findtext('type'))
1198
                unknown_field_types.add(field.findtext('type'))
1199
                continue
1198 1200
            field_o.init_with_xml(field, charset, include_id=True)
1199 1201
            if fix_on_error or not field_o.id:
1200 1202
                # this assumes all fields will have id, or none of them
......
1319 1321
                value = xml_node_text(child)
1320 1322
                formdef.digest_templates[key] = value
1321 1323

  
1324
        unknown_datasources = set()
1322 1325
        if check_datasources:
1323 1326
            # check if datasources are defined
1324
            unknown_datasources = set()
1325 1327
            for field in formdef.fields:
1326 1328
                data_source = getattr(field, 'data_source', None)
1327 1329
                if data_source:
......
1354 1356
                        except IndexError:
1355 1357
                            unknown_datasources.add(data_source_id)
1356 1358

  
1359
        if unknown_field_types or unknown_datasources:
1360
            details = []
1361
            if unknown_field_types:
1362
                details.append('%s: %s' % (_('Unknown field types'), ', '.join(sorted(unknown_field_types))))
1357 1363
            if unknown_datasources:
1358
                raise FormdefImportError(
1359
                    _('Unknown datasources'), details=', '.join(sorted(unknown_datasources))
1360
                )
1364
                details.append('%s: %s' % (_('Unknown datasources'), ', '.join(sorted(unknown_datasources))))
1365
            raise FormdefImportError(_('Unknown referenced objects'), details='; '.join(details))
1361 1366

  
1362 1367
        return formdef
1363 1368

  
1364
-