"""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)"