diff --git a/src/caosadvancedtools/table_importer.py b/src/caosadvancedtools/table_importer.py index cb61e8389de69a2d0d0527ad01cb8b9991b19ece..c4f2df36edbaa20c9e5e2a3689e0638137f4ac68 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 b574c867881141928ac59c2b002fb7f185dac7bb..eb841af800de86fdb1cf2d3af818e95ee6a9271c 100644 --- a/unittests/test_table_importer.py +++ b/unittests/test_table_importer.py @@ -23,22 +23,25 @@ import unittest from functools import partial from tempfile import NamedTemporaryFile +import caosdb as db import numpy as np import pandas as pd import pytest from caosadvancedtools.datainconsistency import DataInconsistencyError -from caosadvancedtools.table_importer import (XLSImporter, assure_name_format, +from caosadvancedtools.table_importer import (CSVImporter, TableImporter, + TSVImporter, XLSImporter, + assure_name_format, + check_reference_field, date_converter, datetime_converter, - TableImporter, - TSVImporter, - CSVImporter, incomplete_date_converter, + string_in_list, win_path_converter, win_path_list_converter, - string_in_list, yes_no_converter) +from test_utils import BaseMockUpTest + class ConverterTest(unittest.TestCase): def test_yes_no(self): @@ -211,3 +214,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,