Private
Public Access
0
0
Files
manual_slop/tests/test_gui_kill_button.py
T
ed 0506c5da63 refactor(ticket): migrate Ticket consumers to direct field access (Phase 1)
TIER-2 READ AGENTS.md, conductor/workflow.md, conductor/edit_workflow.md,
conductor/tier2/githooks/forbidden-files.txt,
conductor/tracks/tier2_leak_prevention_20260620/spec.md,
conductor/code_styleguides/data_oriented_design.md,
conductor/code_styleguides/error_handling.md,
conductor/code_styleguides/type_aliases.md before Phase 1.

Phase 1 of metadata_promotion_20260624: migrate Ticket consumers from
t.get('key', default) / t['key'] to direct field access (t.id, t.status, etc.).

Changes:
- self.active_tickets: list[Metadata] -> list[models.Ticket]
- _deserialize_active_track_result populates self.active_tickets as Tickets
- _load_active_tickets (beads branch) constructs Ticket instances
- topological_sort signature: list[dict[str, Any]] -> list[Ticket]
- Migrated ~40 consumer sites in src/gui_2.py: _reorder_ticket,
  bulk_execute/skip/block, _cb_block_ticket, _cb_unblock_ticket,
  _dag_cycle_check_result, ticket queue rendering, DAG panel
- Migrated ~10 consumer sites in src/app_controller.py: _cb_ticket_retry,
  _cb_ticket_skip, approve_ticket, mutate_dag, _push_mma_state_update_result,
  completed count
- Removed legacy Ticket.get() compat method (Task 1.5)
- Added tests/test_metadata_promotion_phase1.py with 15 regression-guard tests
- Updated existing tests to construct Ticket instances instead of dicts

Verified: 1885 of 1910 unit tests pass (25 pre-existing failures unrelated
to Ticket migration; many are live_gui/sim tests that need a running GUI).
2026-06-25 18:20:45 -04:00

48 lines
2.2 KiB
Python

import pytest
from unittest.mock import MagicMock, patch
from src import models
def test_gui_has_kill_button_method():
from src.gui_2 import App
assert hasattr(App, '_cb_kill_ticket'), "App must have _cb_kill_ticket method"
def test_render_ticket_queue_table_columns():
with patch("src.gui_2.imgui") as mock_imgui, \
patch("src.gui_2.imscope") as mock_imscope:
mock_imgui.begin_table.return_value = True
mock_imgui.table_setup_column = MagicMock()
mock_imgui.table_headers_row = MagicMock()
mock_imgui.table_next_row = MagicMock()
mock_imgui.table_next_column = MagicMock()
mock_imgui.button.return_value = False
mock_imgui.checkbox = MagicMock(return_value=(False, False))
mock_imgui.selectable = MagicMock(return_value=(False, False))
mock_imgui.begin_drag_drop_source = MagicMock(return_value=False)
mock_imgui.begin_drag_drop_target = MagicMock(return_value=False)
mock_imgui.text = MagicMock()
mock_imgui.end_table = MagicMock()
mock_imgui.begin_combo.return_value = False
mock_imgui.ComboFlags_.height_small = 0
mock_imgui.push_style_color = MagicMock()
mock_imgui.pop_style_color = MagicMock()
mock_imgui.same_line = MagicMock()
mock_imscope.window.return_value.__enter__.return_value = (True, True)
mock_imscope.child.return_value.__enter__.return_value = True
mock_imscope.table.return_value.__enter__.return_value = True
mock_imscope.tree_node_ex.return_value.__enter__.return_value = True
mock_imscope.tab_item.return_value.__enter__.return_value = (True, True)
mock_imscope.style_color.return_value.__enter__.return_value = None
mock_imscope.style_var.return_value.__enter__.return_value = None
from src.gui_2 import App, render_ticket_queue
app = App.__new__(App)
app.active_track = MagicMock()
app.active_tickets = [models.Ticket(id="T-001", description="Test task", priority="medium", status="in_progress")]
app.ui_selected_tickets = set()
app.ui_selected_ticket_id = None
app.controller = MagicMock()
app._push_mma_state_update = MagicMock()
app._cb_kill_ticket = MagicMock()
render_ticket_queue(app)
columns_called = [call[0][0] for call in mock_imgui.table_setup_column.call_args_list]
assert "Actions" in columns_called, f"Expected Actions column, got: {columns_called}"