File size: 14,103 Bytes
86c402d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
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