mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
feat(content): structured content schema models + renderers
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
"""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(
|
||||
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(
|
||||
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(
|
||||
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
|
||||
Reference in New Issue
Block a user