93 lines
3.2 KiB
Python
93 lines
3.2 KiB
Python
import pytest
|
|
import time
|
|
import os
|
|
from pathlib import Path
|
|
from src import api_hook_client
|
|
|
|
@pytest.mark.live
|
|
def test_gui_ux_event_routing(live_gui) -> None:
|
|
client = api_hook_client.ApiHookClient()
|
|
client.click("btn_reset")
|
|
time.sleep(2)
|
|
|
|
assert client.wait_for_server(timeout=15), "Hook server did not start"
|
|
|
|
# ---------------------------------------------------------------- Step 1: MMA Stream Verification
|
|
print("[SIM] Testing MMA Stream Routing...")
|
|
client.push_event('mma_stream', {
|
|
'stream_id': 'Tier 2 (Tech Lead)',
|
|
'text': 'Initial thought trace...'
|
|
})
|
|
time.sleep(1)
|
|
|
|
status = client.get_mma_status()
|
|
assert status['mma_status'] == 'running'
|
|
assert 'Tier 2 (Tech Lead)' in status['mma_streams']
|
|
print("[SIM] MMA Stream verified.")
|
|
|
|
# ---------------------------------------------------------------- Step 2: Global State Routing
|
|
print("[SIM] Testing Global State Routing...")
|
|
usage = {
|
|
'Tier 1': {'input': 10, 'output': 5, 'model': 'gemini-2.5-flash'},
|
|
'Tier 2': {'input': 20, 'output': 10, 'model': 'gemini-2.5-flash'},
|
|
'Tier 3': {'input': 0, 'output': 0, 'model': ''},
|
|
'Tier 4': {'input': 0, 'output': 0, 'model': ''}
|
|
}
|
|
client.push_event('mma_state_update', {
|
|
'status': 'simulating',
|
|
'tier_usage': usage,
|
|
'tickets': []
|
|
})
|
|
time.sleep(1)
|
|
|
|
status = client.get_mma_status()
|
|
assert status.get('mma_status') == 'simulating'
|
|
assert status.get('tier_usage', {}).get('Tier 1', {}).get('input') == 10
|
|
print("[SIM] Global state update verified.")
|
|
|
|
# ---------------------------------------------------------------- Step 3: Performance Telemetry
|
|
print("[SIM] Testing Performance Telemetry...")
|
|
# We don't push performance, we read it from the App's monitor
|
|
# But we can verify the Hook API exposes it correctly
|
|
perf = client.get_gui_diagnostics()
|
|
fps = perf.get('fps', 0.0)
|
|
total_frames = perf.get('total_frames', 0)
|
|
print(f"[SIM] Current FPS: {fps}, Total Frames: {total_frames}")
|
|
# We accept either a non-zero FPS or a significant frame count as proof of activity
|
|
assert fps >= 5.0 or total_frames > 0, f"Performance stagnation: {fps} FPS, {total_frames} frames"
|
|
print("[SIM] Performance verified.")
|
|
|
|
@pytest.mark.live
|
|
def test_gui_track_creation(live_gui) -> None:
|
|
client = api_hook_client.ApiHookClient()
|
|
client.click("btn_reset")
|
|
time.sleep(2)
|
|
|
|
assert client.wait_for_server(timeout=15)
|
|
|
|
print("[SIM] Testing Track Creation via GUI...")
|
|
track_name = f"ux_sim_test_{int(time.time())}"
|
|
client.push_event("custom_callback", {
|
|
"callback": "_cb_create_track",
|
|
"args": ["UX_SIM_TEST", "Test track created by simulation", "feature"]
|
|
})
|
|
|
|
# Wait for filesystem sync
|
|
time.sleep(3)
|
|
|
|
# Verify track exists on disk
|
|
# Path is calculated in _cb_create_track: track_id = f"{name.lower().replace(' ', '_')}_{date_suffix}"
|
|
temp_workspace = Path("tests/artifacts/live_gui_workspace")
|
|
tracks_dir = temp_workspace / "conductor" / "tracks"
|
|
assert tracks_dir.exists(), "Tracks directory not found"
|
|
|
|
found = False
|
|
for d in tracks_dir.iterdir():
|
|
if d.is_dir() and d.name.startswith("ux_sim_test"):
|
|
print(f"[SIM] Verified track directory: {d.name}")
|
|
found = True
|
|
break
|
|
|
|
assert found, "Track directory starting with ux_sim_test not found."
|
|
print("[SIM] Track creation verified.")
|