diff --git a/CHANGELOG.md b/CHANGELOG.md index b72a38fb66f016966948c2799c25219737e0fad8..1d2e913ccc5443aa000f453fa697f99725d54596 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ## ### Added ### +- `check_reference_field` function to check whether entities with provided ids + exits (for example when importing data from a table) ### Changed ### diff --git a/src/caosadvancedtools/table_importer.py b/src/caosadvancedtools/table_importer.py index 830919a1f29d49c193c7ed74b50c7b1566bbdf69..26bb86b829c4444caf792697520d4733cae3e0bc 100755 --- a/src/caosadvancedtools/table_importer.py +++ b/src/caosadvancedtools/table_importer.py @@ -31,6 +31,7 @@ import logging import pathlib from datetime import datetime +import caosdb as db import numpy as np import pandas as pd from xlrd import XLRDError @@ -56,6 +57,21 @@ def assure_name_format(name): return name +def check_reference_field(ent_id, recordtype): + if 1 != db.execute_query("COUNT {} WIHT id={}".format( + recordtype, + ent_id), + unique=True): + raise ValueError( + "No {} with the supplied id={} exists. \n" + "Please supply a valid ID.".format( + recordtype, + ent_id + )) + + return ent_id + + def yes_no_converter(val): """ converts a string to True or False if possible. diff --git a/unittests/test_h5.py b/unittests/test_h5.py index e5ae94686fe4542f6833e21e9a80f01e4257538d..360d4b28938492d0f2af6d696e39dffb1cc3fead 100644 --- a/unittests/test_h5.py +++ b/unittests/test_h5.py @@ -74,6 +74,9 @@ class H5CFoodTest(unittest.TestCase): self.assertEqual(i.name, "group_level2_aa") def test_collect_existing_structure(self): + # TODO this does probably break the code: The function will not be + # restored correctly. + # Change it to use the BaseMockUpTest real_retrieve = caosdb.apiutils.retrieve_entity_with_id caosdb.apiutils.retrieve_entity_with_id = dummy_get diff --git a/unittests/test_table_importer.py b/unittests/test_table_importer.py index fbfb13d52623e96770b535d5dd91e74d4748e2bb..9c8a379d8c12def32c04cf82c5e09c0f5f6f175c 100644 --- a/unittests/test_table_importer.py +++ b/unittests/test_table_importer.py @@ -23,6 +23,7 @@ import unittest from functools import partial from tempfile import NamedTemporaryFile +import caosdb as db import numpy as np import pandas as pd import pytest @@ -30,6 +31,7 @@ from caosadvancedtools.datainconsistency import DataInconsistencyError from caosadvancedtools.table_importer import (CSVImporter, TableImporter, TSVImporter, XLSImporter, assure_name_format, + check_reference_field, date_converter, datetime_converter, incomplete_date_converter, @@ -38,6 +40,8 @@ from caosadvancedtools.table_importer import (CSVImporter, TableImporter, win_path_list_converter, yes_no_converter) +from test_utils import BaseMockUpTest + class ConverterTest(unittest.TestCase): def test_yes_no(self): @@ -226,3 +230,34 @@ class TSVImporterTest(TableImporterTest): self.valid_df.to_csv(tmp.name, sep="\t") importer = TSVImporter(**self.importer_kwargs) importer.read_file(tmp.name) + + +class CountQueryNoneConverterTest(BaseMockUpTest): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # simulate that 0 entity exists + self.entities = ( + '<Response count="0">' + '<Query string="count record" results="0">' + '</Query>' + '</Response>' + ) + + def test_check_reference_field(self): + self.assertRaises(ValueError, check_reference_field, "1232", "Max") + + +class CountQuerySingleConverterTest(BaseMockUpTest): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # simulate that 1 entity exists + self.entities = ( + '<Response count="1">' + '<Query string="count record" results="1">' + '</Query>' + '</Response>' + ) + + def test_check_reference_field(self): + self.assertEqual(check_reference_field("1232", "Max"), + "1232") diff --git a/unittests/test_utils.py b/unittests/test_utils.py index 054d7c99069f294e9975742c1c0261fd7ebc768c..7369931799b00eba5a835458a6fad474de1d9039 100644 --- a/unittests/test_utils.py +++ b/unittests/test_utils.py @@ -32,14 +32,7 @@ from caosdb.connection.mockup import MockUpResponse, MockUpServerConnection from caosdb.exceptions import TransactionError -class ReferencesBaseTest(unittest.TestCase): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.entities = ( - '<Response><File name="test.npy" path="/some/path/test.npy' - '" id="1234"/><Query string="find record" results="1">' - '</Query></Response>') - +class BaseMockUpTest(unittest.TestCase): def setUp(self): conlogger = logging.getLogger("connection") conlogger.setLevel(level=logging.ERROR) @@ -70,6 +63,15 @@ class ReferencesBaseTest(unittest.TestCase): return log + +class ReferencesBaseTest(BaseMockUpTest): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.entities = ( + '<Response><File name="test.npy" path="/some/path/test.npy' + '" id="1234"/><Query string="find record" results="1">' + '</Query></Response>') + def test_ref(self): self.clear_log() files = get_referenced_files("test.npy", prefix=None, filename=None,