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
Kriterien mit waive/defer per Decision; Verify gegen Checkliste; Reopen active mit Audit; Schema 012. Co-authored-by: Cursor <cursoragent@cursor.com>
151 lines
4.8 KiB
Python
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)"
|