95 lines
3.2 KiB
Python
95 lines
3.2 KiB
Python
"""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
|