from src import app_controller from src import events from src import gui_2 from src import models from src import project_manager from src import session_logger import pytest from unittest.mock import MagicMock, patch from src import app_controller from src import events from src import gui_2 from src import models from src import project_manager from src import session_logger @pytest.fixture def mock_gui() -> gui_2.App: with ( patch('src.models.load_config', return_value={ "ai": {"provider": "gemini", "model": "model-1"}, "projects": {"paths": [], "active": ""}, "gui": {"show_windows": {}} }), patch('src.gui_2.project_manager.load_project', return_value={}), patch('src.gui_2.project_manager.migrate_from_legacy_config', return_value={}), patch('src.gui_2.project_manager.save_project'), patch('src.gui_2.session_logger.open_session'), patch('src.app_controller.AppController._init_ai_and_hooks'), patch('src.app_controller.AppController._fetch_models') ): gui = gui_2.App() return gui def test_handle_generate_send_pushes_event(mock_gui: gui_2.App) -> None: mock_gui._do_generate = MagicMock(return_value=( "full_md", "path", [], "stable_md", "disc_text" )) mock_gui.ui_ai_input = "test prompt" mock_gui.ui_files_base_dir = "." # Mock event_queue.put mock_gui.event_queue.put = MagicMock() # No need to mock asyncio.run_coroutine_threadsafe now, it's a standard thread with patch('threading.Thread') as mock_thread: mock_gui._handle_generate_send() # Verify thread was started assert mock_thread.called # To test the worker logic inside, we'd need to invoke the target function # But the controller logic itself now just starts a thread. # Let's extract the worker and run it. target_worker = mock_thread.call_args[1]['target'] target_worker() # Verify the call to event_queue.put occurred. mock_gui.event_queue.put.assert_called_once() args, kwargs = mock_gui.event_queue.put.call_args assert args[0] == "user_request" event = args[1] assert isinstance(event, events.UserRequestEvent) assert event.prompt == "test prompt" assert event.stable_md == "stable_md" assert event.disc_text == "disc_text" assert event.base_dir == "." def test_user_request_event_payload() -> None: payload = events.UserRequestEvent( prompt="hello", stable_md="md", file_items=[], disc_text="disc", base_dir="." ) d = payload.to_dict() assert d["prompt"] == "hello" assert d["stable_md"] == "md" assert d["file_items"] == [] assert d["disc_text"] == "disc" assert d["base_dir"] == "." def test_sync_event_queue() -> None: from events import SyncEventQueue q = SyncEventQueue() q.put("test_event", {"data": 123}) name, payload = q.get() assert name == "test_event" assert payload["data"] == 123