88from application .workflow .nodes .data_source_web_node .data_source_web_node import DataSourceWebNode
99from application .workflow .nodes .search_knowledge_node .search_knowledge_node import (
1010 _get_recalled_image_list ,
11+ _list_paragraph ,
1112 _record_recalled_items ,
1213 _reset_paragraph ,
1314)
14- from knowledge .models import SourceType
15+ from knowledge .models import Document , DocumentResourceType , Knowledge , KnowledgeType , SourceType
16+ from application .workflow .nodes .search_document_node .search_document_node import SearchDocumentNode
1517from common .utils .fork import ChildLink , Fork
1618
1719
@@ -26,6 +28,21 @@ def test_failed_web_fetch_fails_workflow_instead_of_returning_an_empty_snapshot(
2628
2729
2830class SearchKnowledgeNodeTests (SimpleTestCase ):
31+ @patch ("knowledge.services.multimodal_retrieval.QuerySet" )
32+ @patch ("application.workflow.nodes.search_knowledge_node.search_knowledge_node.native_search" )
33+ def test_workflow_paragraph_query_includes_source_fields (self , native_search , query_set ):
34+ paragraph_id = "00000000-0000-0000-0000-000000000001"
35+ native_search .return_value = [{"id" : paragraph_id , "document_id" : "image-document" }]
36+ query_set .return_value .filter .return_value .values_list .return_value = [
37+ ("image-document" , KnowledgeType .BASE , DocumentResourceType .IMAGE , "original-image-file" )
38+ ]
39+
40+ result = _list_paragraph ([{"paragraph_id" : paragraph_id }], MagicMock ())
41+
42+ self .assertEqual (result [0 ]["knowledge_type" ], KnowledgeType .BASE )
43+ self .assertEqual (result [0 ]["document_resource_type" ], DocumentResourceType .IMAGE )
44+ self .assertEqual (result [0 ]["document_image_id" ], "original-image-file" )
45+
2946 def test_image_hit_metadata_is_attached_to_recalled_paragraph (self ):
3047 paragraph_id = "00000000-0000-0000-0000-000000000001"
3148 asset_id = "00000000-0000-0000-0000-000000000002"
@@ -40,6 +57,9 @@ def test_image_hit_metadata_is_attached_to_recalled_paragraph(self):
4057 "update_time" : created_at ,
4158 "create_time" : created_at ,
4259 "meta" : {},
60+ "knowledge_type" : KnowledgeType .BASE ,
61+ "document_resource_type" : DocumentResourceType .IMAGE ,
62+ "document_image_id" : file_id ,
4363 }
4464 embedding = {
4565 "paragraph_id" : paragraph_id ,
@@ -57,6 +77,9 @@ def test_image_hit_metadata_is_attached_to_recalled_paragraph(self):
5777 self .assertEqual (result ["hit_unit_type" ], "image" )
5878 self .assertEqual (result ["hit_asset" ], asset )
5979 self .assertEqual (result ["comprehensive_score" ], 0.93 )
80+ self .assertEqual (result ["knowledge_type" ], KnowledgeType .BASE )
81+ self .assertEqual (result ["document_resource_type" ], DocumentResourceType .IMAGE )
82+ self .assertEqual (result ["document_image_id" ], file_id )
6083 self .assertEqual (_get_recalled_image_list ([result , result ]), [asset ])
6184
6285 def test_image_text_hit_adds_visual_text_to_retrieval_context (self ):
@@ -117,6 +140,48 @@ def test_does_not_record_recall_in_debug_mode(self, record_recall):
117140 record_recall .assert_not_called ()
118141
119142
143+ class SearchDocumentNodeSourceTests (SimpleTestCase ):
144+ @patch (
145+ "application.workflow.nodes.search_document_node.search_document_node.filter_workflow_knowledge" ,
146+ return_value = ["knowledge-1" ],
147+ )
148+ @patch (
149+ "application.workflow.nodes.search_document_node.search_document_node.filter_authorized_ids" ,
150+ return_value = ["knowledge-1" ],
151+ )
152+ @patch ("application.workflow.nodes.search_document_node.search_document_node.QuerySet" )
153+ def test_document_search_returns_source_fields_using_current_knowledge_type (
154+ self , query_set , _authorized , _workflow
155+ ):
156+ documents = MagicMock ()
157+ knowledge = MagicMock ()
158+ query_set .side_effect = {Document : documents , Knowledge : knowledge }.get
159+ documents .filter .return_value .values_list .return_value .__iter__ .return_value = iter (["document-1" ])
160+ documents .filter .return_value .values_list .return_value .distinct .return_value = ["knowledge-1" ]
161+ documents .filter .return_value .values .return_value = [
162+ {
163+ "id" : "document-1" ,
164+ "knowledge_id" : "knowledge-1" ,
165+ "type" : KnowledgeType .BASE ,
166+ "resource_type" : DocumentResourceType .IMAGE ,
167+ "meta" : {"source_file_id" : "original-image-file" },
168+ }
169+ ]
170+ knowledge .filter .return_value .values .return_value = [{"id" : "knowledge-1" , "type" : KnowledgeType .WEB }]
171+ node = SearchDocumentNode .__new__ (SearchDocumentNode )
172+ node .get_parameters = MagicMock (return_value = {"knowledge_id_list" : ["knowledge-1" ], "search_mode" : "custom" })
173+ node .get_workflow_parameters = MagicMock (return_value = {"workspace_id" : "default" })
174+ node .workflow_manage = MagicMock ()
175+ node .write_context = MagicMock ()
176+
177+ node .execute ()
178+
179+ output = next (call .args [1 ] for call in node .write_context .call_args_list if call .args [0 ] == "document_items" )
180+ self .assertEqual (output [0 ]["knowledge_type" ], KnowledgeType .WEB )
181+ self .assertEqual (output [0 ]["document_resource_type" ], DocumentResourceType .IMAGE )
182+ self .assertEqual (output [0 ]["document_image_id" ], "original-image-file" )
183+
184+
120185class AIChatKnowledgeImageTests (SimpleTestCase ):
121186 def setUp (self ):
122187 search_node = SimpleNamespace (id = "search" , type = "search-knowledge-node" )
0 commit comments