2026-05-11 02:15:47 +02:00
|
|
|
"""TaskUpdate (PATCH /tasks/{id}) must reject blanking acceptance_criteria.
|
|
|
|
|
|
|
|
|
|
The Golden Rule "no task without acceptance criteria" applies to every
|
|
|
|
|
mutation, not just creation. Setting acceptance_criteria to [] or None
|
|
|
|
|
in a PATCH is a Golden Rule violation.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
from pydantic import ValidationError
|
|
|
|
|
from roboco.api.schemas.tasks import TaskUpdate
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_task_update_accepts_omitting_acceptance_criteria() -> None:
|
|
|
|
|
"""Omitting the field is fine — caller isn't touching it."""
|
|
|
|
|
upd = TaskUpdate(title="new title")
|
|
|
|
|
assert upd.acceptance_criteria is None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_task_update_accepts_replacing_acceptance_criteria_with_non_empty_list() -> (
|
|
|
|
|
None
|
|
|
|
|
):
|
|
|
|
|
upd = TaskUpdate(acceptance_criteria=["new criterion"])
|
|
|
|
|
assert upd.acceptance_criteria == ["new criterion"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_task_update_rejects_empty_acceptance_criteria() -> None:
|
|
|
|
|
"""Empty list = "blank the criteria" = Golden Rule violation."""
|
|
|
|
|
with pytest.raises(ValidationError):
|
|
|
|
|
TaskUpdate(acceptance_criteria=[])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_task_update_rejects_explicit_none_when_present() -> None:
|
|
|
|
|
"""Pydantic differentiates omitted (default) from explicitly None."""
|
|
|
|
|
with pytest.raises(ValidationError):
|
2026-06-30 08:08:35 +02:00
|
|
|
TaskUpdate(acceptance_criteria=None)
|
2026-05-11 02:15:47 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_task_update_rejects_short_description() -> None:
|
|
|
|
|
"""min_length applies on PATCH too."""
|
|
|
|
|
with pytest.raises(ValidationError):
|
|
|
|
|
TaskUpdate(description="x")
|