import pytest from unittest.mock import AsyncMock, MagicMock from agent_service.llm.llm_router import LLMRouter, HIPAA_LOCKED_AGENTS from agent_service.llm.llm_types import LLMResponse @pytest.fixture def mock_ollama(): ollama = MagicMock() ollama.complete = AsyncMock(return_value=LLMResponse( content='test', tool_calls=[], backend_used='ollama', model_used='llama3', tokens_in=5, tokens_out=10, latency_ms=50, )) ollama.ping = AsyncMock(return_value=True) return ollama @pytest.fixture def mock_claude(): claude = MagicMock() claude.complete = AsyncMock(return_value=LLMResponse( content='test claude', tool_calls=[], backend_used='claude', model_used='claude-sonnet-4-6', tokens_in=5, tokens_out=10, latency_ms=100, )) return claude @pytest.mark.asyncio async def test_local_mode_always_ollama(mock_ollama, mock_claude): router = LLMRouter(ollama=mock_ollama, claude=mock_claude, privacy_mode='local') backend = await router.get_backend('crm_agent') assert backend == 'ollama' @pytest.mark.asyncio async def test_cloud_mode_uses_claude(mock_ollama, mock_claude): router = LLMRouter(ollama=mock_ollama, claude=mock_claude, privacy_mode='cloud') backend = await router.get_backend('crm_agent') assert backend == 'claude' @pytest.mark.asyncio async def test_hipaa_locked_always_ollama(mock_ollama, mock_claude): router = LLMRouter(ollama=mock_ollama, claude=mock_claude, privacy_mode='cloud') for agent in HIPAA_LOCKED_AGENTS: backend = await router.get_backend(agent) assert backend == 'ollama', f'{agent} should be ollama-only' @pytest.mark.asyncio async def test_cloud_mode_no_claude_fallback(mock_ollama): router = LLMRouter(ollama=mock_ollama, claude=None, privacy_mode='cloud') backend = await router.get_backend('crm_agent') assert backend == 'ollama' @pytest.mark.asyncio async def test_env_override_respected(mock_ollama, mock_claude): router = LLMRouter( ollama=mock_ollama, claude=mock_claude, privacy_mode='hybrid', env_overrides={'crm_agent': 'claude'}, ) backend = await router.get_backend('crm_agent') assert backend == 'claude' @pytest.mark.asyncio async def test_env_override_cannot_override_hipaa(mock_ollama, mock_claude): router = LLMRouter( ollama=mock_ollama, claude=mock_claude, privacy_mode='hybrid', env_overrides={'finance_agent': 'claude'}, ) backend = await router.get_backend('finance_agent') assert backend == 'ollama'