From 46c31df1ff2b9a097b146e80e8c56ca6812cba8c Mon Sep 17 00:00:00 2001 From: florian <f.spreckelsen@inidscale.com> Date: Mon, 15 May 2023 16:35:50 +0200 Subject: [PATCH] TST: Add more tests for pattern properties --- src/caosadvancedtools/models/parser.py | 7 ++- .../datamodel_pattern_properties.schema.json | 39 ++++++++++++++++ unittests/test_json_schema_model_parser.py | 45 +++++++++++++++++++ 3 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 unittests/json-schema-models/datamodel_pattern_properties.schema.json diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py index 7cbd117d..971a4918 100644 --- a/src/caosadvancedtools/models/parser.py +++ b/src/caosadvancedtools/models/parser.py @@ -917,8 +917,11 @@ class JsonSchemaParser(Parser): pattern_prop = self._get_pattern_prop() returns = [] for ii, (key, element) in enumerate(pattern_elements.items()): - name_suffix = f"_{ii+1}" if num_patterns > 1 else "" - name = name_prefix + "Entry" + name_suffix + if not "title" in element: + name_suffix = f"_{ii+1}" if num_patterns > 1 else "" + name = name_prefix + "Entry" + name_suffix + else: + name = element["title"] if element["type"] == "object": # simple, is already an object, so can be treated like any other # record type. diff --git a/unittests/json-schema-models/datamodel_pattern_properties.schema.json b/unittests/json-schema-models/datamodel_pattern_properties.schema.json new file mode 100644 index 00000000..9b85c7b8 --- /dev/null +++ b/unittests/json-schema-models/datamodel_pattern_properties.schema.json @@ -0,0 +1,39 @@ +[ + { + "title": "Dataset", + "type": "object", + "patternProperties": { + "^[0-9]{4,4}": { + "type": "boolean" + }, + "^[0-9]{4,4}-[0-9]{2,2}-[0-9]{2,2}": { + "type": "object", + "properties": { + "date_id": { + "type": [ + "string", + "null" + ], + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + } + } + } + } + }, + { + "title": "Dataset2", + "type": "object", + "properties": { + "datetime": { + "type": "string", + "format": "date-time" + } + }, + "patternProperties": { + ".*": { + "title": "Literally anything", + "type": "object" + } + } + } +] diff --git a/unittests/test_json_schema_model_parser.py b/unittests/test_json_schema_model_parser.py index 678b7508..a991076e 100644 --- a/unittests/test_json_schema_model_parser.py +++ b/unittests/test_json_schema_model_parser.py @@ -441,3 +441,48 @@ def test_missing_array_items(): rt = model["something_with_missing_array_items"] assert rt.get_property("missing") is not None assert rt.get_property("missing").datatype == db.LIST(db.FILE) + + +def test_pattern_properties(): + + model = parse_model_from_json_schema(os.path.join( + FILEPATH, "datamodel_pattern_properties.schema.json")) + + assert "Dataset" in model + rt1 = model["Dataset"] + assert len(rt1.properties) == 2 + for name in ["DatasetEntry_1", "DatasetEntry_2"]: + assert rt1.get_property(name) is not None + assert rt1.get_property(name).is_reference() + + pattern_boolean_rt = model["DatasetEntry_1"] + assert "pattern: " in pattern_boolean_rt.description + assert len(pattern_boolean_rt.properties) == 2 + pp = pattern_boolean_rt.get_property("__matched_pattern") + assert pp.datatype == db.TEXT + assert pattern_boolean_rt.get_importance(pp.name) == db.OBLIGATORY + value_prop = pattern_boolean_rt.get_property("DatasetEntry_1_value") + assert value_prop.datatype == db.BOOLEAN + + pattern_object_rt = model["DatasetEntry_2"] + assert "pattern: " in pattern_object_rt.description + assert len(pattern_object_rt.properties) == 2 + pp = pattern_object_rt.get_property("__matched_pattern") + assert pp.datatype == db.TEXT + assert pattern_object_rt.get_importance(pp.name) == db.OBLIGATORY + date_id_prop = pattern_object_rt.get_property("date_id") + assert date_id_prop.datatype == db.TEXT + + assert "Dataset2" in model + rt2 = model["Dataset2"] + assert len(rt2.properties) == 2 + # This has been tested elsewhere, just make sure that it is properly created + # in the presence of pattern properties, too. + assert rt2.get_property("datetime") is not None + + assert rt2.get_property("Literally anything") is not None + assert rt2.get_property("Literally anything").is_reference() + + pattern_named_rt = model["Literally anything"] + assert len(pattern_named_rt.properties) == 1 + assert pattern_named_rt.get_property("__matched_pattern") is not None -- GitLab