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}, "Tier 2": {"input": 0, "output": 0}, "Tier 3": {"input": 0, "output": 0}, "Tier 4": {"input": 0, "output": 0}, }) 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) 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.collapsing_header.return_value = False m.ImVec2.return_value = MagicMock() return m class TestMMADashboardStreams: def test_all_four_tier_headers_rendered(self): """collapsing_header must be called for all four tiers (new behaviour).""" app = _make_app(mma_streams={ "Tier 1": "strat", "Tier 2 (Tech Lead)": "lead", "Tier 3 (Worker): T-001": "work", "Tier 4 (QA)": "qa", }) imgui_mock = _make_imgui_mock() with patch("gui_2.imgui", imgui_mock): App._render_mma_dashboard(app) header_args = " ".join(str(c) for c in imgui_mock.collapsing_header.call_args_list) assert "Tier 1" in header_args, "collapsing_header not called with 'Tier 1'" assert "Tier 2" in header_args, "collapsing_header not called with 'Tier 2'" assert "Tier 3" in header_args, "collapsing_header not called with 'Tier 3'" assert "Tier 4" in header_args, "collapsing_header not called with 'Tier 4'" def test_tier3_aggregates_multiple_worker_streams(self): """Tier 3 section must render a sub-header for each worker stream key.""" app = _make_app(mma_streams={ "Tier 3 (Worker): T-001": "output1", "Tier 3 (Worker): T-002": "output2", }) imgui_mock = _make_imgui_mock() imgui_mock.collapsing_header.return_value = True imgui_mock.begin_child.return_value = True with patch("gui_2.imgui", imgui_mock): App._render_mma_dashboard(app) 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_old_single_strategy_box_removed(self): """input_text_multiline must NOT be called with '##mma_strategy' in the new design.""" 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.input_text_multiline.call_args_list: first_arg = c.args[0] if c.args else None assert first_arg != "##mma_strategy", ( "input_text_multiline called with '##mma_strategy' — old single strategy box must be removed" )