""" ANTI-SIMPLIFICATION: These tests verify core GUI state management and cross-thread event handling. They MUST NOT be simplified to just set state directly, as their entire purpose is to test the event pipeline. """ import pytest from unittest.mock import patch import sys import os from typing import Any # Ensure project root is in path for imports sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "src"))) from src.gui_2 import App def test_telemetry_data_updates_correctly(app_instance: Any) -> None: """ Tests that the _refresh_api_metrics method correctly updates the internal state for display by querying the ai_client. Verifies the boundary between GUI state and API state. """ # 1. Set the provider to anthropic app_instance._current_provider = "anthropic" # 2. Define the mock stats mock_stats = { "provider": "anthropic", "limit": 180000, "current": 135000, "percentage": 75.0, } # 3. Patch the dependencies with patch('src.ai_client.get_token_stats', return_value=mock_stats) as mock_get_stats: # 4. Call the method under test app_instance._refresh_api_metrics({}, md_content="test content") # 5. Assert the results # ANTI-SIMPLIFICATION: Must assert that the actual getter was called to prevent broken dependencies mock_get_stats.assert_called_once() # ANTI-SIMPLIFICATION: Must assert that the specific field is updated correctly in the GUI state assert app_instance._token_stats["percentage"] == 75.0 def test_performance_history_updates(app_instance: Any) -> None: """ Verify the data structure that feeds the sparkline. This ensures that the rolling buffer for performance telemetry maintains the correct size and default initialization to prevent GUI rendering crashes. """ # ANTI-SIMPLIFICATION: Verifying exactly 100 elements ensures the sparkline won't overflow assert len(app_instance.perf_history["frame_time"]) == 100 assert app_instance.perf_history["frame_time"][-1] == 0.0 def test_gui_updates_on_event(app_instance: App) -> None: """ Verifies that when an API event is received (e.g. from ai_client), the _on_api_event handler correctly updates internal metrics and queues the update to be processed by the GUI event loop. """ mock_stats = {"percentage": 50.0, "current": 500, "limit": 1000} app_instance.last_md = "mock_md" with patch('src.ai_client.get_token_stats', return_value=mock_stats): # Simulate receiving an event from the API client thread app_instance._on_api_event(payload={"text": "test"}) # Manually route event from background queue to GUI tasks (simulating event loop thread) event_name, payload = app_instance.event_queue.get() app_instance._pending_gui_tasks.append({ "action": event_name, "payload": payload }) # Process the event queue (simulating the GUI event loop tick) app_instance._process_pending_gui_tasks() # ANTI-SIMPLIFICATION: This assertion proves that the event pipeline # successfully transmitted state from the background thread to the GUI state. assert app_instance._token_stats["percentage"] == 50.0