diff --git a/rocrate/model/entity.py b/rocrate/model/entity.py index 22e69a5..fc23ead 100644 --- a/rocrate/model/entity.py +++ b/rocrate/model/entity.py @@ -102,6 +102,9 @@ def __setitem__(self, key: str, value): if key.startswith("@"): raise KeyError(f"cannot set '{key}'") values = value if isinstance(value, list) else [value] + for v in values: + if isinstance(v, dict) and "@id" not in v: + raise ValueError(f"no @id in {v}") ref_values = [{"@id": _.id} if isinstance(_, Entity) else _ for _ in values] self._jsonld[key] = ref_values if isinstance(value, list) else ref_values[0] diff --git a/test/test_model.py b/test/test_model.py index 4465ece..c452e21 100644 --- a/test/test_model.py +++ b/test/test_model.py @@ -363,6 +363,11 @@ def test_entity_as_mapping(tmpdir, helpers): } crate_dir = tmpdir / "in_crate" crate_dir.mkdir() + with open(crate_dir / helpers.METADATA_FILE_NAME, "wt") as f: + json.dump(metadata, f, indent=4) + with pytest.raises(ValueError): # due to "badProp", which has no "@id" + crate = ROCrate(crate_dir) + del metadata["@graph"][2]["badProp"] with open(crate_dir / helpers.METADATA_FILE_NAME, "wt") as f: json.dump(metadata, f, indent=4) crate = ROCrate(crate_dir) @@ -411,6 +416,9 @@ def test_entity_as_mapping(tmpdir, helpers): "application/json", "https://www.json.org", } + with pytest.raises(ValueError): + correction["badProp"] = {"k": "v"} # value has no "@id" + correction._jsonld["badProp"] = {"k": "v"} # force set using _jsonld with pytest.raises(ValueError): correction["badProp"]