Spaces:
Sleeping
Sleeping
import uuid | |
from uuid import UUID | |
from ntr_text_fragmentation.models.linker_entity import LinkerEntity | |
from tests.custom_entity import CustomEntity | |
class TestEntity: | |
"""Набор тестов для проверки класса LinkerEntity.""" | |
def test_create_entity(self): | |
"""Тест создания объекта LinkerEntity с заданными параметрами.""" | |
entity_id = uuid.uuid4() | |
name = "Тестовая сущность" | |
text = "Это текст тестовой сущности" | |
in_search_text = "Текст для поиска" | |
metadata = {"key": "value"} | |
entity = LinkerEntity( | |
id=entity_id, | |
name=name, | |
text=text, | |
in_search_text=in_search_text, | |
metadata=metadata | |
) | |
assert entity.id == entity_id | |
assert entity.name == name | |
assert entity.text == text | |
assert entity.in_search_text == in_search_text | |
assert entity.metadata == metadata | |
assert entity.type == "Entity" # Проверка значения по умолчанию | |
assert entity.source_id is None # Проверка опциональных полей | |
assert entity.target_id is None | |
assert entity.number_in_relation is None | |
assert entity.is_link() is False # Не является связью | |
def test_create_entity_with_link_fields(self): | |
"""Тест создания объекта LinkerEntity с полями связи.""" | |
entity_id = uuid.uuid4() | |
source_id = uuid.uuid4() | |
target_id = uuid.uuid4() | |
entity = LinkerEntity( | |
id=entity_id, | |
name="Тестовая связывающая сущность", | |
text="Это текст связывающей сущности", | |
in_search_text="Текст для поиска", | |
metadata={"key": "value"}, | |
source_id=source_id, | |
target_id=target_id, | |
number_in_relation=1 | |
) | |
assert entity.id == entity_id | |
assert entity.source_id == source_id | |
assert entity.target_id == target_id | |
assert entity.number_in_relation == 1 | |
assert entity.is_link() is True # Является связью | |
def test_entity_fixture(self, sample_entity): | |
"""Тест использования фикстуры с предустановленными значениями.""" | |
assert sample_entity.id == UUID('12345678-1234-5678-1234-567812345678') | |
assert sample_entity.name == "Тестовая сущность" | |
assert sample_entity.text == "Текст тестовой сущности" | |
assert sample_entity.in_search_text is None # По умолчанию None | |
assert sample_entity.metadata == {"test_key": "test_value"} | |
assert sample_entity.type == "Entity" | |
assert sample_entity.is_link() is False | |
def test_auto_id_generation(self): | |
"""Тест автоматической генерации ID, если он не указан.""" | |
entity = LinkerEntity( | |
id=None, | |
name="Тест", | |
text="Текст", | |
metadata={} | |
) | |
assert entity.id is not None | |
assert isinstance(entity.id, UUID) | |
def test_invalid_link_fields(self): | |
"""Тест создания сущности с некорректными полями связи.""" | |
# Пробуем создать сущность только с source_id | |
try: | |
LinkerEntity( | |
id=uuid.uuid4(), | |
name="Некорректная сущность", | |
text="Текст некорректной сущности", | |
metadata={}, | |
source_id=uuid.uuid4() | |
) | |
assert False, "Создание сущности только с source_id должно вызывать исключение" | |
except ValueError: | |
pass | |
# Пробуем создать сущность только с target_id | |
try: | |
LinkerEntity( | |
id=uuid.uuid4(), | |
name="Некорректная сущность", | |
text="Текст некорректной сущности", | |
metadata={}, | |
target_id=uuid.uuid4() | |
) | |
assert False, "Создание сущности только с target_id должно вызывать исключение" | |
except ValueError: | |
pass | |
def test_custom_type(self): | |
"""Тест использования пользовательского типа.""" | |
custom_type = "CustomEntity" | |
entity = LinkerEntity( | |
id=uuid.uuid4(), | |
name="Тест", | |
text="Текст", | |
metadata={}, | |
type=custom_type | |
) | |
assert entity.type == custom_type | |
def test_to_string(self): | |
"""Тест метода __str__.""" | |
# Тест стандартного вывода | |
entity = LinkerEntity( | |
id=uuid.uuid4(), | |
name="Тест", | |
text="Текст", | |
metadata={} | |
) | |
expected_string = "Тест: Текст" | |
assert str(entity) == expected_string | |
# Тест с использованием in_search_text | |
entity_with_search = LinkerEntity( | |
id=uuid.uuid4(), | |
name="Тест", | |
text="Текст", | |
in_search_text="Текст для поиска", | |
metadata={} | |
) | |
assert str(entity_with_search) == "Текст для поиска" | |
def test_compare_same_entities(self): | |
"""Тест сравнения одинаковых сущностей.""" | |
entity_id = uuid.uuid4() | |
name = "Сущность" | |
text = "Текст" | |
entity_type = "TestEntity" | |
entity1 = LinkerEntity( | |
id=entity_id, | |
name=name, | |
text=text, | |
in_search_text="Текст для поиска 1", | |
metadata={"a": 1}, | |
type=entity_type | |
) | |
entity2 = LinkerEntity( | |
id=entity_id, | |
name=name, | |
text=text, | |
in_search_text="Текст для поиска 2", # Этот параметр не учитывается в сравнении | |
metadata={"b": 2}, # Этот параметр не учитывается в сравнении | |
type=entity_type | |
) | |
assert entity1 == entity2 | |
def test_compare_different_entities(self, sample_entity): | |
"""Тест сравнения разных сущностей.""" | |
# Проверка с другим ID | |
different_id_entity = LinkerEntity( | |
id=uuid.uuid4(), | |
name=sample_entity.name, | |
text=sample_entity.text, | |
metadata=sample_entity.metadata | |
) | |
assert sample_entity != different_id_entity | |
# Проверка с другим именем | |
different_name_entity = LinkerEntity( | |
id=sample_entity.id, | |
name="Другое имя", | |
text=sample_entity.text, | |
metadata=sample_entity.metadata | |
) | |
assert sample_entity != different_name_entity | |
# Проверка с другим текстом | |
different_text_entity = LinkerEntity( | |
id=sample_entity.id, | |
name=sample_entity.name, | |
text="Другой текст", | |
metadata=sample_entity.metadata | |
) | |
assert sample_entity != different_text_entity | |
# Проверка с другим типом | |
different_type_entity = LinkerEntity( | |
id=sample_entity.id, | |
name=sample_entity.name, | |
text=sample_entity.text, | |
metadata=sample_entity.metadata, | |
type="ДругойТип" | |
) | |
assert sample_entity != different_type_entity | |
def test_compare_with_other_class(self, sample_entity): | |
"""Тест сравнения с объектом другого класса.""" | |
# Создаем объект другого класса | |
class OtherClass: | |
pass | |
other = OtherClass() | |
assert sample_entity != other | |
def test_serialize(self, sample_custom_entity): | |
"""Тест метода serialize для кастомного класса-наследника Entity.""" | |
# Сериализуем объект | |
serialized = sample_custom_entity.serialize() | |
# Проверяем, что сериализованный объект - это базовый Entity | |
assert isinstance(serialized, LinkerEntity) | |
assert serialized.id == sample_custom_entity.id | |
assert serialized.name == "Тестовый кастомный объект" | |
assert serialized.text == "Текст кастомного объекта" | |
# Проверяем, что тип соответствует имени класса согласно новой логике | |
assert serialized.type == "CustomEntity" | |
# Проверяем, что кастомные поля автоматически сохранены в метаданных | |
assert "_custom_field1" in serialized.metadata | |
assert "_custom_field2" in serialized.metadata | |
assert serialized.metadata["_custom_field1"] == "custom_value" | |
assert serialized.metadata["_custom_field2"] == 42 | |
assert serialized.metadata["original_key"] == "original_value" | |
def test_deserialize(self): | |
"""Тест метода deserialize для кастомного класса-наследника Entity.""" | |
# Создаем базовый Entity с метаданными, как будто это сериализованный CustomEntity | |
entity_id = uuid.uuid4() | |
serialized_entity = LinkerEntity( | |
id=entity_id, | |
name="Тестовый кастомный объект", | |
text="Текст кастомного объекта", | |
in_search_text="Текст для поиска", | |
metadata={ | |
"_custom_field1": "custom_value", | |
"_custom_field2": 42, | |
"original_key": "original_value" | |
}, | |
type="CustomEntity" # Используем имя класса при сериализации | |
) | |
# Десериализуем объект | |
template = CustomEntity( | |
id=uuid.uuid4(), # Не важно, будет заменено | |
name="", | |
text="", | |
in_search_text=None, | |
metadata={}, | |
custom_field1="", | |
custom_field2=0 | |
) | |
deserialized = template.deserialize(serialized_entity) | |
# Проверяем, что десериализованный объект корректно восстановил все поля | |
assert isinstance(deserialized, CustomEntity) | |
assert deserialized.id == entity_id | |
assert deserialized.name == "Тестовый кастомный объект" | |
assert deserialized.text == "Текст кастомного объекта" | |
assert deserialized.in_search_text == "Текст для поиска" | |
assert deserialized.custom_field1 == "custom_value" | |
assert deserialized.custom_field2 == 42 | |
assert deserialized.metadata == {"original_key": "original_value"} | |
def test_serialize_deserialize_roundtrip(self, sample_custom_entity): | |
"""Тест полного цикла сериализации и десериализации.""" | |
# Полный цикл сериализация -> десериализация | |
serialized = sample_custom_entity.serialize() | |
deserialized = sample_custom_entity.deserialize(serialized) | |
# Проверяем, что объект после полного цикла идентичен исходному | |
assert deserialized == sample_custom_entity | |
assert deserialized.id == sample_custom_entity.id | |
assert deserialized.name == sample_custom_entity.name | |
assert deserialized.text == sample_custom_entity.text | |
assert deserialized.in_search_text == sample_custom_entity.in_search_text | |
assert deserialized.metadata == sample_custom_entity.metadata | |
assert deserialized.type == sample_custom_entity.type | |
assert deserialized.custom_field1 == sample_custom_entity.custom_field1 | |
assert deserialized.custom_field2 == sample_custom_entity.custom_field2 | |
def test_static_deserialize_method(self, sample_custom_entity): | |
"""Тест статического метода deserialize класса LinkerEntity.""" | |
# CustomEntity уже зарегистрирован через декоратор @register_entity | |
# Сериализуем объект | |
serialized = sample_custom_entity.serialize() | |
# Десериализуем через статический метод LinkerEntity.deserialize | |
deserialized = LinkerEntity.deserialize(serialized) | |
# Проверяем, что десериализация прошла правильно | |
assert isinstance(deserialized, CustomEntity) | |
assert deserialized == sample_custom_entity | |
assert deserialized.id == sample_custom_entity.id | |
assert deserialized.name == sample_custom_entity.name | |
assert deserialized.text == sample_custom_entity.text | |
assert deserialized.custom_field1 == sample_custom_entity.custom_field1 | |
assert deserialized.custom_field2 == sample_custom_entity.custom_field2 |