Files
basicmachines-co-basic-memory/tests/mcp/test_tool_activity.py
T
phernandez 289fcf7a93 fix tests
2024-12-30 21:01:36 -06:00

152 lines
4.8 KiB
Python

"""Tests for activity tracking MCP tool."""
import pytest
from basic_memory.mcp.tools.documents import create_document
from basic_memory.mcp.tools.knowledge import create_entities
from basic_memory.mcp.tools.activity import get_recent_activity
from basic_memory.schemas.base import Entity
from basic_memory.schemas.request import CreateEntityRequest, DocumentRequest
from basic_memory.schemas.activity import ActivityType
@pytest.mark.asyncio
async def test_get_recent_activity_basic(client):
"""Test getting activity after creating some documents."""
# Create test documents
doc1 = await create_document(
DocumentRequest(
path_id="test/doc1.md",
content="Test document 1",
doc_metadata={}
)
)
doc2 = await create_document(
DocumentRequest(
path_id="test/doc2.md",
content="Test document 2",
doc_metadata={}
)
)
# Get recent activity
result = await get_recent_activity()
# Should find both documents
assert len(result.changes) == 2
assert result.summary.document_changes == 2
assert result.summary.entity_changes == 0
assert result.summary.relation_changes == 0
# Should be sorted by timestamp
timestamps = [change.timestamp for change in result.changes]
assert timestamps == sorted(timestamps, reverse=True)
# Should have both documents
paths = {change.path_id for change in result.changes}
assert "test/doc1.md" in paths
assert "test/doc2.md" in paths
@pytest.mark.asyncio
async def test_get_recent_activity_filtered(client):
"""Test activity filtering by type."""
# Create both document and entity changes
doc = await create_document(
DocumentRequest(
path_id="test/filtered_doc.md",
content="Test document",
doc_metadata={}
)
)
entity_request = CreateEntityRequest(
entities=[Entity(name="TestEntity", entity_type="test")]
)
entity = await create_entities(entity_request)
# Get only document changes
result = await get_recent_activity(
timeframe="1d",
activity_types=[ActivityType.DOCUMENT] # Use enum directly
)
# Should only find document changes
assert len(result.changes) == 1
assert result.summary.document_changes == 1
assert result.summary.entity_changes == 0
assert result.changes[0].activity_type == ActivityType.DOCUMENT
assert result.changes[0].path_id == "test/filtered_doc.md"
@pytest.mark.asyncio
async def test_get_recent_activity_content_handling(client):
"""Test content handling for different activity types."""
# Create document and entity with description
doc = await create_document(
DocumentRequest(
path_id="test/content_doc.md",
content="Document content",
doc_metadata={}
)
)
entity_request = CreateEntityRequest(
entities=[Entity(
name="ContentEntity",
entity_type="test",
description="Entity description"
)]
)
entity = await create_entities(entity_request)
# Get activity
result = await get_recent_activity(timeframe="1d")
# Find the document and entity changes
doc_changes = [c for c in result.changes if c.activity_type == ActivityType.DOCUMENT]
entity_changes = [c for c in result.changes if c.activity_type == ActivityType.ENTITY]
# Document should have no content (lives in filesystem)
assert len(doc_changes) == 1
assert doc_changes[0].content is None
# Entity should include description as content
assert len(entity_changes) == 1
assert entity_changes[0].content == "Entity description"
@pytest.mark.asyncio
async def test_get_recent_activity_multiple_types(client):
"""Test tracking activity across all types."""
# Create changes of different types
doc = await create_document(
DocumentRequest(
path_id="test/activity_doc.md",
content="Test document",
doc_metadata={}
)
)
entity_request = CreateEntityRequest(
entities=[
Entity(name="Entity1", entity_type="test"),
Entity(name="Entity2", entity_type="test")
]
)
entities = await create_entities(entity_request)
# Get all activity
result = await get_recent_activity()
# Should find all changes
assert result.summary.document_changes == 1
assert result.summary.entity_changes == 2
assert result.summary.relation_changes == 0 # No relations created
# Changes should be the right types
doc_changes = [c for c in result.changes if c.activity_type == ActivityType.DOCUMENT]
entity_changes = [c for c in result.changes if c.activity_type == ActivityType.ENTITY]
assert len(doc_changes) == 1
assert len(entity_changes) == 2