diff --git a/tests/unit/test_memory_service.py b/tests/unit/test_memory_service.py new file mode 100644 index 0000000..005bdde --- /dev/null +++ b/tests/unit/test_memory_service.py @@ -0,0 +1,97 @@ +import pytest +from unittest.mock import AsyncMock, MagicMock +from memory_manager.core.services import MemoryService, SearchService, CommitService +from memory_manager.db.models import MemoryCategory + + +@pytest.fixture +def mock_repository(): + return AsyncMock() + + +@pytest.fixture +def memory_service(mock_repository): + return MemoryService(mock_repository) + + +class TestMemoryService: + @pytest.mark.asyncio + async def test_create_entry(self, memory_service, mock_repository): + mock_entry = MagicMock() + mock_entry.to_dict.return_value = { + "id": 1, + "title": "Test Entry", + "content": "Test content", + "category": "decision", + "tags": ["test"], + "agent_id": "test-agent", + "project_path": "/test", + "created_at": "2024-01-01T00:00:00", + "updated_at": "2024-01-01T00:00:00", + } + mock_repository.create_entry = AsyncMock(return_value=mock_entry) + + result = await memory_service.create_entry( + title="Test Entry", + content="Test content", + category=MemoryCategory.DECISION, + tags=["test"], + agent_id="test-agent", + project_path="/test", + ) + + assert result["title"] == "Test Entry" + assert result["id"] == 1 + mock_repository.create_entry.assert_called_once() + + @pytest.mark.asyncio + async def test_get_entry(self, memory_service, mock_repository): + mock_entry = MagicMock() + mock_entry.to_dict.return_value = {"id": 1, "title": "Test"} + mock_repository.get_entry = AsyncMock(return_value=mock_entry) + + result = await memory_service.get_entry(1) + + assert result["id"] == 1 + mock_repository.get_entry.assert_called_once_with(1) + + @pytest.mark.asyncio + async def test_get_entry_not_found(self, memory_service, mock_repository): + mock_repository.get_entry = AsyncMock(return_value=None) + + result = await memory_service.get_entry(999) + + assert result is None + + @pytest.mark.asyncio + async def test_update_entry(self, memory_service, mock_repository): + mock_entry = MagicMock() + mock_entry.to_dict.return_value = {"id": 1, "title": "Updated"} + mock_repository.update_entry = AsyncMock(return_value=mock_entry) + + result = await memory_service.update_entry(entry_id=1, title="Updated") + + assert result["title"] == "Updated" + mock_repository.update_entry.assert_called_once() + + @pytest.mark.asyncio + async def test_delete_entry(self, memory_service, mock_repository): + mock_repository.delete_entry = AsyncMock(return_value=True) + + result = await memory_service.delete_entry(1) + + assert result is True + mock_repository.delete_entry.assert_called_once_with(1) + + @pytest.mark.asyncio + async def test_list_entries(self, memory_service, mock_repository): + mock_entries = [ + MagicMock(to_dict=lambda: {"id": 1, "title": "Entry 1"}), + MagicMock(to_dict=lambda: {"id": 2, "title": "Entry 2"}), + ] + mock_repository.list_entries = AsyncMock(return_value=mock_entries) + + result = await memory_service.list_entries() + + assert len(result) == 2 + assert result[0]["id"] == 1