#!/bin/python # Tests for file identifiables # A. Schlemmer, 06/2021 from unittest.mock import Mock, patch import caosdb as db import pytest from caoscrawler.identifiable import Identifiable from caoscrawler.identifiable_adapters import LocalStorageIdentifiableAdapter from caosdb.cached import cache_clear from caosdb.exceptions import EmptyUniqueQueryError from pytest import raises from test_crawler import mock_get_entity_by @pytest.fixture(autouse=True) def clear_cache(): cache_clear() @patch("caoscrawler.identifiable_adapters.get_children_of_rt", new=Mock(side_effect=id)) @patch("caoscrawler.identifiable_adapters.cached_get_entity_by", new=Mock(side_effect=mock_get_entity_by)) def test_file_identifiable(): ident = LocalStorageIdentifiableAdapter() # Without a path there is no identifying information with raises(ValueError): ident.get_identifiable(db.File(), []) fp = "/test/bla/bla.txt" file_obj = db.File(path=fp) identifiable = ident.get_identifiable(file_obj) # the path is copied to the identifiable assert fp == identifiable.path assert isinstance(identifiable, Identifiable) # __eq__ function is only defined for Identifiable objects with raises(ValueError): file_obj != identifiable # since the path does not exist in the data in ident, the follwoing functions return None with raises(EmptyUniqueQueryError): ident.retrieve_identified_record_for_record(file_obj) assert ident.get_file(identifiable) is None # Try again with actual files in the store: records = ident.get_records() test_record_wrong_path = db.File(path="/bla/bla/test.txt") test_record_correct_path = db.File(path="/test/bla/bla.txt") test_record_alsocorrect_path = db.File(path="/test/bla/bla.txt") records.append(test_record_wrong_path) # Now, there is a file, but still wrong path -> result is still None identified_file = ident.get_file(file_obj) assert identified_file is None records.append(test_record_correct_path) # now there is a match identified_file = ident.get_file(file_obj) assert identified_file is not None assert identified_file.path == file_obj.path with raises(RuntimeError, match=".*unambigiously.*"): records.append(test_record_alsocorrect_path) identified_file = ident.get_file(file_obj)