import pytest from unittest.mock import AsyncMock, MagicMock, patch @pytest.fixture def mock_conv_store(): store = MagicMock() store.get = AsyncMock(return_value=[ {'role': 'user', 'content': 'What are my overdue invoices?'}, {'role': 'assistant', 'content': 'You have 3 overdue invoices.'}, ]) store.append = AsyncMock() store.count = AsyncMock(return_value=2) store.prune_old = AsyncMock() return store @pytest.fixture def mock_op_store(): store = MagicMock() store.get_recent = AsyncMock(return_value=[]) store.store = AsyncMock() store.prune_expired = AsyncMock() return store @pytest.fixture def mock_know_store(): store = MagicMock() store.get_client_profile = AsyncMock(return_value={}) store.upsert = AsyncMock() store.get = AsyncMock(return_value=None) return store @pytest.mark.asyncio async def test_build_context_returns_master_context(mock_pool, mock_conv_store, mock_op_store, mock_know_store): with patch('agent_service.memory.memory_manager.ConversationStore', return_value=mock_conv_store), \ patch('agent_service.memory.memory_manager.OperationalStore', return_value=mock_op_store), \ patch('agent_service.memory.memory_manager.KnowledgeStore', return_value=mock_know_store): from agent_service.memory.memory_manager import MemoryManager mgr = MemoryManager(pool=mock_pool, llm=None) ctx = await mgr.build_context(user_id='1', intent_hint='finance') assert ctx is not None assert hasattr(ctx, 'conversation') @pytest.mark.asyncio async def test_append_message(mock_pool, mock_conv_store, mock_op_store, mock_know_store): with patch('agent_service.memory.memory_manager.ConversationStore', return_value=mock_conv_store), \ patch('agent_service.memory.memory_manager.OperationalStore', return_value=mock_op_store), \ patch('agent_service.memory.memory_manager.KnowledgeStore', return_value=mock_know_store): from agent_service.memory.memory_manager import MemoryManager mgr = MemoryManager(pool=mock_pool, llm=None) await mgr.append_message(user_id='1', role='user', content='Hello') mock_conv_store.append.assert_awaited_once() @pytest.mark.asyncio async def test_hard_cap_enforced(mock_pool, mock_conv_store, mock_op_store, mock_know_store): mock_conv_store.count = AsyncMock(return_value=201) with patch('agent_service.memory.memory_manager.ConversationStore', return_value=mock_conv_store), \ patch('agent_service.memory.memory_manager.OperationalStore', return_value=mock_op_store), \ patch('agent_service.memory.memory_manager.KnowledgeStore', return_value=mock_know_store): from agent_service.memory.memory_manager import MemoryManager mgr = MemoryManager(pool=mock_pool, llm=None) await mgr.append_message(user_id='1', role='user', content='test') mock_conv_store.prune_old.assert_awaited()