Files
manual_slop/tests/test_mma_dashboard_streams.py
Ed_ d1ce0eaaeb feat(gui): implement Phases 2-5 of Comprehensive GUI UX track
- Add cost tracking with new cost_tracker.py module
- Enhance Track Proposal modal with editable titles and goals
- Add Conductor Setup summary and New Track creation form to MMA Dashboard
- Implement Task DAG editing (add/delete tickets) and track-scoped discussion
- Add visual polish: color-coded statuses, tinted progress bars, and node indicators
- Support live worker streaming from AI providers to GUI panels
- Fix numerous integration test regressions and stabilize headless service
2026-03-01 20:17:31 -05:00

90 lines
3.7 KiB
Python

from __future__ import annotations
import pytest
from unittest.mock import patch, MagicMock
from gui_2 import App
def _make_app(**kwargs):
app = MagicMock(spec=App)
app.mma_streams = kwargs.get("mma_streams", {})
app.mma_tier_usage = kwargs.get("mma_tier_usage", {
"Tier 1": {"input": 0, "output": 0, "model": "gemini-3.1-pro-preview"},
"Tier 2": {"input": 0, "output": 0, "model": "gemini-3-flash-preview"},
"Tier 3": {"input": 0, "output": 0, "model": "gemini-2.5-flash-lite"},
"Tier 4": {"input": 0, "output": 0, "model": "gemini-2.5-flash-lite"},
})
app.tracks = kwargs.get("tracks", [])
app.active_track = kwargs.get("active_track", None)
app.active_tickets = kwargs.get("active_tickets", [])
app.mma_status = kwargs.get("mma_status", "idle")
app.active_tier = kwargs.get("active_tier", None)
app.mma_step_mode = kwargs.get("mma_step_mode", False)
app._pending_mma_spawn = kwargs.get("_pending_mma_spawn", None)
app._pending_mma_approval = kwargs.get("_pending_mma_approval", None)
app._pending_ask_dialog = kwargs.get("_pending_ask_dialog", False)
app.ui_new_track_name = ""
app.ui_new_track_desc = ""
app.ui_new_track_type = "feature"
app.ui_conductor_setup_summary = ""
app.ui_epic_input = ""
app._show_add_ticket_form = False
app.ui_new_ticket_id = ""
app.ui_new_ticket_desc = ""
app.ui_new_ticket_target = ""
app.ui_new_ticket_deps = ""
app._tier_stream_last_len = {}
return app
def _make_imgui_mock():
m = MagicMock()
m.begin_table.return_value = False
m.begin_child.return_value = False
m.checkbox.return_value = (False, False)
m.input_text.side_effect = lambda label, value, *args, **kwargs: (False, value)
m.input_text_multiline.side_effect = lambda label, value, *args, **kwargs: (False, value)
m.combo.side_effect = lambda label, current_item, items, *args, **kwargs: (False, current_item)
m.collapsing_header.return_value = False
m.ImVec2.return_value = MagicMock()
return m
class TestMMADashboardStreams:
def test_tier1_renders_stream_content(self):
"""_render_tier_stream_panel for Tier 1 must call text_wrapped with the stream content."""
app = _make_app(mma_streams={"Tier 1": "hello"})
imgui_mock = _make_imgui_mock()
imgui_mock.begin_child.return_value = True
with patch("gui_2.imgui", imgui_mock):
App._render_tier_stream_panel(app, "Tier 1", "Tier 1")
text_wrapped_args = " ".join(str(c) for c in imgui_mock.text_wrapped.call_args_list)
assert "hello" in text_wrapped_args, "text_wrapped not called with stream content 'hello'"
def test_tier3_renders_worker_subheaders(self):
"""_render_tier_stream_panel for Tier 3 must render a sub-header for each worker stream key."""
app = _make_app(mma_streams={
"Tier 3 (Worker): T-001": "out1",
"Tier 3 (Worker): T-002": "out2",
})
imgui_mock = _make_imgui_mock()
imgui_mock.begin_child.return_value = True
with patch("gui_2.imgui", imgui_mock):
App._render_tier_stream_panel(app, "Tier 3", None)
text_args = " ".join(str(c) for c in imgui_mock.text.call_args_list)
assert "T-001" in text_args, "imgui.text not called with 'T-001' worker sub-header"
assert "T-002" in text_args, "imgui.text not called with 'T-002' worker sub-header"
def test_mma_dashboard_no_longer_has_strategy_box(self):
"""_render_mma_dashboard must NOT call collapsing_header with any 'Tier' string."""
app = _make_app(mma_streams={"Tier 1": "strategy text"})
imgui_mock = _make_imgui_mock()
with patch("gui_2.imgui", imgui_mock):
App._render_mma_dashboard(app)
for c in imgui_mock.collapsing_header.call_args_list:
first_arg = c.args[0] if c.args else ""
assert "Tier" not in str(first_arg), (
f"collapsing_header called with 'Tier' string — tier panels must be separate windows now"
)