diff --git a/tests/test_morning_review_packet_status.py b/tests/test_morning_review_packet_status.py new file mode 100644 index 000000000..abb0e0a79 --- /dev/null +++ b/tests/test_morning_review_packet_status.py @@ -0,0 +1,94 @@ +"""Tests for the morning review packet status report generator.""" + +from __future__ import annotations + +import importlib.util +from pathlib import Path + +SCRIPT_PATH = Path(__file__).resolve().parents[1] / "scripts" / "morning_review_packet_status.py" +DOC_PATH = Path(__file__).resolve().parents[1] / "docs" / "morning-review-packet-2026-04-21-status.md" + + +def load_module(): + assert SCRIPT_PATH.exists(), f"missing status script: {SCRIPT_PATH}" + spec = importlib.util.spec_from_file_location("morning_review_packet_status_test", SCRIPT_PATH) + module = importlib.util.module_from_spec(spec) + assert spec.loader is not None + spec.loader.exec_module(module) + return module + + +def sample_snapshot(): + return { + "epic": {"number": 949, "title": "Morning review packet", "state": "open"}, + "children": [ + { + "number": 950, + "title": "Verify AI Gateway provider UX + attribution headers", + "state": "open", + "open_prs": [], + }, + { + "number": 954, + "title": "Verify maps skill guest_house / camp_site / bakery expansion", + "state": "open", + "open_prs": [ + {"number": 1021, "head": "fix/954", "title": "feat: sync maps skill and verify guest_house/camp_site/bakery (#954)"} + ], + }, + { + "number": 961, + "title": "Verify web dashboard update/restart action buttons", + "state": "closed", + "open_prs": [], + }, + ], + "decomposition_issues": [ + {"number": 965, "title": "Phase 1: Landscape Analysis & Scaffolding", "state": "open"}, + {"number": 967, "title": "Phase 3: Poka-yoke Integration & Fleet Verification", "state": "closed"}, + ], + } + + +def test_extract_child_issue_numbers_from_epic_body(): + module = load_module() + body = """ +- [ ] #950 one +- [ ] #951 two +- [ ] #962 three +""" + assert module.extract_issue_numbers(body) == [950, 951, 962] + + +def test_summarize_snapshot_counts_open_closed_and_pr_backing(): + module = load_module() + summary = module.summarize_snapshot(sample_snapshot()) + + assert summary["total_children"] == 3 + assert summary["open_children"] == 2 + assert summary["closed_children"] == 1 + assert summary["open_with_pr"] == 1 + assert summary["open_without_pr"] == 1 + + +def test_render_markdown_includes_issue_matrix_and_drift_sections(): + module = load_module() + md = module.render_markdown(sample_snapshot()) + + assert "# Morning Review Packet Status — #949" in md + assert "## Child QA Matrix" in md + assert "#950" in md + assert "#954" in md + assert "#1021" in md + assert "## Unowned Open QA Issues" in md + assert "## Drift Signals" in md + assert "forge/main is still catching up to the upstream packet" in md + + +def test_committed_status_doc_exists_and_mentions_live_examples(): + assert DOC_PATH.exists(), f"missing generated status doc: {DOC_PATH}" + text = DOC_PATH.read_text(encoding="utf-8") + assert "# Morning Review Packet Status — #949" in text + assert "#954" in text + assert "#1021" in text + assert "#950" in text