feat(gui): Implement event-driven API metrics updates and decouple from render loop
This commit is contained in:
@@ -53,7 +53,7 @@ def test_diagnostics_panel_updates(app_instance):
|
||||
|
||||
# We also need to mock ai_client stats
|
||||
with patch('ai_client.get_history_bleed_stats', return_value={}):
|
||||
app_instance._update_telemetry_panel()
|
||||
app_instance._update_performance_diagnostics()
|
||||
|
||||
# Verify UI updates
|
||||
mock_set_value.assert_any_call("perf_fps_text", "100.0")
|
||||
|
||||
62
tests/test_gui_events.py
Normal file
62
tests/test_gui_events.py
Normal file
@@ -0,0 +1,62 @@
|
||||
|
||||
import pytest
|
||||
from unittest.mock import MagicMock, patch
|
||||
import dearpygui.dearpygui as dpg
|
||||
import gui
|
||||
from gui 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.load_config', return_value={}), \
|
||||
patch('gui.PerformanceMonitor'), \
|
||||
patch('gui.shell_runner'), \
|
||||
patch('gui.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
|
||||
@@ -41,7 +41,7 @@ def app_instance():
|
||||
|
||||
def test_telemetry_panel_updates_correctly(app_instance):
|
||||
"""
|
||||
Tests that the _update_telemetry_panel method correctly updates
|
||||
Tests that the _update_performance_diagnostics method correctly updates
|
||||
DPG widgets based on the stats from ai_client.
|
||||
"""
|
||||
# 1. Set the provider to anthropic
|
||||
@@ -64,7 +64,7 @@ def test_telemetry_panel_updates_correctly(app_instance):
|
||||
patch('dearpygui.dearpygui.does_item_exist', return_value=True) as mock_does_item_exist:
|
||||
|
||||
# 4. Call the method under test
|
||||
app_instance._update_telemetry_panel()
|
||||
app_instance._refresh_api_metrics()
|
||||
|
||||
# 5. Assert the results
|
||||
mock_get_stats.assert_called_once()
|
||||
@@ -78,7 +78,7 @@ def test_telemetry_panel_updates_correctly(app_instance):
|
||||
|
||||
def test_cache_data_display_updates_correctly(app_instance):
|
||||
"""
|
||||
Tests that the _update_telemetry_panel method correctly updates the
|
||||
Tests that the _update_performance_diagnostics method correctly updates the
|
||||
GUI with Gemini cache statistics when the provider is set to Gemini.
|
||||
"""
|
||||
# 1. Set the provider to Gemini
|
||||
@@ -104,7 +104,7 @@ def test_cache_data_display_updates_correctly(app_instance):
|
||||
with patch('ai_client.get_history_bleed_stats', return_value={}):
|
||||
|
||||
# 4. Call the method under test
|
||||
app_instance._update_telemetry_panel()
|
||||
app_instance._refresh_api_metrics()
|
||||
|
||||
# 5. Assert the results
|
||||
mock_get_cache_stats.assert_called_once()
|
||||
|
||||
Reference in New Issue
Block a user