fix: adding tests

This commit is contained in:
chinu0609 2026-01-19 11:43:46 +05:30
parent ace2f016aa
commit 50ccb147c3
2 changed files with 202 additions and 168 deletions

View file

@ -13,8 +13,9 @@ from cognee.context_global_variables import backend_access_control_enabled
from cognee.modules.engine.models.node_set import NodeSet from cognee.modules.engine.models.node_set import NodeSet
from cognee.modules.graph.cognee_graph.CogneeGraphElements import Edge from cognee.modules.graph.cognee_graph.CogneeGraphElements import Edge
from cognee.modules.search.types import ( from cognee.modules.search.types import (
SearchResult, SearchResultDataset,
SearchType, SearchResult,
SearchType,
) )
from cognee.modules.search.operations import log_query, log_result from cognee.modules.search.operations import log_query, log_result
from cognee.modules.users.models import User from cognee.modules.users.models import User
@ -26,7 +27,7 @@ from cognee import __version__ as cognee_version
from .get_search_type_tools import get_search_type_tools from .get_search_type_tools import get_search_type_tools
from .no_access_control_search import no_access_control_search from .no_access_control_search import no_access_control_search
from ..utils.prepare_search_result import prepare_search_result from ..utils.prepare_search_result import prepare_search_result
from cognee.modules.retrieval.utils.access_tracking import update_node_access_timestamps # Import your function from cognee.modules.retrieval.utils.access_tracking import update_node_access_timestamps
logger = get_logger() logger = get_logger()
@ -44,11 +45,12 @@ async def search(
save_interaction: bool = False, save_interaction: bool = False,
last_k: Optional[int] = None, last_k: Optional[int] = None,
only_context: bool = False, only_context: bool = False,
use_combined_context: bool = False,
session_id: Optional[str] = None, session_id: Optional[str] = None,
wide_search_top_k: Optional[int] = 100, wide_search_top_k: Optional[int] = 100,
triplet_distance_penalty: Optional[float] = 3.5, triplet_distance_penalty: Optional[float] = 3.5,
verbose: bool = False, verbose: bool = False,
) -> Union[CombinedSearchResult, List[SearchResult]]: ) -> List[SearchResult]:
""" """
Args: Args:

View file

@ -13,9 +13,10 @@ from cognee.modules.search.types import SearchType
logger = get_logger() logger = get_logger()
async def test_textdocument_cleanup_with_sql(): async def test_all_search_types_cleanup():
""" """
End-to-end test for TextDocument cleanup based on last_accessed timestamps. End-to-end test for TextDocument cleanup based on last_accessed timestamps
across all search types.
""" """
# Enable last accessed tracking BEFORE any cognee operations # Enable last accessed tracking BEFORE any cognee operations
os.environ["ENABLE_LAST_ACCESSED"] = "true" os.environ["ENABLE_LAST_ACCESSED"] = "true"
@ -42,7 +43,7 @@ async def test_textdocument_cleanup_with_sql():
await cognee.prune.prune_data() await cognee.prune.prune_data()
await cognee.prune.prune_system(metadata=True) await cognee.prune.prune_system(metadata=True)
logger.info("🧪 Testing TextDocument cleanup based on last_accessed") logger.info("🧪 Testing TextDocument cleanup for all search types")
# Step 1: Add and cognify a test document # Step 1: Add and cognify a test document
dataset_name = "test_cleanup_dataset" dataset_name = "test_cleanup_dataset"
@ -67,65 +68,95 @@ async def test_textdocument_cleanup_with_sql():
assert dataset_id is not None, "Failed to get dataset_id from cognify result" assert dataset_id is not None, "Failed to get dataset_id from cognify result"
logger.info(f"✅ Document added and cognified. Dataset ID: {dataset_id}") logger.info(f"✅ Document added and cognified. Dataset ID: {dataset_id}")
# Step 2: Perform search to trigger last_accessed update # All available search types to test (excluding CODE)
logger.info("Triggering search to update last_accessed...") search_types_to_test = [
search_results = await cognee.search( SearchType.CHUNKS,
query_type=SearchType.CHUNKS, SearchType.SUMMARIES,
query_text="machine learning", SearchType.RAG_COMPLETION,
datasets=[dataset_name], SearchType.GRAPH_COMPLETION,
user=user, SearchType.GRAPH_SUMMARY_COMPLETION,
) SearchType.GRAPH_COMPLETION_COT,
logger.info(f"✅ Search completed, found {len(search_results)} results") SearchType.GRAPH_COMPLETION_CONTEXT_EXTENSION,
assert len(search_results) > 0, "Search should return results" SearchType.FEELING_LUCKY,
SearchType.CHUNKS_LEXICAL,
]
# Step 3: Verify last_accessed was set and get data_id # Skip search types that require special data or permissions
db_engine = get_relational_engine() skip_types = {
async with db_engine.get_async_session() as session: SearchType.CYPHER, # Requires ALLOW_CYPHER_QUERY=true
result = await session.execute( SearchType.NATURAL_LANGUAGE, # Requires ALLOW_CYPHER_QUERY=true
select(Data, DatasetData) SearchType.FEEDBACK, # Requires previous search interaction
.join(DatasetData, Data.id == DatasetData.data_id) SearchType.TEMPORAL, # Requires temporal data
.where(DatasetData.dataset_id == dataset_id) SearchType.CODING_RULES, # Requires coding rules data
) }
data_records = result.all()
assert len(data_records) > 0, "No Data records found for the dataset"
data_record = data_records[0][0]
data_id = data_record.id
# Verify last_accessed is set tested_data_ids = []
assert data_record.last_accessed is not None, (
"last_accessed should be set after search operation"
)
original_last_accessed = data_record.last_accessed # Test each search type
logger.info(f"✅ last_accessed verified: {original_last_accessed}") for search_type in search_types_to_test:
if search_type in skip_types:
logger.info(f"⏭️ Skipping {search_type.value} (requires special setup)")
continue
logger.info(f"🔍 Testing {search_type.value} search...")
try:
# Perform search to trigger last_accessed update
search_results = await cognee.search(
query_type=search_type,
query_text="machine learning",
datasets=[dataset_name],
user=user,
)
logger.info(f"{search_type.value} search completed, found {len(search_results)} results")
# Verify last_accessed was set
db_engine = get_relational_engine()
async with db_engine.get_async_session() as session:
result = await session.execute(
select(Data, DatasetData)
.join(DatasetData, Data.id == DatasetData.data_id)
.where(DatasetData.dataset_id == dataset_id)
)
data_records = result.all()
assert len(data_records) > 0, "No Data records found for the dataset"
data_record = data_records[0][0]
data_id = data_record.id
# Verify last_accessed is set
assert data_record.last_accessed is not None, (
f"last_accessed should be set after {search_type.value} search operation"
)
original_last_accessed = data_record.last_accessed
logger.info(f"{search_type.value} last_accessed verified: {original_last_accessed}")
if data_id not in tested_data_ids:
tested_data_ids.append(data_id)
except Exception as e:
logger.warning(f"⚠️ {search_type.value} search failed: {str(e)}")
continue
# Step 3: Test cleanup with aged timestamps
from cognee.tasks.cleanup.cleanup_unused_data import cleanup_unused_data
# Step 4: Manually age the timestamp
minutes_threshold = 30 minutes_threshold = 30
aged_timestamp = datetime.now(timezone.utc) - timedelta(minutes=minutes_threshold + 10) aged_timestamp = datetime.now(timezone.utc) - timedelta(minutes=minutes_threshold + 10)
async with db_engine.get_async_session() as session: # Age all tested data records
stmt = update(Data).where(Data.id == data_id).values(last_accessed=aged_timestamp) db_engine = get_relational_engine()
await session.execute(stmt) for data_id in tested_data_ids:
await session.commit() async with db_engine.get_async_session() as session:
stmt = update(Data).where(Data.id == data_id).values(last_accessed=aged_timestamp)
# Verify timestamp was updated await session.execute(stmt)
async with db_engine.get_async_session() as session: await session.commit()
result = await session.execute(select(Data).where(Data.id == data_id))
updated_data = result.scalar_one_or_none()
assert updated_data is not None, "Data record should exist"
retrieved_timestamp = updated_data.last_accessed
if retrieved_timestamp.tzinfo is None:
retrieved_timestamp = retrieved_timestamp.replace(tzinfo=timezone.utc)
assert retrieved_timestamp == aged_timestamp, "Timestamp should be updated to aged value"
# Step 5: Test cleanup (document-level is now the default)
from cognee.tasks.cleanup.cleanup_unused_data import cleanup_unused_data
# First do a dry run # First do a dry run
logger.info("Testing dry run...") logger.info("Testing dry run...")
dry_run_result = await cleanup_unused_data(minutes_threshold=10, dry_run=True, user_id=user.id) dry_run_result = await cleanup_unused_data(minutes_threshold=10, dry_run=True, user_id=user.id)
# Debug: Print the actual result
logger.info(f"Dry run result: {dry_run_result}") logger.info(f"Dry run result: {dry_run_result}")
assert dry_run_result["status"] == "dry_run", ( assert dry_run_result["status"] == "dry_run", (
@ -146,20 +177,21 @@ async def test_textdocument_cleanup_with_sql():
f"✅ Cleanup completed. Deleted {cleanup_result['deleted_count']['documents']} documents" f"✅ Cleanup completed. Deleted {cleanup_result['deleted_count']['documents']} documents"
) )
# Step 6: Verify deletion # Step 4: Verify deletion
async with db_engine.get_async_session() as session: for data_id in tested_data_ids:
deleted_data = ( async with db_engine.get_async_session() as session:
await session.execute(select(Data).where(Data.id == data_id)) deleted_data = (
).scalar_one_or_none() await session.execute(select(Data).where(Data.id == data_id))
assert deleted_data is None, "Data record should be deleted" ).scalar_one_or_none()
logger.info("✅ Confirmed: Data record was deleted") assert deleted_data is None, f"Data record {data_id} should be deleted"
logger.info("🎉 All cleanup tests passed!") logger.info("✅ Confirmed: All tested data records were deleted")
logger.info("🎉 All cleanup tests passed for all search types!")
return True return True
if __name__ == "__main__": if __name__ == "__main__":
import asyncio import asyncio
success = asyncio.run(test_textdocument_cleanup_with_sql()) success = asyncio.run(test_all_search_types_cleanup())
exit(0 if success else 1) exit(0 if success else 1)