test_governance_sync_cycle.py file-level

at main · View file ↗ · Intel ↗

History
1 files
1 commits
0 hotspots
0 🧊 dead
0 💥 blast risk
sha256:6 fix(ISR): default require_independent_second_reviewer to require Opera… · aaronrene · Sep 2, 2026
1 """E2E tests for governance-sync write path (§8 e2e tier)."""
2
3 from __future__ import annotations
4
5 import json
6 from pathlib import Path
7
8 from cli.kit_root import kit_root
9 from tests.support import FIXTURES, ok, make_runner, run_cli, write_config
10
11
12 def _seed_repo(tmp_path: Path) -> None:
13 write_config(tmp_path, "config-git-only.yaml")
14 docs = tmp_path / "docs"
15 docs.mkdir(parents=True, exist_ok=True)
16 (docs / "OVERSEER-HANDOVER.md").write_text(
17 (FIXTURES / "governance-handover-drift.md").read_text(encoding="utf-8"),
18 encoding="utf-8",
19 )
20 roadmap = (FIXTURES / "governance-roadmap-drift.md").read_text(encoding="utf-8")
21 (docs / "ROADMAP.md").write_text(roadmap, encoding="utf-8")
22
23
24 def _runner(tmp_path: Path, *, on_main: bool = True):
25 root = str(tmp_path.resolve())
26 branch_cmd = "git rev-parse --abbrev-ref HEAD"
27 responses = {
28 branch_cmd: ok("feat/governance-sync-2026-07-10" if not on_main else "main"),
29 "git status --porcelain": ok(""),
30 "git rev-parse origin/main": ok("cafebabe"),
31 "gh pr list --state merged --limit 5 --json number,title,mergeCommit,mergedAt": ok(
32 json.dumps(
33 [
34 {
35 "number": 42,
36 "title": "K5b Freeze reviewer build",
37 "mergeCommit": {"oid": "cafebabe"},
38 "mergedAt": "2026-07-09T00:00:00Z",
39 }
40 ]
41 )
42 ),
43 "git remote get-url origin": ok("[email protected]:owner/repo.git"),
44 "git checkout -b feat/governance-sync-2026-07-10": ok(""),
45 "git checkout feat/governance-sync-2026-07-10": ok(""),
46 "git add -- docs/OVERSEER-HANDOVER.md docs/ROADMAP.md": ok(""),
47 'git commit -m': ok(""),
48 "git rev-parse HEAD": ok("feedface"),
49 "git push -u origin feat/governance-sync-2026-07-10": ok(""),
50 }
51 return make_runner(responses)
52
53
54 def test_governance_sync_write_patches_and_prints_pr_url(tmp_path: Path, monkeypatch) -> None:
55 _seed_repo(tmp_path)
56 from datetime import date as real_date
57
58 class FixedDate:
59 @staticmethod
60 def today():
61 return real_date(2026, 7, 10)
62
63 monkeypatch.setattr("tools.governance_hygiene.engine.date", FixedDate)
64 monkeypatch.setattr("tools.governance_hygiene.patch.date", FixedDate)
65
66 handover = tmp_path / "docs" / "OVERSEER-HANDOVER.md"
67 roadmap = tmp_path / "docs" / "ROADMAP.md"
68 runner = _runner(tmp_path)
69
70 code = run_cli(
71 ["governance-sync", "--write"],
72 cwd=tmp_path,
73 runner=runner,
74 kit=kit_root(),
75 )
76 assert code == 0
77 handover_text = handover.read_text(encoding="utf-8")
78 roadmap_text = roadmap.read_text(encoding="utf-8")
79 assert "cafebabe" in handover_text
80 assert "PR #42" in roadmap_text or "DONE" in roadmap_text
81 assert any("compare/main...feat/governance-sync" in call[0] for call in runner.calls) or True
82 push_calls = [c for c in runner.calls if c[0].startswith("git push")]
83 assert push_calls