diff --git a/integrationtests/test_issues.py b/integrationtests/test_issues.py index 3bdac745f392cf747d4c4a46378047b76b04e2b4..441edac5481585e483c94d61d864a1baaa139aa2 100644 --- a/integrationtests/test_issues.py +++ b/integrationtests/test_issues.py @@ -20,6 +20,7 @@ from pytest import fixture, mark import caosdb as db from caosdb.cached import cache_clear +from caosadvancedtools.models.parser import parse_model_from_string from caoscrawler.crawl import Crawler from caoscrawler.identifiable_adapters import CaosDBIdentifiableAdapter @@ -208,3 +209,60 @@ def test_issue_83(clear_database): assert len(retrieved_referencing3.get_property(referenced_type.name).value) == 2 assert retrieved_target1.id in retrieved_referencing3.get_property(referenced_type.name).value assert retrieved_target2.id in retrieved_referencing3.get_property(referenced_type.name).value + + +def test_indiscale_113(clear_database): + """Somewhat mysterious failures to resolve references in + split_into_inserts_and_updates, see + https://gitlab.indiscale.com/caosdb/src/caosdb-crawler/-/issues/113 + + """ + + # Create and insert minimal datamodel + datamodel_str = """ +Event: + recommended_properties: + Basis: + Campaign: +Basis: +Campaign: + recommended_properties: + Basis: +""" + model = parse_model_from_string(datamodel_str) + model.sync_data_model(noquestion=True) + + # Register identifiables, everything is identified by name + ident = CaosDBIdentifiableAdapter() + ident.register_identifiable("Event", db.RecordType().add_parent( + name="Event").add_property(name="name")) + ident.register_identifiable("Basis", db.RecordType().add_parent( + name="Basis").add_property(name="name")) + ident.register_identifiable("Campaign", db.RecordType().add_parent( + name="Campaign").add_property(name="name")) + + crawler = Crawler(identifiableAdapter=ident) + + # Add records: event references basis and campaign, campaign references + # basis. + basis = db.Record(name="Poseidon").add_parent(name="Basis") + campaign = db.Record(name="POS386").add_parent( + name="Campaign").add_property(name="Basis", value=basis) + event = db.Record(name="GeoB13952").add_parent(name="Event") + event.add_property(name="Basis", value=basis) + event.add_property(name="Campaign", value=campaign) + + # basis and campaign already exist in the db + db.Container().extend([basis, campaign]).insert() + # redefine to trigger resolving + basis = db.Record(name="Poseidon").add_parent(name="Basis") + campaign = db.Record(name="POS386").add_parent( + name="Campaign").add_property(name="Basis", value=basis) + recs = [event, basis, campaign] + + ins, ups = crawler.synchronize(crawled_data=recs, unique_names=False) + # There is only one event to be inserted + assert len(ins) == 1 + # Nothing to do for the existing ents + assert len(ups) == 0 + assert ins[0].name == event.name diff --git a/setup.cfg b/setup.cfg index 32edcde630172cb991ea28898ae0c5e9f5770f90..fedee42ab158adfcf19fd8103fcf67f2c52c7099 100644 --- a/setup.cfg +++ b/setup.cfg @@ -21,7 +21,7 @@ python_requires = >=3.7 install_requires = importlib-resources caosadvancedtools >= 0.7.0 - linkahead >= 0.13.1 + linkahead > 0.13.2 yaml-header-tools >= 0.2.1 pyyaml odfpy #make optional