diff --git a/integrationtests/test.py b/integrationtests/test.py index 8e62daeb19c587ba90d550f417e51754d93a23ad..96ec6fe7f4dd3db00e9bf337bb65c5a61d608ae1 100755 --- a/integrationtests/test.py +++ b/integrationtests/test.py @@ -28,6 +28,7 @@ module description """ +from caosdb import EmptyUniqueQueryError import argparse import sys from argparse import RawTextHelpFormatter @@ -38,9 +39,10 @@ import pytest from caosadvancedtools.models.parser import parse_model_from_yaml import yaml -import os +from caosadvancedtools.testutils import clear_database, set_test_key +set_test_key("10b128cf8a1372f30aa3697466bb55e76974e0c16a599bb44ace88f19c8f61e2") -TEST_KEY = "10b128cf8a1372f30aa3697466bb55e76974e0c16a599bb44ace88f19c8f61e2" +import os def rfp(*pathcomponents): """ @@ -50,65 +52,6 @@ def rfp(*pathcomponents): return os.path.join(os.path.dirname(__file__), *pathcomponents) -def not_test_record(r: db.Record): - global TEST_KEY - if r.name == "PyTestInfo" or r.name == "TestIdentification": - return False - if r.get_property("TestIdentification") is not None: - if (r.get_property("TestIdentification").value == - TEST_KEY): - return False - return True - -def register_test(): - info = db.Info() - for info_element in info.messages: - if info_element.startswith("<Counts>"): - counts = yaml.load(info_element[8:-9], Loader=yaml.SafeLoader) - for count_element in ['records', - 'properties', - 'recordTypes', - 'files', - 'fssize']: - if counts[count_element] > 0: - raise RuntimeError("This instance of CaosDB contains entities already." - "It must be empty in order to gegister a new test.") - break - else: - raise RuntimeError("Response from server for Info could not be interpreted.") - - answer = input("This method will register your current test with key {} with the currently" - " running instance of CaosDB. Do you want to continue (y/N)?".format( - TEST_KEY)) - if answer != "y": - raise RuntimeError("Test registration aborted by user.") - - model = parse_model_from_yaml(rfp("test_model.yml")) - model.sync_data_model(noquestion=True, verbose=False) - - r = db.Record() - r.add_parent("PyTestInfo") - r.add_property("TestIdentification", TEST_KEY) - r.insert() - -@pytest.fixture -def clear_database(): - """First remove Records, then RecordTypes, then Properties, finally - files. Since there may be no entities, execute all deletions - without raising errors. - - """ - global TEST_KEY - test_record = db.execute_query("FIND Record PyTestInfo", unique=True) - if test_record.get_property("TestIdentification").value != TEST_KEY: - raise RuntimeError("Test database has not been setup for this test.") - c = db.execute_query("FIND Record") - c.extend(db.execute_query("FIND RecordType")) - c.extend(db.execute_query("FIND Property")) - c.extend(db.execute_query("FIND File")) - - c = db.Container().extend([r for r in c if not_test_record(r)]) - c.delete(raise_exception_on_error=False) @pytest.fixture diff --git a/src/newcrawler/crawl.py b/src/newcrawler/crawl.py index 434cf6c2e593441390893b0c2332d06b78b553c6..8f92632f656b6b7ab527f726645a4bedb2ac85cc 100644 --- a/src/newcrawler/crawl.py +++ b/src/newcrawler/crawl.py @@ -375,12 +375,19 @@ class Crawler(object): del flat[i] resolved_references = True + + resolved_references = True + while resolved_references and len(flat) > 0: + resolved_references = False + for i in reversed(range(len(flat))): + record = flat[i] # e.g. references an identifiable that does not exist remotely - elif self.all_references_are_existing_already(record): + if self.all_references_are_existing_already(record): to_be_inserted.append(record) self.add_identified_record_to_local_cache(record) del flat[i] resolved_references = True + if len(flat) > 0: raise RuntimeError("Could not resolve all Entity references. Circular Dependency?")