|
65 | 65 | from knowledge.services.image_documents import ImageDocumentService |
66 | 66 | from knowledge.services.incremental_sync import IncrementalDocumentSync, MergeResult, prepare_remote_paragraphs |
67 | 67 | from knowledge.services.knowledge_sync_schedule import ( |
| 68 | + DEFAULT_KNOWLEDGE_SYNC_SETTING, |
68 | 69 | deploy_knowledge_sync_job, |
69 | 70 | normalize_knowledge_sync_setting, |
70 | 71 | ) |
@@ -1160,6 +1161,64 @@ def test_replace_crawl_keeps_old_document_when_new_document_creation_fails( |
1160 | 1161 | delete_document_data.assert_not_called() |
1161 | 1162 |
|
1162 | 1163 |
|
| 1164 | +class WebKnowledgeCreationTests(SimpleTestCase): |
| 1165 | + def setUp(self): |
| 1166 | + self.save = self.enterContext(patch("knowledge.serializers.knowledge.Knowledge.save", autospec=True)) |
| 1167 | + self.enterContext(patch("knowledge.serializers.knowledge.UserResourcePermissionSerializer")) |
| 1168 | + self.enterContext(patch("knowledge.serializers.knowledge.update_resource_mapping_by_knowledge")) |
| 1169 | + self.crawl = self.enterContext(patch("knowledge.serializers.knowledge.sync_web_knowledge.delay")) |
| 1170 | + self.deploy_schedule = self.enterContext( |
| 1171 | + patch("knowledge.serializers.knowledge.deploy_knowledge_sync_job.delay") |
| 1172 | + ) |
| 1173 | + |
| 1174 | + def create_web(self, with_valid=True): |
| 1175 | + serializer = KnowledgeSerializer.Create( |
| 1176 | + data={"user_id": "00000000-0000-0000-0000-000000000012", "workspace_id": "default"} |
| 1177 | + ) |
| 1178 | + response = serializer.save_web( |
| 1179 | + { |
| 1180 | + "name": "Web docs", |
| 1181 | + "folder_id": "default", |
| 1182 | + "embedding_model_id": "00000000-0000-0000-0000-000000000013", |
| 1183 | + "source_url": "https://example.com", |
| 1184 | + "selector": ".content", |
| 1185 | + "doc_strategy": {"split": {"max_length": 1024}}, |
| 1186 | + }, |
| 1187 | + with_valid=with_valid, |
| 1188 | + ) |
| 1189 | + return self.save.call_args.args[0], response |
| 1190 | + |
| 1191 | + def test_web_creation_persists_and_returns_disabled_default_sync_setting(self): |
| 1192 | + for with_valid in (True, False): |
| 1193 | + with self.subTest(with_valid=with_valid): |
| 1194 | + self.save.reset_mock() |
| 1195 | + self.crawl.reset_mock() |
| 1196 | + knowledge, response = self.create_web(with_valid) |
| 1197 | + self.save.assert_called_once() |
| 1198 | + self.assertEqual(knowledge.meta["sync_setting"], DEFAULT_KNOWLEDGE_SYNC_SETTING) |
| 1199 | + self.assertFalse(knowledge.meta["sync_setting"]["enabled"]) |
| 1200 | + self.assertEqual(response["meta"]["sync_setting"], DEFAULT_KNOWLEDGE_SYNC_SETTING) |
| 1201 | + self.assertEqual(knowledge.meta["doc_strategy"]["split"]["max_length"], 1024) |
| 1202 | + self.crawl.assert_called_once_with( |
| 1203 | + str(knowledge.id), |
| 1204 | + "00000000-0000-0000-0000-000000000012", |
| 1205 | + "https://example.com", |
| 1206 | + ".content", |
| 1207 | + knowledge.meta["doc_strategy"], |
| 1208 | + ) |
| 1209 | + self.deploy_schedule.assert_not_called() |
| 1210 | + |
| 1211 | + def test_sync_defaults_are_independent_between_created_knowledge_bases(self): |
| 1212 | + first, _response = self.create_web() |
| 1213 | + first.meta["sync_setting"]["enabled"] = True |
| 1214 | + first.meta["sync_setting"]["time"].append("02:00") |
| 1215 | + second, _response = self.create_web() |
| 1216 | + self.assertFalse(second.meta["sync_setting"]["enabled"]) |
| 1217 | + self.assertEqual(second.meta["sync_setting"]["time"], ["01:00"]) |
| 1218 | + self.assertFalse(DEFAULT_KNOWLEDGE_SYNC_SETTING["enabled"]) |
| 1219 | + self.assertEqual(DEFAULT_KNOWLEDGE_SYNC_SETTING["time"], ["01:00"]) |
| 1220 | + |
| 1221 | + |
1163 | 1222 | class KnowledgeModelUpdateTests(SimpleTestCase): |
1164 | 1223 | @patch("knowledge.task.sync.QuerySet") |
1165 | 1224 | @patch("knowledge.serializers.knowledge.sync_replace_web_knowledge.delay") |
|
0 commit comments