from pathlib import Path import scripts.decisions_lib as dl FIX = Path(__file__).parent / "fixtures" / "sample_decisions.md" def test_parses_migrated_record(): recs = dl.parse_file(FIX) migrated = [r for r in recs if r.key == "ci.runner-placement"] assert len(migrated) == 1 r = migrated[0] assert r.status == "active" assert r.since == "2026-07-17" assert r.supersedes == "none" assert r.superseded_by == "none" assert r.rule == "Every CI services container gets an explicit cap." assert r.signals is not None assert "issues: #390 #406" in r.signals assert r.mechanics is not None assert r.mechanics.startswith("docs/ci-cd.md") def test_legacy_record_is_unmigrated(): recs = dl.parse_file(FIX) legacy = [r for r in recs if r.heading.endswith("(#231)")] assert len(legacy) == 1 assert legacy[0].key is None assert legacy[0].status == "legacy-unmigrated" def test_index_section_parses_as_heading(): recs = dl.parse_file(FIX) assert any(r.heading == "Index" for r in recs) def test_parses_optional_stale_after_and_sources(): recs = dl.parse_file(FIX) r = next(r for r in recs if r.key == "ci.peak-anon-measurement") assert r.stale_after == "2027-01-15" assert r.sources is not None assert "gitea run 4471" in r.sources def test_optional_fields_default_to_none_when_absent(): recs = dl.parse_file(FIX) r = next(r for r in recs if r.key == "ci.runner-placement") assert r.stale_after is None assert r.sources is None def test_empty_stale_after_parses_as_empty_string_not_none(): """Absent vs present-but-empty must stay distinguishable for the validator.""" text = ( "## H\n" "`key: a.b` · `status: active` · `since: 2026-01-01` · `stale-after:` " "· `supersedes: none` · `superseded-by: none`\n" "**Rule:** r\n" ) r = dl.parse_text(text, Path("fake.md"))[0] assert r.stale_after == ""