diff --git a/src/caoscrawler/identifiable_adapters.py b/src/caoscrawler/identifiable_adapters.py index 3a9b8819b2f16ae7b6b2dc4ff06d94055da14d60..d95112ee1aec6ca1526c96421a8052282b6ef9a7 100644 --- a/src/caoscrawler/identifiable_adapters.py +++ b/src/caoscrawler/identifiable_adapters.py @@ -236,10 +236,11 @@ startswith: bool, optional refs.extend(referencing_entities[rtname]) found = True if not found: - raise NotImplementedError( + raise RuntimeError( f"Could not find referencing entities of type(s): {prop.value}\n" f"for registered identifiable:\n{registered_identifiable}\n" - f"There were {len(referencing_entities)} referencing entities to choose from." + f"There were {len(referencing_entities)} referencing entities to choose from.\n" + f"This error can also occur in case of merge conflicts in the referencing entities." ) return refs diff --git a/unittests/test_crawler.py b/unittests/test_crawler.py index e026899201ae0dfa937053d315854e5fbb8a351a..a48b5e16ad1a71beeb4a5bf1c2ac52f67bbd7afe 100644 --- a/unittests/test_crawler.py +++ b/unittests/test_crawler.py @@ -405,7 +405,6 @@ def test_split_into_inserts_and_updates_with_copy_attr(crawler_mocked_identifiab crawler.identifiableAdapter.retrieve_identified_record_for_identifiable.assert_called() -@pytest.mark.xfail(reason="https://gitlab.com/linkahead/linkahead-crawler/-/issues/88") @patch("caoscrawler.identifiable_adapters.cached_query", new=Mock(side_effect=mock_cached_only_rt)) def test_split_iiau_with_unmergeable_list_items(): @@ -429,12 +428,16 @@ Identifiables id_A: [prop_ident] id_B: [prop_ident, "is_referenced_by: A"] +id_C: [prop_other, "is_referenced_by: B"] Data ---- -b1: ("same", 23) -b2: ("same", 42) +c1: (23) +c2: (42) + +b1: ("same", c1) +b2: ("same", c2) a: ([b1, b2]) """ @@ -469,18 +472,13 @@ a: ([b1, b2]) crawler = Crawler(identifiableAdapter=ident_adapter) - # This should give a merge conflict, and not - # "Could not find referencing entities of type(s): A" - - # from IPython import embed; embed() with raises(RuntimeError) as rte: crawler.synchronize(commit_changes=False, crawled_data=[rec_a, *rec_b, *rec_c]) assert not isinstance(rte.value, NotImplementedError), \ "Exception must not be NotImplementedError, but plain RuntimeError." - assert "Could not find referencing entities" not in rte.value.args[0] - assert "merging impossible" in rte.something - # crawler.split_into_inserts_and_updates(ent_list=[rec_a, *rec_b, *rec_c]) + assert "Could not find referencing entities" in rte.value.args[0] + assert "merge conflicts in the referencing" in rte.value.args[0] def test_has_missing_object_in_references(): @@ -785,8 +783,8 @@ def test_split_into_inserts_and_updates_backref(crawler_mocked_for_backref_test) entlist = [referenced, db.Record(name="A").add_parent("BR").add_property("ref", referenced), ] # Test without referencing object - # currently a NotImplementedError is raised if necessary properties are missing. - with raises(NotImplementedError): + # currently a RuntimeError is raised if necessary properties are missing. + with raises(RuntimeError): crawler.split_into_inserts_and_updates([db.Record(name="B").add_parent("C")]) # identifiables were not yet checked