cognee 0.5.1.dev0__py3-none-any.whl → 0.5.2.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. cognee/__init__.py +2 -0
  2. cognee/alembic/README +1 -0
  3. cognee/alembic/env.py +107 -0
  4. cognee/alembic/script.py.mako +26 -0
  5. cognee/alembic/versions/1a58b986e6e1_enable_delete_for_old_tutorial_notebooks.py +52 -0
  6. cognee/alembic/versions/1d0bb7fede17_add_pipeline_run_status.py +33 -0
  7. cognee/alembic/versions/1daae0df1866_incremental_loading.py +48 -0
  8. cognee/alembic/versions/211ab850ef3d_add_sync_operations_table.py +118 -0
  9. cognee/alembic/versions/45957f0a9849_add_notebook_table.py +46 -0
  10. cognee/alembic/versions/46a6ce2bd2b2_expand_dataset_database_with_json_.py +333 -0
  11. cognee/alembic/versions/482cd6517ce4_add_default_user.py +30 -0
  12. cognee/alembic/versions/76625596c5c3_expand_dataset_database_for_multi_user.py +98 -0
  13. cognee/alembic/versions/8057ae7329c2_initial_migration.py +25 -0
  14. cognee/alembic/versions/9e7a3cb85175_loader_separation.py +104 -0
  15. cognee/alembic/versions/a1b2c3d4e5f6_add_label_column_to_data.py +38 -0
  16. cognee/alembic/versions/ab7e313804ae_permission_system_rework.py +236 -0
  17. cognee/alembic/versions/b9274c27a25a_kuzu_11_migration.py +75 -0
  18. cognee/alembic/versions/c946955da633_multi_tenant_support.py +137 -0
  19. cognee/alembic/versions/e1ec1dcb50b6_add_last_accessed_to_data.py +51 -0
  20. cognee/alembic/versions/e4ebee1091e7_expand_data_model_info.py +140 -0
  21. cognee/alembic.ini +117 -0
  22. cognee/api/v1/add/routers/get_add_router.py +2 -0
  23. cognee/api/v1/cognify/cognify.py +11 -6
  24. cognee/api/v1/cognify/routers/get_cognify_router.py +8 -0
  25. cognee/api/v1/config/config.py +60 -0
  26. cognee/api/v1/datasets/routers/get_datasets_router.py +45 -3
  27. cognee/api/v1/memify/routers/get_memify_router.py +2 -0
  28. cognee/api/v1/search/routers/get_search_router.py +21 -6
  29. cognee/api/v1/search/search.py +25 -5
  30. cognee/api/v1/sync/routers/get_sync_router.py +3 -3
  31. cognee/cli/commands/add_command.py +1 -1
  32. cognee/cli/commands/cognify_command.py +6 -0
  33. cognee/cli/commands/config_command.py +1 -1
  34. cognee/context_global_variables.py +5 -1
  35. cognee/eval_framework/answer_generation/answer_generation_executor.py +7 -8
  36. cognee/infrastructure/databases/cache/cache_db_interface.py +38 -1
  37. cognee/infrastructure/databases/cache/config.py +6 -0
  38. cognee/infrastructure/databases/cache/fscache/FsCacheAdapter.py +21 -0
  39. cognee/infrastructure/databases/cache/get_cache_engine.py +9 -3
  40. cognee/infrastructure/databases/cache/redis/RedisAdapter.py +60 -1
  41. cognee/infrastructure/databases/dataset_database_handler/supported_dataset_database_handlers.py +7 -0
  42. cognee/infrastructure/databases/graph/get_graph_engine.py +29 -1
  43. cognee/infrastructure/databases/graph/neo4j_driver/Neo4jAuraDevDatasetDatabaseHandler.py +62 -27
  44. cognee/infrastructure/databases/hybrid/neptune_analytics/NeptuneAnalyticsAdapter.py +17 -4
  45. cognee/infrastructure/databases/relational/sqlalchemy/SqlAlchemyAdapter.py +2 -1
  46. cognee/infrastructure/databases/vector/chromadb/ChromaDBAdapter.py +2 -0
  47. cognee/infrastructure/databases/vector/config.py +6 -0
  48. cognee/infrastructure/databases/vector/create_vector_engine.py +69 -22
  49. cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py +64 -9
  50. cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py +13 -2
  51. cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py +16 -3
  52. cognee/infrastructure/databases/vector/models/ScoredResult.py +3 -3
  53. cognee/infrastructure/databases/vector/pgvector/PGVectorAdapter.py +16 -3
  54. cognee/infrastructure/databases/vector/pgvector/PGVectorDatasetDatabaseHandler.py +86 -0
  55. cognee/infrastructure/databases/vector/pgvector/create_db_and_tables.py +81 -2
  56. cognee/infrastructure/databases/vector/vector_db_interface.py +8 -0
  57. cognee/infrastructure/files/utils/get_data_file_path.py +33 -27
  58. cognee/infrastructure/llm/prompts/extract_query_time.txt +1 -1
  59. cognee/infrastructure/llm/prompts/generate_event_entity_prompt.txt +1 -1
  60. cognee/infrastructure/llm/prompts/generate_event_graph_prompt.txt +1 -1
  61. cognee/infrastructure/llm/prompts/generate_graph_prompt.txt +2 -2
  62. cognee/infrastructure/llm/prompts/generate_graph_prompt_guided.txt +1 -1
  63. cognee/infrastructure/llm/prompts/generate_graph_prompt_oneshot.txt +2 -2
  64. cognee/infrastructure/llm/prompts/generate_graph_prompt_simple.txt +1 -1
  65. cognee/infrastructure/llm/prompts/generate_graph_prompt_strict.txt +1 -1
  66. cognee/infrastructure/llm/prompts/search_type_selector_prompt.txt +6 -6
  67. cognee/infrastructure/llm/prompts/test.txt +1 -1
  68. cognee/infrastructure/llm/prompts/translate_content.txt +19 -0
  69. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/get_llm_client.py +24 -0
  70. cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/llama_cpp/adapter.py +191 -0
  71. cognee/modules/chunking/models/DocumentChunk.py +0 -1
  72. cognee/modules/cognify/config.py +2 -0
  73. cognee/modules/data/models/Data.py +1 -0
  74. cognee/modules/engine/models/Entity.py +0 -1
  75. cognee/modules/engine/operations/setup.py +6 -0
  76. cognee/modules/graph/cognee_graph/CogneeGraph.py +150 -37
  77. cognee/modules/graph/cognee_graph/CogneeGraphElements.py +48 -2
  78. cognee/modules/graph/utils/__init__.py +1 -0
  79. cognee/modules/graph/utils/get_entity_nodes_from_triplets.py +12 -0
  80. cognee/modules/notebooks/methods/__init__.py +1 -0
  81. cognee/modules/notebooks/methods/create_notebook.py +0 -34
  82. cognee/modules/notebooks/methods/create_tutorial_notebooks.py +191 -0
  83. cognee/modules/notebooks/methods/get_notebooks.py +12 -8
  84. cognee/modules/notebooks/tutorials/cognee-basics/cell-1.md +3 -0
  85. cognee/modules/notebooks/tutorials/cognee-basics/cell-2.md +10 -0
  86. cognee/modules/notebooks/tutorials/cognee-basics/cell-3.md +7 -0
  87. cognee/modules/notebooks/tutorials/cognee-basics/cell-4.py +28 -0
  88. cognee/modules/notebooks/tutorials/cognee-basics/cell-5.py +3 -0
  89. cognee/modules/notebooks/tutorials/cognee-basics/cell-6.py +9 -0
  90. cognee/modules/notebooks/tutorials/cognee-basics/cell-7.py +17 -0
  91. cognee/modules/notebooks/tutorials/cognee-basics/config.json +4 -0
  92. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-1.md +3 -0
  93. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-10.md +3 -0
  94. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-11.md +3 -0
  95. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-12.py +3 -0
  96. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-13.md +7 -0
  97. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-14.py +6 -0
  98. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-15.md +3 -0
  99. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-16.py +7 -0
  100. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-2.md +9 -0
  101. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-3.md +7 -0
  102. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-4.md +9 -0
  103. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-5.md +5 -0
  104. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-6.py +13 -0
  105. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-7.md +3 -0
  106. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-8.md +3 -0
  107. cognee/modules/notebooks/tutorials/python-development-with-cognee/cell-9.py +31 -0
  108. cognee/modules/notebooks/tutorials/python-development-with-cognee/config.json +4 -0
  109. cognee/modules/notebooks/tutorials/python-development-with-cognee/data/copilot_conversations.json +107 -0
  110. cognee/modules/notebooks/tutorials/python-development-with-cognee/data/guido_contributions.json +976 -0
  111. cognee/modules/notebooks/tutorials/python-development-with-cognee/data/my_developer_rules.md +79 -0
  112. cognee/modules/notebooks/tutorials/python-development-with-cognee/data/pep_style_guide.md +74 -0
  113. cognee/modules/notebooks/tutorials/python-development-with-cognee/data/zen_principles.md +74 -0
  114. cognee/modules/retrieval/EntityCompletionRetriever.py +51 -38
  115. cognee/modules/retrieval/__init__.py +0 -1
  116. cognee/modules/retrieval/base_retriever.py +66 -10
  117. cognee/modules/retrieval/chunks_retriever.py +57 -49
  118. cognee/modules/retrieval/coding_rules_retriever.py +12 -5
  119. cognee/modules/retrieval/completion_retriever.py +29 -28
  120. cognee/modules/retrieval/cypher_search_retriever.py +25 -20
  121. cognee/modules/retrieval/graph_completion_context_extension_retriever.py +42 -46
  122. cognee/modules/retrieval/graph_completion_cot_retriever.py +68 -51
  123. cognee/modules/retrieval/graph_completion_retriever.py +78 -63
  124. cognee/modules/retrieval/graph_summary_completion_retriever.py +2 -0
  125. cognee/modules/retrieval/lexical_retriever.py +34 -12
  126. cognee/modules/retrieval/natural_language_retriever.py +18 -15
  127. cognee/modules/retrieval/summaries_retriever.py +51 -34
  128. cognee/modules/retrieval/temporal_retriever.py +59 -49
  129. cognee/modules/retrieval/triplet_retriever.py +31 -32
  130. cognee/modules/retrieval/utils/access_tracking.py +88 -0
  131. cognee/modules/retrieval/utils/brute_force_triplet_search.py +99 -85
  132. cognee/modules/retrieval/utils/node_edge_vector_search.py +174 -0
  133. cognee/modules/search/methods/__init__.py +1 -0
  134. cognee/modules/search/methods/get_retriever_output.py +53 -0
  135. cognee/modules/search/methods/get_search_type_retriever_instance.py +252 -0
  136. cognee/modules/search/methods/search.py +90 -215
  137. cognee/modules/search/models/SearchResultPayload.py +67 -0
  138. cognee/modules/search/types/SearchResult.py +1 -8
  139. cognee/modules/search/types/SearchType.py +1 -2
  140. cognee/modules/search/types/__init__.py +1 -1
  141. cognee/modules/search/utils/__init__.py +1 -2
  142. cognee/modules/search/utils/transform_insights_to_graph.py +2 -2
  143. cognee/modules/search/utils/{transform_context_to_graph.py → transform_triplets_to_graph.py} +2 -2
  144. cognee/modules/users/authentication/default/default_transport.py +11 -1
  145. cognee/modules/users/authentication/get_api_auth_backend.py +2 -1
  146. cognee/modules/users/authentication/get_client_auth_backend.py +2 -1
  147. cognee/modules/users/methods/create_user.py +0 -9
  148. cognee/modules/users/permissions/methods/has_user_management_permission.py +29 -0
  149. cognee/modules/visualization/cognee_network_visualization.py +1 -1
  150. cognee/run_migrations.py +48 -0
  151. cognee/shared/exceptions/__init__.py +1 -3
  152. cognee/shared/exceptions/exceptions.py +11 -1
  153. cognee/shared/usage_logger.py +332 -0
  154. cognee/shared/utils.py +12 -5
  155. cognee/tasks/cleanup/cleanup_unused_data.py +172 -0
  156. cognee/tasks/memify/extract_usage_frequency.py +613 -0
  157. cognee/tasks/summarization/models.py +0 -2
  158. cognee/tasks/temporal_graph/__init__.py +0 -1
  159. cognee/tasks/translation/__init__.py +96 -0
  160. cognee/tasks/translation/config.py +110 -0
  161. cognee/tasks/translation/detect_language.py +190 -0
  162. cognee/tasks/translation/exceptions.py +62 -0
  163. cognee/tasks/translation/models.py +72 -0
  164. cognee/tasks/translation/providers/__init__.py +44 -0
  165. cognee/tasks/translation/providers/azure_provider.py +192 -0
  166. cognee/tasks/translation/providers/base.py +85 -0
  167. cognee/tasks/translation/providers/google_provider.py +158 -0
  168. cognee/tasks/translation/providers/llm_provider.py +143 -0
  169. cognee/tasks/translation/translate_content.py +282 -0
  170. cognee/tasks/web_scraper/default_url_crawler.py +6 -2
  171. cognee/tests/cli_tests/cli_unit_tests/test_cli_commands.py +1 -0
  172. cognee/tests/cli_tests/cli_unit_tests/test_cli_edge_cases.py +3 -0
  173. cognee/tests/integration/retrieval/test_brute_force_triplet_search_with_cognify.py +62 -0
  174. cognee/tests/integration/retrieval/test_chunks_retriever.py +115 -16
  175. cognee/tests/integration/retrieval/test_graph_completion_retriever.py +13 -5
  176. cognee/tests/integration/retrieval/test_graph_completion_retriever_context_extension.py +22 -20
  177. cognee/tests/integration/retrieval/test_graph_completion_retriever_cot.py +23 -24
  178. cognee/tests/integration/retrieval/test_rag_completion_retriever.py +70 -5
  179. cognee/tests/integration/retrieval/test_structured_output.py +62 -18
  180. cognee/tests/integration/retrieval/test_summaries_retriever.py +20 -9
  181. cognee/tests/integration/retrieval/test_temporal_retriever.py +38 -8
  182. cognee/tests/integration/retrieval/test_triplet_retriever.py +13 -4
  183. cognee/tests/integration/shared/test_usage_logger_integration.py +255 -0
  184. cognee/tests/tasks/translation/README.md +147 -0
  185. cognee/tests/tasks/translation/__init__.py +1 -0
  186. cognee/tests/tasks/translation/config_test.py +93 -0
  187. cognee/tests/tasks/translation/detect_language_test.py +118 -0
  188. cognee/tests/tasks/translation/providers_test.py +151 -0
  189. cognee/tests/tasks/translation/translate_content_test.py +213 -0
  190. cognee/tests/test_chromadb.py +1 -1
  191. cognee/tests/test_cleanup_unused_data.py +165 -0
  192. cognee/tests/test_delete_by_id.py +6 -6
  193. cognee/tests/test_extract_usage_frequency.py +308 -0
  194. cognee/tests/test_kuzu.py +17 -7
  195. cognee/tests/test_lancedb.py +3 -1
  196. cognee/tests/test_library.py +1 -1
  197. cognee/tests/test_neo4j.py +17 -7
  198. cognee/tests/test_neptune_analytics_vector.py +3 -1
  199. cognee/tests/test_permissions.py +172 -187
  200. cognee/tests/test_pgvector.py +3 -1
  201. cognee/tests/test_relational_db_migration.py +15 -1
  202. cognee/tests/test_remote_kuzu.py +3 -1
  203. cognee/tests/test_s3_file_storage.py +1 -1
  204. cognee/tests/test_search_db.py +97 -110
  205. cognee/tests/test_usage_logger_e2e.py +268 -0
  206. cognee/tests/unit/api/test_get_raw_data_endpoint.py +206 -0
  207. cognee/tests/unit/eval_framework/answer_generation_test.py +4 -3
  208. cognee/tests/unit/infrastructure/databases/cache/test_cache_config.py +2 -0
  209. cognee/tests/unit/modules/graph/cognee_graph_elements_test.py +42 -2
  210. cognee/tests/unit/modules/graph/cognee_graph_test.py +329 -31
  211. cognee/tests/unit/modules/retrieval/chunks_retriever_test.py +31 -59
  212. cognee/tests/unit/modules/retrieval/graph_completion_retriever_context_extension_test.py +70 -33
  213. cognee/tests/unit/modules/retrieval/graph_completion_retriever_cot_test.py +72 -52
  214. cognee/tests/unit/modules/retrieval/graph_completion_retriever_test.py +27 -33
  215. cognee/tests/unit/modules/retrieval/rag_completion_retriever_test.py +28 -15
  216. cognee/tests/unit/modules/retrieval/summaries_retriever_test.py +37 -42
  217. cognee/tests/unit/modules/retrieval/temporal_retriever_test.py +48 -64
  218. cognee/tests/unit/modules/retrieval/test_brute_force_triplet_search.py +263 -24
  219. cognee/tests/unit/modules/retrieval/test_node_edge_vector_search.py +273 -0
  220. cognee/tests/unit/modules/retrieval/triplet_retriever_test.py +30 -16
  221. cognee/tests/unit/modules/search/test_get_search_type_retriever_instance.py +125 -0
  222. cognee/tests/unit/modules/search/test_search.py +176 -0
  223. cognee/tests/unit/modules/search/test_search_prepare_search_result_contract.py +190 -0
  224. cognee/tests/unit/modules/users/test_tutorial_notebook_creation.py +511 -297
  225. cognee/tests/unit/shared/test_usage_logger.py +241 -0
  226. cognee/tests/unit/users/permissions/test_has_user_management_permission.py +46 -0
  227. {cognee-0.5.1.dev0.dist-info → cognee-0.5.2.dev0.dist-info}/METADATA +17 -10
  228. {cognee-0.5.1.dev0.dist-info → cognee-0.5.2.dev0.dist-info}/RECORD +232 -144
  229. cognee/api/.env.example +0 -5
  230. cognee/modules/retrieval/base_graph_retriever.py +0 -24
  231. cognee/modules/search/methods/get_search_type_tools.py +0 -223
  232. cognee/modules/search/methods/no_access_control_search.py +0 -62
  233. cognee/modules/search/utils/prepare_search_result.py +0 -63
  234. cognee/tests/test_feedback_enrichment.py +0 -174
  235. {cognee-0.5.1.dev0.dist-info → cognee-0.5.2.dev0.dist-info}/WHEEL +0 -0
  236. {cognee-0.5.1.dev0.dist-info → cognee-0.5.2.dev0.dist-info}/entry_points.txt +0 -0
  237. {cognee-0.5.1.dev0.dist-info → cognee-0.5.2.dev0.dist-info}/licenses/LICENSE +0 -0
  238. {cognee-0.5.1.dev0.dist-info → cognee-0.5.2.dev0.dist-info}/licenses/NOTICE.md +0 -0
@@ -0,0 +1,176 @@
1
+ import types
2
+ from uuid import uuid4, uuid5, NAMESPACE_OID
3
+
4
+ import pytest
5
+
6
+ from cognee.modules.search.models.SearchResultPayload import SearchResultPayload
7
+ from cognee.modules.search.types import SearchType
8
+
9
+
10
+ def _make_user(user_id: str = "u1", tenant_id=None):
11
+ return types.SimpleNamespace(id=user_id, tenant_id=tenant_id)
12
+
13
+
14
+ def _make_dataset(*, name="ds", tenant_id="t1", dataset_id=None, owner_id=None):
15
+ return types.SimpleNamespace(
16
+ id=uuid5(NAMESPACE_OID, name),
17
+ name=name,
18
+ tenant_id=uuid5(NAMESPACE_OID, tenant_id),
19
+ owner_id=owner_id or uuid4(),
20
+ )
21
+
22
+
23
+ @pytest.fixture
24
+ def search_mod():
25
+ import importlib
26
+
27
+ return importlib.import_module("cognee.modules.search.methods.search")
28
+
29
+
30
+ @pytest.fixture(autouse=True)
31
+ def _patch_side_effect_boundaries(monkeypatch, search_mod):
32
+ """
33
+ Keep production logic; patch only unavoidable side-effect boundaries.
34
+ """
35
+
36
+ async def dummy_log_query(_query_text, _query_type, _user_id):
37
+ return types.SimpleNamespace(id="qid-1")
38
+
39
+ async def dummy_log_result(*_args, **_kwargs):
40
+ return None
41
+
42
+ monkeypatch.setattr(search_mod, "send_telemetry", lambda *a, **k: None)
43
+ monkeypatch.setattr(search_mod, "log_query", dummy_log_query)
44
+ monkeypatch.setattr(search_mod, "log_result", dummy_log_result)
45
+
46
+ yield
47
+
48
+
49
+ @pytest.mark.asyncio
50
+ async def test_search_access_control_returns_dataset_shaped_dicts(monkeypatch, search_mod):
51
+ user = _make_user()
52
+ ds = _make_dataset(name="ds1", tenant_id="t1")
53
+
54
+ async def dummy_authorized_search(**_kwargs):
55
+ assert _kwargs["dataset_ids"] == [ds.id]
56
+ return [
57
+ SearchResultPayload(
58
+ result_object="object",
59
+ context=["ctx"],
60
+ completion=["r"],
61
+ search_type=SearchType.CHUNKS,
62
+ dataset_name=ds.name,
63
+ dataset_id=ds.id,
64
+ dataset_tenant_id=ds.tenant_id,
65
+ )
66
+ ]
67
+
68
+ monkeypatch.setattr(search_mod, "backend_access_control_enabled", lambda: True)
69
+ monkeypatch.setattr(search_mod, "authorized_search", dummy_authorized_search)
70
+
71
+ out_non_verbose = await search_mod.search(
72
+ query_text="q",
73
+ query_type=SearchType.CHUNKS,
74
+ dataset_ids=[ds.id],
75
+ user=user,
76
+ verbose=False,
77
+ )
78
+
79
+ assert out_non_verbose == [
80
+ {
81
+ "search_result": ["r"],
82
+ "dataset_id": ds.id,
83
+ "dataset_name": "ds1",
84
+ "dataset_tenant_id": uuid5(NAMESPACE_OID, "t1"),
85
+ }
86
+ ]
87
+
88
+
89
+ @pytest.mark.asyncio
90
+ async def test_search_access_control_only_context_returns_dataset_shaped_dicts(
91
+ monkeypatch, search_mod
92
+ ):
93
+ user = _make_user()
94
+ ds = _make_dataset(name="ds1", tenant_id="t1")
95
+
96
+ async def dummy_authorized_search(**_kwargs):
97
+ return [
98
+ SearchResultPayload(
99
+ result_object="object",
100
+ context=["ctx"],
101
+ completion=None,
102
+ search_type=SearchType.CHUNKS,
103
+ dataset_name=ds.name,
104
+ dataset_id=ds.id,
105
+ dataset_tenant_id=ds.tenant_id,
106
+ )
107
+ ]
108
+
109
+ monkeypatch.setattr(search_mod, "backend_access_control_enabled", lambda: True)
110
+ monkeypatch.setattr(search_mod, "authorized_search", dummy_authorized_search)
111
+
112
+ out = await search_mod.search(
113
+ query_text="q",
114
+ query_type=SearchType.CHUNKS,
115
+ dataset_ids=[ds.id],
116
+ user=user,
117
+ only_context=True,
118
+ )
119
+
120
+ assert out == [
121
+ {
122
+ "search_result": ["ctx"],
123
+ "dataset_id": ds.id,
124
+ "dataset_name": "ds1",
125
+ "dataset_tenant_id": uuid5(NAMESPACE_OID, "t1"),
126
+ }
127
+ ]
128
+
129
+
130
+ @pytest.mark.asyncio
131
+ async def test_authorized_search_delegates_to_search_in_datasets_context(monkeypatch, search_mod):
132
+ user = _make_user()
133
+ ds = _make_dataset(name="ds1")
134
+
135
+ async def dummy_get_authorized_existing_datasets(*_args, **_kwargs):
136
+ return [ds]
137
+
138
+ expected = [
139
+ SearchResultPayload(
140
+ result_object="object",
141
+ context="text",
142
+ completion="test",
143
+ search_type=SearchType.CHUNKS,
144
+ dataset_name=ds.name,
145
+ dataset_id=ds.id,
146
+ dataset_tenant_id=ds.tenant_id,
147
+ )
148
+ ]
149
+
150
+ async def dummy_search_in_datasets_context(**_kwargs):
151
+ return [
152
+ SearchResultPayload(
153
+ result_object="object",
154
+ context="text",
155
+ completion="test",
156
+ search_type=SearchType.CHUNKS,
157
+ dataset_name=ds.name,
158
+ dataset_id=ds.id,
159
+ dataset_tenant_id=ds.tenant_id,
160
+ )
161
+ ]
162
+
163
+ monkeypatch.setattr(
164
+ search_mod, "get_authorized_existing_datasets", dummy_get_authorized_existing_datasets
165
+ )
166
+ monkeypatch.setattr(search_mod, "search_in_datasets_context", dummy_search_in_datasets_context)
167
+
168
+ out = await search_mod.authorized_search(
169
+ query_type=SearchType.CHUNKS,
170
+ query_text="q",
171
+ user=user,
172
+ dataset_ids=[ds.id],
173
+ only_context=False,
174
+ )
175
+
176
+ assert out == expected
@@ -0,0 +1,190 @@
1
+ ## The Objective of these tests is to cover the search - prepare search results behavior (later to be removed)
2
+
3
+ import types
4
+ from uuid import uuid4, uuid5, UUID, NAMESPACE_OID
5
+
6
+ import pytest
7
+ from pydantic import BaseModel
8
+
9
+ from cognee.modules.search.models.SearchResultPayload import SearchResultPayload
10
+ from cognee.modules.search.types import SearchType
11
+
12
+
13
+ class DummyDataset(BaseModel):
14
+ id: object
15
+ name: str
16
+ tenant_id: UUID | None = None
17
+ owner_id: object
18
+
19
+
20
+ def _ds(name="ds1", tenant_id=uuid5(NAMESPACE_OID, "t1")):
21
+ return DummyDataset(
22
+ id=uuid5(NAMESPACE_OID, name), name=name, tenant_id=tenant_id, owner_id=uuid4()
23
+ )
24
+
25
+
26
+ @pytest.fixture
27
+ def search_mod():
28
+ import importlib
29
+
30
+ return importlib.import_module("cognee.modules.search.methods.search")
31
+
32
+
33
+ @pytest.fixture(autouse=True)
34
+ def _patch_search_side_effects(monkeypatch, search_mod):
35
+ """
36
+ These tests validate prepare_search_result behavior *through* search.py.
37
+ We only patch unavoidable side effects (telemetry + query/result logging).
38
+ """
39
+
40
+ async def dummy_log_query(_query_text, _query_type, _user_id):
41
+ return types.SimpleNamespace(id="qid-1")
42
+
43
+ async def dummy_log_result(*_args, **_kwargs):
44
+ return None
45
+
46
+ monkeypatch.setattr(search_mod, "send_telemetry", lambda *a, **k: None)
47
+ monkeypatch.setattr(search_mod, "log_query", dummy_log_query)
48
+ monkeypatch.setattr(search_mod, "log_result", dummy_log_result)
49
+
50
+ yield
51
+
52
+
53
+ @pytest.mark.asyncio
54
+ async def test_search_backend_access_verbose(monkeypatch, search_mod):
55
+ user = types.SimpleNamespace(id="u1", tenant_id=None)
56
+ ds = _ds("ds1")
57
+
58
+ async def dummy_authorized_search(**_kwargs):
59
+ return [
60
+ SearchResultPayload(
61
+ result_object="object",
62
+ context="text",
63
+ completion="test",
64
+ search_type=SearchType.CHUNKS,
65
+ dataset_name=ds.name,
66
+ dataset_id=ds.id,
67
+ dataset_tenant_id=ds.tenant_id,
68
+ )
69
+ ]
70
+
71
+ monkeypatch.setattr(search_mod, "backend_access_control_enabled", lambda: True)
72
+ monkeypatch.setattr(search_mod, "authorized_search", dummy_authorized_search)
73
+
74
+ out = await search_mod.search(
75
+ query_text="q",
76
+ query_type=SearchType.CHUNKS,
77
+ dataset_ids=[ds.id],
78
+ user=user,
79
+ verbose=True,
80
+ )
81
+
82
+ assert out[0]["dataset_name"] == "ds1"
83
+ assert out[0]["dataset_tenant_id"] == uuid5(NAMESPACE_OID, "t1")
84
+ assert out[0]["dataset_id"] == uuid5(NAMESPACE_OID, "ds1")
85
+ assert out[0]["objects_result"] == "object"
86
+ assert out[0]["context_result"] == "text"
87
+ assert out[0]["text_result"] == "test"
88
+
89
+
90
+ @pytest.mark.asyncio
91
+ async def test_search_no_backend_access_verbose(monkeypatch, search_mod):
92
+ user = types.SimpleNamespace(id="u1", tenant_id=None)
93
+ ds = _ds("ds1")
94
+
95
+ async def dummy_authorized_search(**_kwargs):
96
+ return [
97
+ SearchResultPayload(
98
+ result_object="object",
99
+ context="text",
100
+ completion="test",
101
+ search_type=SearchType.CHUNKS,
102
+ dataset_name=ds.name,
103
+ dataset_id=ds.id,
104
+ dataset_tenant_id=ds.tenant_id,
105
+ )
106
+ ]
107
+
108
+ monkeypatch.setattr(search_mod, "backend_access_control_enabled", lambda: False)
109
+ monkeypatch.setattr(search_mod, "authorized_search", dummy_authorized_search)
110
+
111
+ out = await search_mod.search(
112
+ query_text="q",
113
+ query_type=SearchType.CHUNKS,
114
+ dataset_ids=[ds.id],
115
+ user=user,
116
+ verbose=True,
117
+ )
118
+
119
+ assert out[0]["objects_result"] == "object"
120
+ assert out[0]["context_result"] == "text"
121
+ assert out[0]["text_result"] == "test"
122
+ assert out[0].get("dataset_name") is None
123
+
124
+
125
+ @pytest.mark.asyncio
126
+ async def test_search_backend_access(monkeypatch, search_mod):
127
+ user = types.SimpleNamespace(id="u1", tenant_id=None)
128
+ ds = _ds("ds1")
129
+
130
+ async def dummy_authorized_search(**_kwargs):
131
+ return [
132
+ SearchResultPayload(
133
+ result_object="object",
134
+ context="text",
135
+ completion="test",
136
+ search_type=SearchType.CHUNKS,
137
+ dataset_name=ds.name,
138
+ dataset_id=ds.id,
139
+ dataset_tenant_id=ds.tenant_id,
140
+ )
141
+ ]
142
+
143
+ monkeypatch.setattr(search_mod, "backend_access_control_enabled", lambda: True)
144
+ monkeypatch.setattr(search_mod, "authorized_search", dummy_authorized_search)
145
+
146
+ out = await search_mod.search(
147
+ query_text="q",
148
+ query_type=SearchType.CHUNKS,
149
+ dataset_ids=[ds.id],
150
+ user=user,
151
+ )
152
+
153
+ assert out[0]["dataset_name"] == "ds1"
154
+ assert out[0]["dataset_id"] == uuid5(NAMESPACE_OID, "ds1")
155
+ assert out[0]["dataset_tenant_id"] == uuid5(NAMESPACE_OID, "t1")
156
+ assert (
157
+ out[0]["search_result"] == "test"
158
+ ) # Search result should be resolved to completion if it exists
159
+
160
+
161
+ @pytest.mark.asyncio
162
+ async def test_search_no_backend_access(monkeypatch, search_mod):
163
+ user = types.SimpleNamespace(id="u1", tenant_id=None)
164
+ ds = _ds("ds1")
165
+
166
+ async def dummy_authorized_search(**_kwargs):
167
+ return [
168
+ SearchResultPayload(
169
+ result_object="object",
170
+ context="text",
171
+ completion="test",
172
+ search_type=SearchType.CHUNKS,
173
+ dataset_name=ds.name,
174
+ dataset_id=ds.id,
175
+ dataset_tenant_id=ds.tenant_id,
176
+ )
177
+ ]
178
+
179
+ monkeypatch.setattr(search_mod, "backend_access_control_enabled", lambda: False)
180
+ monkeypatch.setattr(search_mod, "authorized_search", dummy_authorized_search)
181
+
182
+ out = await search_mod.search(
183
+ query_text="q",
184
+ query_type=SearchType.CHUNKS,
185
+ dataset_ids=[ds.id],
186
+ user=user,
187
+ )
188
+
189
+ assert isinstance(out, list)
190
+ assert out[0] == "test" # Search result should be resolved to completion if it exists