diff --git a/unittests/json-schema-models/datamodel_enum_prop.schema.json b/unittests/json-schema-models/datamodel_enum_prop.schema.json index 07b6a146a3af818da253293cb5744ad3a99d93fc..a764ceca246971a2bbfa1aecab14c9c3a1f54fe1 100644 --- a/unittests/json-schema-models/datamodel_enum_prop.schema.json +++ b/unittests/json-schema-models/datamodel_enum_prop.schema.json @@ -6,6 +6,10 @@ "license": { "type": "string", "enum": ["CC-BY", "CC-BY-SA", "CC0", "restricted access"] + }, + "int_enum": { + "type": "integer", + "enum": [1, 2, 3] } }, "required": ["license"] diff --git a/unittests/json-schema-models/datamodel_references.schema.json b/unittests/json-schema-models/datamodel_references.schema.json new file mode 100644 index 0000000000000000000000000000000000000000..6b79a9bcdbbd8beaf9974a600e9c5ff30cb513f4 --- /dev/null +++ b/unittests/json-schema-models/datamodel_references.schema.json @@ -0,0 +1,24 @@ +{ + "title": "Dataset", + "description": "", + "type": "object", + "properties": { + "event": { + "type": "object", + "properties": { + "longitude": { + "type": "number" + }, + "latitude": { + "type": "number" + }, + "location": { + "type": "string", + "description": "geographical location (e.g., North Sea; Espoo, Finland)" + } + }, + "required": ["longitude", "latitude"] + } + }, + "required": ["event"] +} diff --git a/unittests/test_json_schema_model_parser.py b/unittests/test_json_schema_model_parser.py index b432af5c1fee410cfb23637c1734a0fed7a44e6a..637adac9d11daac9aec6bbbdabba00d5bb733057 100644 --- a/unittests/test_json_schema_model_parser.py +++ b/unittests/test_json_schema_model_parser.py @@ -147,5 +147,63 @@ def test_enum(): for name in licenses: assert isinstance(model[name], db.Record) + assert model[name].name == name assert len(model[name].parents) == 1 assert model[name].has_parent(model["license"]) + + # Also allow enums with non-string types + int_enums = ["1", "2", "3"] + for name in ["int_enum"] + int_enums: + assert name in model + + assert isinstance(model["int_enum"], db.RecordType) + assert model["Dataset"].get_property("int_enum") is not None + assert model["Dataset"].get_property("int_enum").is_reference() + assert model["Dataset"].get_property( + "int_enum").datatype.name == "int_enum" + + for name in int_enums: + assert isinstance(model[name], db.Record) + assert model[name].name == name + assert len(model[name].parents) == 1 + assert model[name].has_parent(model["int_enum"]) + + +def test_references(): + """Test reference properties""" + # @author Florian Spreckelsen + # @date 2022-03-17 + + model = parse_model_from_json_schema(os.path.join( + FILEPATH, "datamodel_references.schema.json")) + for name in ["Dataset", "event", "longitude", "latitude", "location"]: + assert name in model + + assert isinstance(model["Dataset"], db.RecordType) + assert model["Dataset"].get_property("event") is not None + assert model["Dataset"].get_importance("event") == db.OBLIGATORY + assert model["Dataset"].get_property("event").is_reference() + assert model["Dataset"].get_property("event").datatype.name == "event" + + assert isinstance(model["event"], db.RecordType) + assert model["event"].get_property("longitude") is not None + assert model["event"].get_importance("longitude") == db.OBLIGATORY + assert model["event"].get_property("longitude").datatype == db.DOUBLE + + assert model["event"].get_property("latitude") is not None + assert model["event"].get_importance("latitude") == db.OBLIGATORY + assert model["event"].get_property("latitude").datatype == db.DOUBLE + + assert model["event"].get_property("location") is not None + assert model["event"].get_importance("location") == db.RECOMMENDED + assert model["event"].get_property("location").datatype == db.TEXT + + assert isinstance(model["longitude"], db.Property) + assert model["longitude"].datatype == db.DOUBLE + + assert isinstance(model["latitude"], db.Property) + assert model["latitude"].datatype == db.DOUBLE + + assert isinstance(model["location"], db.Property) + assert model["location"].datatype == db.TEXT + assert model["location"].description == "geographical location (e.g., North Sea; Espoo, Finland)"