diff --git a/integrationtests/test_issues.py b/integrationtests/test_issues.py index 76392f3a4ce20d7ed6b6ccc30c79f1ce400001f7..38d00a5e249a711beb2b48e783efb058cd07ad36 100644 --- a/integrationtests/test_issues.py +++ b/integrationtests/test_issues.py @@ -22,12 +22,15 @@ from caoscrawler.crawl import Crawler from caoscrawler.identifiable import Identifiable from caoscrawler.identifiable_adapters import CaosDBIdentifiableAdapter from caoscrawler.scanner import (create_converter_registry, - scan_structure_elements) + scan_structure_elements, + _load_definition_from_yaml_dict) from caoscrawler.structure_elements import DictElement from linkahead.cached import cache_clear from linkahead.utils.register_tests import clear_database, set_test_key from pytest import fixture, mark, raises +import yaml + set_test_key("10b128cf8a1372f30aa3697466bb55e76974e0c16a599bb44ace88f19c8f61e2") @@ -328,3 +331,55 @@ def test_indiscale_87(clear_database): print(db.apiutils.compare_entities(rec, retrieved)) assert db.apiutils.empty_diff(rec, retrieved) print("---") + + +def test_issue_16(clear_database): + """ + This is another a test for: + https://gitlab.indiscale.com/caosdb/src/caosdb-crawler/-/issues/16 + + In addition to the two unit tests for recursive definition in `test_scanner.py` this system test + tests whether recursively defined records can be synchronized correctly using the crawler. + """ + recursive_yaml = """ +FirstConverter: + type: DictElement + records: + Experiment: + subtree: + Converter: + type: DictElement + records: + Block: + Experiment: $Experiment + Experiment: + Block: $Block + """ + + crawler_definition = _load_definition_from_yaml_dict( + [yaml.load(recursive_yaml, Loader=yaml.SafeLoader)]) + converter_registry = create_converter_registry(crawler_definition) + + data = {"data": { + "value_with_unit": "1.1 m", + "array_with_units": [ + "1.1 cm", + "2.2 cm" + ] + }} + records = scan_structure_elements(DictElement(name="", value=data), crawler_definition, + converter_registry) + + rt_exp = db.RecordType(name="Experiment").insert() + rt_block = db.RecordType(name="Block").insert() + + ident = CaosDBIdentifiableAdapter() + ident.load_from_yaml_object(yaml.safe_load(""" +Experiment: +- Block +Block: +- Experiment +""")) + + crawler = Crawler(identifiableAdapter=ident) + crawler.synchronize(crawled_data=records) diff --git a/unittests/test_scanner.py b/unittests/test_scanner.py index b93d5f984c0e37a2cff1c243a59e3f26eedf3ace..d2003be1692b30d50849b9efa82a3918a44343dc 100644 --- a/unittests/test_scanner.py +++ b/unittests/test_scanner.py @@ -409,7 +409,8 @@ def test_units(): def test_recursive_definition(): """ - + This is basically a test for: + https://gitlab.indiscale.com/caosdb/src/caosdb-crawler/-/issues/16 """ recursive_yaml = """ @@ -448,8 +449,12 @@ Converter: def test_recursive_definition_2(): """ - This is basically a test for: + This is another a test for: https://gitlab.indiscale.com/caosdb/src/caosdb-crawler/-/issues/16 + + It defines Experiment on a different level, therefore allowing the recursive definition. + This is, however, no workaround for test_recursive_definition as a bidirectional link on the + same level is still not achieved. """ recursive_yaml = """