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