Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
test_file_identifiables.py 2.33 KiB
#!/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)