"""Test that Ollama model is created with a generous timeout. The default httpx timeout is too short for complex prompts (30-60s generation). This caused socket read errors in production. The agno Ollama class uses ``timeout`` (not ``request_timeout``). """ import importlib from unittest.mock import MagicMock, patch def test_base_agent_sets_timeout(): """BaseAgent creates Ollama with timeout=300.""" # Ensure module is loaded before patching — prevents xdist ordering issues importlib.import_module("timmy.agents.base") with patch("timmy.agents.base.Ollama") as mock_ollama, patch("timmy.agents.base.Agent"): mock_ollama.return_value = MagicMock() # Import after patching to get the patched version from timmy.agents.base import BaseAgent class ConcreteAgent(BaseAgent): async def handle_message(self, message: str) -> str: return "" # Trigger Ollama construction try: ConcreteAgent( agent_id="test", name="Test", role="tester", system_prompt="You are a test agent.", tools=[], ) except Exception: pass # MCP registry may not be available # Verify Ollama was called with timeout if mock_ollama.called: _, kwargs = mock_ollama.call_args assert kwargs.get("timeout") == 300, ( f"Expected timeout=300, got {kwargs.get('timeout')}" ) def test_main_agent_sets_timeout(): """create_timmy() creates Ollama with timeout=300.""" with ( patch("timmy.agent.Ollama") as mock_ollama, patch("timmy.agent.SqliteDb"), patch("timmy.agent.Agent"), patch("timmy.agent._resolve_model_with_fallback", return_value=("llama3.2:3b", False)), patch("timmy.agent._check_model_available", return_value=True), ): mock_ollama.return_value = MagicMock() from timmy.agent import create_timmy try: create_timmy() except Exception: pass if mock_ollama.called: _, kwargs = mock_ollama.call_args assert kwargs.get("timeout") == 300, ( f"Expected timeout=300, got {kwargs.get('timeout')}" )