From e02ebf7a65a57d69638bbcac61f64ca41079145c Mon Sep 17 00:00:00 2001 From: Ed_ Date: Thu, 5 Mar 2026 19:55:54 -0500 Subject: [PATCH] fix: Fix session API format and missing client methods --- src/api_hook_client.py | 14 +++++- tests/test_gui_stress_performance.py | 67 +++++++++++++--------------- tests/test_tiered_context.py | 2 +- 3 files changed, 44 insertions(+), 39 deletions(-) diff --git a/src/api_hook_client.py b/src/api_hook_client.py index ffa513f..0fcd9d6 100644 --- a/src/api_hook_client.py +++ b/src/api_hook_client.py @@ -53,6 +53,10 @@ class ApiHookClient: return {} return res + + + def post_project(self, project_data: dict) -> dict[str, Any]: + return self._make_request('POST', '/api/project', data=project_data) or {} def get_project(self) -> dict[str, Any]: """Retrieves the current project state.""" return self._make_request('GET', '/api/project') or {} @@ -63,7 +67,15 @@ class ApiHookClient: def post_session(self, session_entries: list[dict]) -> dict[str, Any]: """Updates the session history.""" - return self._make_request('POST', '/api/session', data={"entries": session_entries}) or {} + return self._make_request('POST', '/api/session', data={"session": {"entries": session_entries}}) or {} + + + def get_events(self) -> list[dict[str, Any]]: + res = self._make_request('GET', '/api/events') + return res.get("events", []) if res else [] + + def clear_events(self) -> list[dict[str, Any]]: + return self.get_events() def post_gui(self, payload: dict) -> dict[str, Any]: """Pushes an event to the GUI's SyncEventQueue via the /api/gui endpoint.""" diff --git a/tests/test_gui_stress_performance.py b/tests/test_gui_stress_performance.py index 4dad736..12ef206 100644 --- a/tests/test_gui_stress_performance.py +++ b/tests/test_gui_stress_performance.py @@ -2,46 +2,39 @@ import time import sys import os -# Ensure project root is in path 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.api_hook_client import ApiHookClient + def test_comms_volume_stress_performance(live_gui) -> None: - """ - Stress test: Inject many session entries and verify performance doesn't degrade. - """ - # 0. Warmup - time.sleep(5.0) - client = ApiHookClient() - # 1. Capture baseline - time.sleep(2.0) # Wait for stability - baseline_resp = client.get_performance() - baseline = baseline_resp.get('performance', {}) - baseline_ft = baseline.get('last_frame_time_ms', 0.0) - # 2. Inject 50 "dummy" session entries - # Role must match DISC_ROLES in gui_2.py (User, AI, Vendor API, System) - large_session = [] - for i in range(50): - large_session.append({ - "role": "User", - "content": f"Stress test entry {i} " * 5, - "ts": time.time(), - "collapsed": False - }) - client.post_session(large_session) - # Give it a moment to process UI updates - time.sleep(1.0) - # 3. Capture stress performance - stress_resp = client.get_performance() - stress = stress_resp.get('performance', {}) - stress_ft = stress.get('last_frame_time_ms', 0.0) - print(f"Baseline FT: {baseline_ft:.2f}ms, Stress FT: {stress_ft:.2f}ms") - # If we got valid timing, assert it's within reason - if stress_ft > 0: - assert stress_ft < 100.0, f"Stress frame time {stress_ft:.2f}ms exceeds 10fps threshold" - # Ensure the session actually updated - session_data = client.get_session() - entries = session_data.get('session', {}).get('entries', []) - assert len(entries) >= 50, f"Expected at least 50 entries, got {len(entries)}" + time.sleep(5.0) + client = ApiHookClient() + time.sleep(2.0) + baseline_resp = client.get_performance() + baseline = baseline_resp.get("performance", {}) + baseline_ft = baseline.get("last_frame_time_ms", 0.0) + large_session = [] + for i in range(50): + large_session.append( + { + "role": "User", + "content": f"Stress test entry {i} " * 5, + "ts": time.time(), + "collapsed": False, + } + ) + client.post_session(large_session) + time.sleep(1.0) + stress_resp = client.get_performance() + stress = stress_resp.get("performance", {}) + stress_ft = stress.get("last_frame_time_ms", 0.0) + print(f"Baseline FT: {baseline_ft:.2f}ms, Stress FT: {stress_ft:.2f}ms") + if stress_ft > 0: + assert stress_ft < 100.0, ( + f"Stress frame time {stress_ft:.2f}ms exceeds 10fps threshold" + ) + session_data = client.get_session() + entries = session_data.get("session", {}).get("entries", []) + assert len(entries) >= 50, f"Expected at least 50 entries, got {len(entries)}" diff --git a/tests/test_tiered_context.py b/tests/test_tiered_context.py index 36693e4..1e1369c 100644 --- a/tests/test_tiered_context.py +++ b/tests/test_tiered_context.py @@ -1,6 +1,6 @@ from typing import Any from pathlib import Path -from aggregate import build_tier1_context, build_tier2_context, build_tier3_context +from src.aggregate import build_tier1_context, build_tier2_context, build_tier3_context def test_build_tier1_context_exists() -> None: file_items = [