diff --git a/integrationtests/basic_example/test_basic.py b/integrationtests/basic_example/test_basic.py index dbc506ef5107df3a9fab0f109de6a0e08c37b63e..0c847b08a729f3b112cbdf3c38bac31309cda125 100755 --- a/integrationtests/basic_example/test_basic.py +++ b/integrationtests/basic_example/test_basic.py @@ -109,9 +109,11 @@ def crawler_extended(ident): def test_ambigious_lookup(clear_database, usemodel, crawler, ident): ins, ups = crawler.synchronize() + + proj = db.execute_query("FIND Project WITH identifier='SpeedOfLight'", unique=True) with pytest.raises(RuntimeError, match=".*unambigiously.*"): print(crawler.identifiableAdapter.retrieve_identified_record_for_identifiable( - Identifiable(record_type="Measurement"))) + Identifiable(properties={'project': proj.id}))) def test_single_insertion(clear_database, usemodel, crawler, ident): diff --git a/src/caoscrawler/identifiable.py b/src/caoscrawler/identifiable.py index 32d07b5e3d948c460a44971f22aa3b65032a6077..56c023e25d4ff319de61db2989a6cf1d27f5631a 100644 --- a/src/caoscrawler/identifiable.py +++ b/src/caoscrawler/identifiable.py @@ -49,6 +49,10 @@ class Identifiable(): def __init__(self, record_id: int = None, path: str = None, record_type: str = None, name: str = None, properties: dict = None, backrefs: list[Union[int, str]] = None): + if (record_id is None and path is None and name is None and backrefs is None and (properties + is None or len(properties) == 0)): + raise ValueError("There is no identifying information. You need to add a path or " + "properties or other identifying attributes.") self.record_id = record_id self.path = path self.record_type = record_type diff --git a/unittests/test_file_identifiables.py b/unittests/test_file_identifiables.py index f71ea75a36049084591851409d71fd9db291f07f..c7821f396a3f55634042f74dbe5e6f2d7e223811 100644 --- a/unittests/test_file_identifiables.py +++ b/unittests/test_file_identifiables.py @@ -8,19 +8,27 @@ import pytest from pytest import raises from caoscrawler.identifiable_adapters import LocalStorageIdentifiableAdapter +from caoscrawler.identifiable import Identifiable def test_file_identifiable(): ident = LocalStorageIdentifiableAdapter() + # Without a path there is no identifying information + with raises(ValueError): + ident.get_identifiable(db.File()) + fp = "/test/bla/bla.txt" file_obj = db.File(path=fp) identifiable = ident.get_identifiable(file_obj) # the path is copied to the identifiable + assert fp == identifiable.path + assert isinstance(identifiable, Identifiable) + + # __eq__ function is only defined for Identifiable objects with raises(ValueError): file_obj != identifiable - assert file_obj.path == identifiable.path # since the path does not exist in the data in ident, the follwoing functions return None assert ident.retrieve_identified_record_for_record(file_obj) is None