Files
roboco/tests/unit/foundation/policy/content/test_content_renderers.py
T

103 lines
3.2 KiB
Python

"""Markdown rendering tests for the structured content models.
Assert structure (labeled sections + the content appears) rather than exact
bytes, so the renderers stay refactorable.
"""
from __future__ import annotations
from roboco.foundation.policy.content import (
PrReviewContent,
QaNote,
ResumptionNote,
TaskDescription,
)
def test_pr_review_renders_sections_and_findings_table() -> None:
md = PrReviewContent.model_validate(
{
"summary": "The guard is missing on the 422 path.",
"findings": [
{
"file": "roboco/services/git.py",
"line": 42,
"severity": "blocker",
"expected": "retry as COMMENT",
"actual": "raises",
}
],
"verdict": "changes_requested",
}
).render_markdown()
assert "## Summary" in md
assert "## Findings" in md
assert "| File | Line | Severity | Expected → Actual |" in md
assert "`roboco/services/git.py`" in md
assert "blocker" in md
assert "## Verdict" in md
assert "changes requested" in md
def test_qa_renders_checklist() -> None:
md = QaNote.model_validate(
{
"summary": "Verified every acceptance criterion against the diff.",
"ac_verdicts": [
{
"criterion": "AC1 returns 400",
"status": "verified",
"how": "test passes",
},
{"criterion": "AC2 logs", "status": "failed", "how": "no log emitted"},
],
"verdict": "failed",
}
).render_markdown()
assert "## Acceptance Criteria" in md
assert "✅" in md and "❌" in md
assert "AC1 returns 400" in md
assert "## Verdict" in md
def test_resumption_renders_done_next_where() -> None:
md = ResumptionNote(
done="schema module landed",
next="wire the gateway chokepoint",
where_to_look=[
"foundation/policy/content/models.py",
"services/content_notes.py",
],
).render_markdown()
assert "## Done" in md
assert "## Next" in md
assert "## Where to look" in md
assert "content_notes.py" in md
# No machine markers ever leak into the human resumption note.
assert "original_developer" not in md
assert "documenter:" not in md
def test_task_description_renders_all_sections() -> None:
md = TaskDescription.model_validate(
{
"objective": "Add the structured content standard.",
"what_this_builds": ["a schema layer", "a gateway gate"],
"the_work": [
{
"team": "backend",
"summary": "models + verbs",
"items": ["model", "verb"],
}
],
"notes": ["reuse the Team enum"],
"acceptance_criteria": ["reviewer notes are isolated"],
}
).render_markdown()
assert "## Objective" in md
assert "## What This Builds" in md
assert "## The Work" in md
assert "**Backend**" in md
assert "## Notes" in md
assert "## Acceptance Criteria" in md