import pytest from unittest.mock import MagicMock, patch import dearpygui.dearpygui as dpg import gui_legacy from gui_legacy import App import ai_client @pytest.fixture def app_instance(): """ Fixture to create an instance of the App class for testing. It creates a real DPG context but mocks functions that would render a window or block execution. """ dpg.create_context() with patch('dearpygui.dearpygui.create_viewport'), \ patch('dearpygui.dearpygui.setup_dearpygui'), \ patch('dearpygui.dearpygui.show_viewport'), \ patch('dearpygui.dearpygui.start_dearpygui'), \ patch('gui_legacy.load_config', return_value={}), \ patch('gui_legacy.PerformanceMonitor'), \ patch('gui_legacy.shell_runner'), \ patch('gui_legacy.project_manager'), \ patch.object(App, '_load_active_project'), \ patch.object(App, '_rebuild_files_list'), \ patch.object(App, '_rebuild_shots_list'), \ patch.object(App, '_rebuild_disc_list'), \ patch.object(App, '_rebuild_disc_roles_list'), \ patch.object(App, '_rebuild_discussion_selector'), \ patch.object(App, '_refresh_project_widgets'): app = App() yield app dpg.destroy_context() def test_gui_updates_on_event(app_instance): # Patch dependencies for the test with patch('dearpygui.dearpygui.set_value') as mock_set_value, \ patch('dearpygui.dearpygui.does_item_exist', return_value=True), \ patch('dearpygui.dearpygui.configure_item'), \ patch('ai_client.get_history_bleed_stats') as mock_stats: mock_stats.return_value = {"percentage": 50.0, "current": 500, "limit": 1000} # We'll use patch.object to see if _refresh_api_metrics is called with patch.object(app_instance, '_refresh_api_metrics', wraps=app_instance._refresh_api_metrics) as mock_refresh: # Simulate event ai_client.events.emit("response_received", payload={}) # Process tasks manually app_instance._process_pending_gui_tasks() # Verify that _refresh_api_metrics was called mock_refresh.assert_called_once() # Verify that dpg.set_value was called for the metrics widgets calls = [call.args[0] for call in mock_set_value.call_args_list] assert "token_budget_bar" in calls assert "token_budget_label" in calls