from typing import Generator import pytest from unittest.mock import patch, MagicMock from src import ai_client from src.gui_2 import App @pytest.fixture def app_instance() -> Generator[App, None, None]: with ( patch('src.models.load_config', return_value={'ai': {'provider': 'gemini', 'model': 'gemini-2.5-flash-lite'}, 'projects': {}}), patch('src.gui_2.save_config'), patch('src.gui_2.project_manager'), patch('src.gui_2.session_logger'), patch('src.gui_2.immapp.run'), patch('src.app_controller.AppController._load_active_project'), patch('src.app_controller.AppController._fetch_models'), patch.object(App, '_load_fonts'), patch.object(App, '_post_init'), patch('src.app_controller.AppController._prune_old_logs'), patch('src.app_controller.AppController.start_services'), # Do not patch _init_ai_and_hooks to ensure _settable_fields is initialized patch('src.api_hooks.HookServer'), patch('src.ai_client.set_provider'), patch('src.ai_client.reset_session') ): app = App() yield app def test_redundant_calls_in_process_pending_gui_tasks(app_instance: App) -> None: app_instance.controller._pending_gui_tasks = [ {'action': 'set_value', 'item': 'current_provider', 'value': 'anthropic'} ] with patch('src.ai_client.set_provider') as mock_set_provider, \ patch('src.ai_client.reset_session') as mock_reset_session: app_instance.controller._process_pending_gui_tasks() assert mock_set_provider.call_count == 1 assert mock_reset_session.call_count == 1 def test_gcli_path_updates_adapter(app_instance: App) -> None: app_instance.controller.current_provider = 'gemini_cli' app_instance.controller._pending_gui_tasks = [ {'action': 'set_value', 'item': 'gcli_path', 'value': '/new/path/to/gemini'} ] # Initialize adapter if it doesn't exist (it shouldn't in mock env) ai_client._gemini_cli_adapter = None app_instance.controller._process_pending_gui_tasks() assert ai_client._gemini_cli_adapter is not None assert ai_client._gemini_cli_adapter.binary_path == '/new/path/to/gemini'