Kanban: Checklisten und Voraussetzungen zwischen Aufgaben
- Checkliste je Aufgabe (Tabelle kanban_checklist): im Dialog anlegen, abhaken, entfernen; Karte zeigt den Fortschritt - "Setzt voraus" (Tabelle kanban_dependencies): Aufgabe ist gesperrt und bleibt in "Offen", bis alle Voraussetzungen erledigt sind; nur innerhalb eines Projekts, Kreise und Selbstbezug werden abgelehnt; gelöschte Voraussetzungen entsperren, archivierte zählen als erledigt - Ziehen einer gesperrten Karte aus "Offen" zeigt, worauf sie wartet - Migrationen: Tabellen-Neuaufbau über Zwischennamen, damit Fremdschlüssel anderer Tabellen nicht auf die gelöschte Alt-Tabelle umgebogen werden (Test für ganz alte Datenbanken) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
a1a1998d1e
commit
9df0e38f52
10 files changed
+375
-28
No files matched your search
@@ -63,3 +63,65 @@ def test_loeschen_nur_ersteller_oder_admin(login):
|
||||
assert ben.delete(f"/api/kanban/aufgaben/{t1['id']}").status_code == 403
|
||||
assert anna.delete(f"/api/kanban/aufgaben/{t1['id']}").status_code == 200
|
||||
assert chef.delete(f"/api/kanban/aufgaben/{t2['id']}").status_code == 200
|
||||
|
||||
|
||||
# ---------- Checklisten und Abhängigkeiten ----------
|
||||
|
||||
|
||||
def find(data, title):
|
||||
return next(t for t in data["tasks"] + data["archived"] if t["title"] == title)
|
||||
|
||||
|
||||
def test_checkliste_speichern_und_abhaken(login):
|
||||
anna = login("anna")
|
||||
pid = make_board(anna)
|
||||
data = anna.post(f"/api/kanban/projekte/{pid}/aufgaben", json={
|
||||
"title": "Umzug", "checklist": [{"text": "Kartons"}, {"text": "Transporter", "done": True}],
|
||||
}).json()
|
||||
t = find(data, "Umzug")
|
||||
assert [(c["text"], c["done"]) for c in t["checklist"]] == [("Kartons", False), ("Transporter", True)]
|
||||
data = anna.patch(f"/api/kanban/aufgaben/{t['id']}", json={"checklist": [{"text": "Kartons", "done": True}]}).json()
|
||||
assert [(c["text"], c["done"]) for c in find(data, "Umzug")["checklist"]] == [("Kartons", True)]
|
||||
assert anna.patch(f"/api/kanban/aufgaben/{t['id']}", json={"checklist": [{"text": " "}]}).status_code == 400
|
||||
|
||||
|
||||
def test_voraussetzung_sperrt_bis_erledigt(login):
|
||||
anna = login("anna")
|
||||
pid = make_board(anna)
|
||||
a = task(anna, pid, "Wand streichen")
|
||||
data = anna.post(f"/api/kanban/projekte/{pid}/aufgaben", json={"title": "Bilder aufhängen", "requires": [a["id"]]}).json()
|
||||
b = find(data, "Bilder aufhängen")
|
||||
assert b["blocked"] is True and b["requires"] == [a["id"]]
|
||||
res = anna.patch(f"/api/kanban/aufgaben/{b['id']}", json={"status": "arbeit"})
|
||||
assert res.status_code == 400 and "Wand streichen" in res.json()["error"]
|
||||
anna.patch(f"/api/kanban/aufgaben/{a['id']}", json={"status": "erledigt"})
|
||||
data = anna.patch(f"/api/kanban/aufgaben/{b['id']}", json={"status": "arbeit"}).json()
|
||||
assert find(data, "Bilder aufhängen")["blocked"] is False
|
||||
|
||||
|
||||
def test_gesperrt_anlegen_nur_in_offen(login):
|
||||
anna = login("anna")
|
||||
pid = make_board(anna)
|
||||
a = task(anna, pid, "A")
|
||||
res = anna.post(f"/api/kanban/projekte/{pid}/aufgaben", json={"title": "B", "status": "arbeit", "requires": [a["id"]]})
|
||||
assert res.status_code == 400
|
||||
|
||||
|
||||
def test_kein_kreis_und_nur_eigenes_projekt(login):
|
||||
anna = login("anna")
|
||||
pid, other = make_board(anna), make_board(anna)
|
||||
a, b = task(anna, pid, "A"), task(anna, pid, "B")
|
||||
fremd = task(anna, other, "Fremd")
|
||||
assert anna.patch(f"/api/kanban/aufgaben/{b['id']}", json={"requires": [a["id"]]}).status_code == 200
|
||||
assert anna.patch(f"/api/kanban/aufgaben/{a['id']}", json={"requires": [b["id"]]}).status_code == 400 # Kreis
|
||||
assert anna.patch(f"/api/kanban/aufgaben/{a['id']}", json={"requires": [a["id"]]}).status_code == 400 # selbst
|
||||
assert anna.patch(f"/api/kanban/aufgaben/{a['id']}", json={"requires": [fremd["id"]]}).status_code == 400
|
||||
|
||||
|
||||
def test_geloeschte_voraussetzung_entsperrt(login):
|
||||
anna = login("anna")
|
||||
pid = make_board(anna)
|
||||
a = task(anna, pid, "A")
|
||||
data = anna.post(f"/api/kanban/projekte/{pid}/aufgaben", json={"title": "B", "requires": [a["id"]]}).json()
|
||||
anna.delete(f"/api/kanban/aufgaben/{a['id']}")
|
||||
assert find(board(anna, pid), "B")["blocked"] is False
|
||||
Reference in new issue
Block a user