mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
103 lines
3.2 KiB
Python
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
|