Kairo-Jinkendo/backend/tests/test_ap14b_gate_checklist.py
Lars 9bf6ccee36
All checks were successful
Deploy Development / deploy (push) Successful in 48s
Test Suite / pytest-backend (push) Successful in 1m36s
Test Suite / lint-backend (push) Successful in 2s
Test Suite / compose-smoke (push) Has been skipped
Test Suite / k6 /api/health Baseline (push) Successful in 18s
Test Suite / playwright-smoke (push) Successful in 12s
AP1.4b: Gate-Checkliste, Verify, Reopen und Plan-Detail-UI
Kriterien mit waive/defer per Decision; Verify gegen Checkliste; Reopen active mit Audit; Schema 012.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 06:53:49 +02:00

151 lines
4.8 KiB
Python

"""AP1.4b — Gate checklist, waive/defer, reopen tests."""
from __future__ import annotations
from tests.factories import provision_user_in_tenant
from tests.test_initiatives_actions import (
_auth,
_create_initiative,
_login,
)
from tests.test_ap14_roadmap import _create_roadmap_item
def _list_criteria(client, token, item_id):
return client.get(f"/api/roadmap-items/{item_id}/criteria", headers=_auth(token))
def test_default_criterion_on_create(client):
user = provision_user_in_tenant(tenant_role="member")
token = _login(client, user)
initiative_id = _create_initiative(client, token).json()["id"]
item = _create_roadmap_item(client, token, initiative_id).json()
resp = _list_criteria(client, token, item["id"])
assert resp.status_code == 200
body = resp.json()
assert body["progress"]["total"] == 1
assert body["items"][0]["title"] == "Gate allgemein"
assert body["items"][0]["status"] == "open"
def test_verify_with_waived_criterion(client):
user = provision_user_in_tenant(tenant_role="member")
token = _login(client, user)
initiative_id = _create_initiative(client, token).json()["id"]
item = _create_roadmap_item(client, token, initiative_id, status="active").json()
criteria = _list_criteria(client, token, item["id"]).json()["items"]
crit_a = criteria[0]["id"]
added = client.post(
f"/api/roadmap-items/{item['id']}/criteria",
json={"title": "Review-Protokoll", "criterion_kind": "manual"},
headers=_auth(token),
)
assert added.status_code == 201
crit_b = added.json()["id"]
waived = client.post(
f"/api/roadmap-criteria/{crit_b}/waive",
json={"decision_title": "Review entfällt", "decision_description": "PO-Freigabe"},
headers=_auth(token),
)
assert waived.status_code == 200
assert waived.json()["status"] == "waived"
evidence = client.post(
f"/api/initiatives/{initiative_id}/evidence",
json={
"title": "Nachweis",
"roadmap_item_id": item["id"],
"status": "accepted",
},
headers=_auth(token),
)
assert evidence.status_code == 201
ok = client.post(
f"/api/roadmap-items/{item['id']}/verify-reached",
headers=_auth(token),
)
assert ok.status_code == 200
assert ok.json()["status"] == "reached"
progress = _list_criteria(client, token, item["id"]).json()["progress"]
assert progress["closed"] == 2
def test_reopen_keeps_criterion_status(client):
user = provision_user_in_tenant(tenant_role="member")
token = _login(client, user)
initiative_id = _create_initiative(client, token).json()["id"]
item = _create_roadmap_item(client, token, initiative_id, status="active").json()
client.post(
f"/api/initiatives/{initiative_id}/evidence",
json={
"title": "Nachweis",
"roadmap_item_id": item["id"],
"status": "accepted",
},
headers=_auth(token),
)
client.post(
f"/api/roadmap-items/{item['id']}/verify-reached",
headers=_auth(token),
)
criteria_before = _list_criteria(client, token, item["id"]).json()["items"]
assert criteria_before[0]["status"] == "satisfied"
reopened = client.post(
f"/api/roadmap-items/{item['id']}/reopen",
json={"reason": "Versehentlich geschlossen"},
headers=_auth(token),
)
assert reopened.status_code == 200
assert reopened.json()["status"] == "active"
criteria_after = _list_criteria(client, token, item["id"]).json()["items"]
assert criteria_after[0]["status"] == "satisfied"
def test_criterion_change_on_reached_reopens_gate(client):
user = provision_user_in_tenant(tenant_role="member")
token = _login(client, user)
initiative_id = _create_initiative(client, token).json()["id"]
item = _create_roadmap_item(client, token, initiative_id, status="active").json()
client.post(
f"/api/initiatives/{initiative_id}/evidence",
json={
"title": "Nachweis",
"roadmap_item_id": item["id"],
"status": "accepted",
},
headers=_auth(token),
)
client.post(
f"/api/roadmap-items/{item['id']}/verify-reached",
headers=_auth(token),
)
crit_id = _list_criteria(client, token, item["id"]).json()["items"][0]["id"]
patched = client.patch(
f"/api/roadmap-criteria/{crit_id}",
json={
"title": "Gate allgemein (präzisiert)",
"change_reason": "DoD nachgeschärft",
},
headers=_auth(token),
)
assert patched.status_code == 200
item_after = client.get(
f"/api/roadmap-items/{item['id']}",
headers=_auth(token),
).json()
assert item_after["status"] == "active"
assert patched.json()["title"] == "Gate allgemein (präzisiert)"