"""Fixtures for follow-up research tests.""" import pytest from unittest.mock import MagicMock, patch from contextlib import contextmanager @pytest.fixture def mock_user_db_session(): """Mock the database session context manager.""" session_mock = MagicMock() @contextmanager def _mock_session(username, password=None): yield session_mock with patch( "local_deep_research.followup_research.service.get_user_db_session", side_effect=_mock_session, ): yield session_mock @pytest.fixture def mock_research_history(): """Create a mock ResearchHistory object.""" research = MagicMock() research.id = "test-parent-id" research.query = "Original research query" research.report_content = "# Research Report\n\nThis is the report content." research.research_meta = { "formatted_findings": "Finding 1\nFinding 2", "strategy_name": "standard", "all_links_of_system": [ {"title": "Source 1", "link": "https://example.com/1"}, {"title": "Source 2", "link": "https://example.com/2"}, ], } return research @pytest.fixture def mock_research_sources_service(): """Mock the ResearchSourcesService.""" service_mock = MagicMock() service_mock.get_research_sources.return_value = [ { "title": "Source 1", "link": "https://example.com/1", "snippet": "Snippet 1", }, { "title": "Source 2", "link": "https://example.com/2", "snippet": "Snippet 2", }, ] service_mock.save_research_sources.return_value = 2 with patch( "local_deep_research.followup_research.service.ResearchSourcesService", return_value=service_mock, ): yield service_mock @pytest.fixture def sample_followup_request(): """Create a sample FollowUpRequest.""" from local_deep_research.followup_research.models import FollowUpRequest return FollowUpRequest( parent_research_id="test-parent-id", question="What are the implications of these findings?", strategy="source-based", max_iterations=2, questions_per_iteration=3, ) @pytest.fixture def mock_settings_manager(): """Mock the SettingsManager.""" manager_mock = MagicMock() manager_mock.get_all_settings.return_value = { "search.search_strategy": {"value": "source-based"}, "search.iterations": {"value": 2}, "search.questions_per_iteration": {"value": 3}, "llm.provider": {"value": "ollama"}, "llm.model": {"value": "gemma3:12b"}, "search.tool": {"value": "searxng"}, } return manager_mock