test(content): mypy-clean structured-model construction + lint fixes

This commit is contained in:
Renn F
2026-06-21 03:07:58 +02:00
parent 6a14312a0c
commit c47c886508
3 changed files with 84 additions and 62 deletions
+4 -2
View File
@@ -34,11 +34,11 @@ import pytest
import pytest_asyncio import pytest_asyncio
from roboco.db.tables import AgentTable, ProjectTable, WorkSessionTable from roboco.db.tables import AgentTable, ProjectTable, WorkSessionTable
from roboco.enforcement import TaskLifecycleError from roboco.enforcement import TaskLifecycleError
from roboco.foundation.policy.content import markers
from roboco.models import AgentRole, AgentStatus, Team from roboco.models import AgentRole, AgentStatus, Team
from roboco.models.base import Complexity, TaskNature, TaskStatus, TaskType from roboco.models.base import Complexity, TaskNature, TaskStatus, TaskType
from roboco.models.permissions import AgentContext from roboco.models.permissions import AgentContext
from roboco.models.task import TaskCreateRequest from roboco.models.task import TaskCreateRequest
from roboco.foundation.policy.content import markers
from roboco.models.work_session import WorkSessionStatus from roboco.models.work_session import WorkSessionStatus
from roboco.services.base import ValidationError from roboco.services.base import ValidationError
from roboco.services.task import ( from roboco.services.task import (
@@ -159,7 +159,9 @@ def test_extract_original_developer_no_match() -> None:
def test_extract_original_developer_empty() -> None: def test_extract_original_developer_empty() -> None:
assert extract_original_developer(SimpleNamespace(orchestration_markers=None)) is None assert (
extract_original_developer(SimpleNamespace(orchestration_markers=None)) is None
)
assert extract_original_developer(SimpleNamespace(orchestration_markers={})) is None assert extract_original_developer(SimpleNamespace(orchestration_markers={})) is None
@@ -22,9 +22,10 @@ from roboco.foundation.policy.content.enums import Severity, Verdict
def test_pr_review_valid() -> None: def test_pr_review_valid() -> None:
c = PrReviewContent( c = PrReviewContent.model_validate(
summary="The change is correct and covered by tests.", {
findings=[ "summary": "The change is correct and covered by tests.",
"findings": [
{ {
"file": "roboco/services/git.py", "file": "roboco/services/git.py",
"line": 42, "line": 42,
@@ -33,35 +34,44 @@ def test_pr_review_valid() -> None:
"actual": "swallows the error", "actual": "swallows the error",
} }
], ],
verdict="changes_requested", "verdict": "changes_requested",
}
) )
assert c.findings[0].severity is Severity.MAJOR assert c.findings[0].severity is Severity.MAJOR
assert c.verdict is Verdict.CHANGES_REQUESTED assert c.verdict is Verdict.CHANGES_REQUESTED
def test_qa_valid() -> None: def test_qa_valid() -> None:
c = QaNote( c = QaNote.model_validate(
summary="Reviewed all acceptance criteria against the diff.", {
ac_verdicts=[ "summary": "Reviewed all acceptance criteria against the diff.",
{"criterion": "AC1 returns 400", "status": "verified", "how": "test passes"} "ac_verdicts": [
{
"criterion": "AC1 returns 400",
"status": "verified",
"how": "test passes",
}
], ],
verdict="passed", "verdict": "passed",
}
) )
assert c.ac_verdicts[0].status == "verified" assert c.ac_verdicts[0].status == "verified"
def test_task_description_valid() -> None: def test_task_description_valid() -> None:
c = TaskDescription( c = TaskDescription.model_validate(
objective="Add a structured PR-review comment format.", {
what_this_builds=["a reviewer schema"], "objective": "Add a structured PR-review comment format.",
the_work=[ "what_this_builds": ["a reviewer schema"],
"the_work": [
{ {
"team": "backend", "team": "backend",
"summary": "schema + gateway", "summary": "schema + gateway",
"items": ["model", "verb"], "items": ["model", "verb"],
} }
], ],
acceptance_criteria=["reviewer notes land in their own slot"], "acceptance_criteria": ["reviewer notes land in their own slot"],
}
) )
assert c.the_work[0].team.value == "backend" assert c.the_work[0].team.value == "backend"
@@ -15,9 +15,10 @@ from roboco.foundation.policy.content import (
def test_pr_review_renders_sections_and_findings_table() -> None: def test_pr_review_renders_sections_and_findings_table() -> None:
md = PrReviewContent( md = PrReviewContent.model_validate(
summary="The guard is missing on the 422 path.", {
findings=[ "summary": "The guard is missing on the 422 path.",
"findings": [
{ {
"file": "roboco/services/git.py", "file": "roboco/services/git.py",
"line": 42, "line": 42,
@@ -26,7 +27,8 @@ def test_pr_review_renders_sections_and_findings_table() -> None:
"actual": "raises", "actual": "raises",
} }
], ],
verdict="changes_requested", "verdict": "changes_requested",
}
).render_markdown() ).render_markdown()
assert "## Summary" in md assert "## Summary" in md
assert "## Findings" in md assert "## Findings" in md
@@ -38,9 +40,10 @@ def test_pr_review_renders_sections_and_findings_table() -> None:
def test_qa_renders_checklist() -> None: def test_qa_renders_checklist() -> None:
md = QaNote( md = QaNote.model_validate(
summary="Verified every acceptance criterion against the diff.", {
ac_verdicts=[ "summary": "Verified every acceptance criterion against the diff.",
"ac_verdicts": [
{ {
"criterion": "AC1 returns 400", "criterion": "AC1 returns 400",
"status": "verified", "status": "verified",
@@ -48,7 +51,8 @@ def test_qa_renders_checklist() -> None:
}, },
{"criterion": "AC2 logs", "status": "failed", "how": "no log emitted"}, {"criterion": "AC2 logs", "status": "failed", "how": "no log emitted"},
], ],
verdict="failed", "verdict": "failed",
}
).render_markdown() ).render_markdown()
assert "## Acceptance Criteria" in md assert "## Acceptance Criteria" in md
assert "" in md and "" in md assert "" in md and "" in md
@@ -75,14 +79,20 @@ def test_resumption_renders_done_next_where() -> None:
def test_task_description_renders_all_sections() -> None: def test_task_description_renders_all_sections() -> None:
md = TaskDescription( md = TaskDescription.model_validate(
objective="Add the structured content standard.", {
what_this_builds=["a schema layer", "a gateway gate"], "objective": "Add the structured content standard.",
the_work=[ "what_this_builds": ["a schema layer", "a gateway gate"],
{"team": "backend", "summary": "models + verbs", "items": ["model", "verb"]} "the_work": [
{
"team": "backend",
"summary": "models + verbs",
"items": ["model", "verb"],
}
], ],
notes=["reuse the Team enum"], "notes": ["reuse the Team enum"],
acceptance_criteria=["reviewer notes are isolated"], "acceptance_criteria": ["reviewer notes are isolated"],
}
).render_markdown() ).render_markdown()
assert "## Objective" in md assert "## Objective" in md
assert "## What This Builds" in md assert "## What This Builds" in md