Tests: pytest-Suite für Konten, Haushalt, Kanban, Reisen und Migrationen
- backend/tests: jede Test-Funktion bekommt eine frische Datenbank; test_migrationen.py baut ältere Datenbank-Stände nach und prüft die verlustfreie Umstellung (auch zweiter Start ohne Änderung) - requirements-dev.txt mit pytest - Fix (von den Tests gefunden): Eine neue, leere Datenbank bekam keine erste Liste "Zuhause"; jetzt einmalig beim ersten Start Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
dc4ce18593
commit
79cbaab092
10 files changed
+478
No files matched your search
@@ -0,0 +1,140 @@
|
||||
def state(client):
|
||||
return client.get("/api/haushalt").json()
|
||||
|
||||
|
||||
def add(client, list_id, name, area="einkauf", quantity=1, unit="stk"):
|
||||
return client.post("/api/haushalt/items", json={"list": area, "name": name, "quantity": quantity, "unit": unit, "listId": list_id})
|
||||
|
||||
|
||||
def items(data, list_id, area=None):
|
||||
return [i for i in data["items"] if i["listId"] == list_id and (area is None or i["list"] == area)]
|
||||
|
||||
|
||||
def new_list(client, name, everyone=True, members=()):
|
||||
res = client.post("/api/haushalt/listen", json={"name": name, "everyone": everyone, "members": list(members)})
|
||||
assert res.status_code == 201, res.text
|
||||
return res.json()["created"]
|
||||
|
||||
|
||||
def test_neue_db_hat_liste_zuhause(login):
|
||||
data = state(login("anna"))
|
||||
assert [l["name"] for l in data["lists"]] == ["Zuhause"]
|
||||
assert data["lists"][0]["everyone"] is True
|
||||
|
||||
|
||||
def test_hinzufuegen_fuehrt_zusammen_und_vereinheitlicht_namen(login):
|
||||
anna = login("anna")
|
||||
home = state(anna)["lists"][0]["id"]
|
||||
add(anna, home, "milch", quantity=2)
|
||||
data = add(anna, home, "Milch", quantity=1).json()
|
||||
assert [(i["name"], i["quantity"]) for i in items(data, home, "einkauf")] == [("Milch", 3)]
|
||||
# Andere Einheit = eigene Zeile
|
||||
data = add(anna, home, "Milch", quantity=1.5, unit="l").json()
|
||||
assert len(items(data, home, "einkauf")) == 2
|
||||
|
||||
|
||||
def test_listen_haben_eigenen_vorrat(login):
|
||||
anna = login("anna")
|
||||
home = state(anna)["lists"][0]["id"]
|
||||
urlaub = new_list(anna, "Urlaub")
|
||||
add(anna, urlaub, "Brot", area="vorrat")
|
||||
data = state(anna)
|
||||
assert [i["name"] for i in items(data, urlaub, "vorrat")] == ["Brot"]
|
||||
assert items(data, home, "vorrat") == []
|
||||
|
||||
|
||||
def test_private_liste_nur_fuer_mitglieder(login):
|
||||
anna, ben, chef = login("anna"), login("ben"), login("chef", admin=True)
|
||||
geheim = new_list(anna, "Geheim", everyone=False)
|
||||
item = add(anna, geheim, "Kuchen").json()
|
||||
item_id = items(item, geheim)[0]["id"]
|
||||
|
||||
for other in (ben, chef): # auch Admins sehen fremde private Listen nicht
|
||||
assert all(l["id"] != geheim for l in state(other)["lists"])
|
||||
assert add(other, geheim, "x").status_code == 404
|
||||
assert other.patch(f"/api/haushalt/items/{item_id}", json={"quantity": 5}).status_code == 404
|
||||
|
||||
anna.patch(f"/api/haushalt/listen/{geheim}", json={"name": "Geheim", "everyone": False, "members": [ben.user["id"]]})
|
||||
lst = next(l for l in state(ben)["lists"] if l["id"] == geheim)
|
||||
assert lst["canManage"] is False
|
||||
assert ben.patch(f"/api/haushalt/listen/{geheim}", json={"name": "x"}).status_code == 403
|
||||
assert ben.delete(f"/api/haushalt/listen/{geheim}").status_code == 403
|
||||
|
||||
|
||||
def test_liste_loeschen_entfernt_eintraege(login, conn):
|
||||
anna = login("anna")
|
||||
urlaub = new_list(anna, "Urlaub")
|
||||
add(anna, urlaub, "Brot", area="vorrat")
|
||||
add(anna, urlaub, "Wasser")
|
||||
assert anna.delete(f"/api/haushalt/listen/{urlaub}").status_code == 200
|
||||
assert conn.execute("SELECT COUNT(*) FROM household_items WHERE list_id = ?", (urlaub,)).fetchone()[0] == 0
|
||||
|
||||
|
||||
def test_ungueltiges_mitglied(login):
|
||||
res = login("anna").post("/api/haushalt/listen", json={"name": "x", "everyone": False, "members": [9999]})
|
||||
assert res.status_code == 400
|
||||
|
||||
|
||||
def test_abhaken_und_einkauf_beenden(login):
|
||||
anna = login("anna")
|
||||
home = state(anna)["lists"][0]["id"]
|
||||
add(anna, home, "Milch", quantity=2)
|
||||
add(anna, home, "Brot")
|
||||
add(anna, home, "Milch", area="vorrat", quantity=1)
|
||||
milch = next(i for i in items(state(anna), home, "einkauf") if i["name"] == "Milch")
|
||||
|
||||
data = anna.patch(f"/api/haushalt/items/{milch['id']}", json={"checked": True}).json()
|
||||
# Abgehakt bleibt auf der Einkaufsliste
|
||||
assert {i["name"]: i["checked"] for i in items(data, home, "einkauf")} == {"Milch": True, "Brot": False}
|
||||
|
||||
res = anna.post(f"/api/haushalt/listen/{home}/einkauf-beenden")
|
||||
assert res.json()["moved"] == 1
|
||||
data = res.json()
|
||||
assert [i["name"] for i in items(data, home, "einkauf")] == ["Brot"]
|
||||
assert [(i["name"], i["quantity"]) for i in items(data, home, "vorrat")] == [("Milch", 3)]
|
||||
# Nichts mehr abgehakt
|
||||
assert anna.post(f"/api/haushalt/listen/{home}/einkauf-beenden").status_code == 400
|
||||
|
||||
|
||||
def test_vorrat_laesst_sich_nicht_abhaken(login):
|
||||
anna = login("anna")
|
||||
home = state(anna)["lists"][0]["id"]
|
||||
vorrat = items(add(anna, home, "Reis", area="vorrat").json(), home, "vorrat")[0]
|
||||
assert anna.patch(f"/api/haushalt/items/{vorrat['id']}", json={"checked": True}).status_code == 400
|
||||
|
||||
|
||||
def test_erneut_hinzufuegen_hebt_haken_auf(login):
|
||||
anna = login("anna")
|
||||
home = state(anna)["lists"][0]["id"]
|
||||
milch = items(add(anna, home, "Milch").json(), home)[0]
|
||||
anna.patch(f"/api/haushalt/items/{milch['id']}", json={"checked": True})
|
||||
data = add(anna, home, "Milch").json()
|
||||
assert items(data, home)[0]["checked"] is False
|
||||
|
||||
|
||||
def test_aufgebraucht_kommt_mit_menge_1_auf_einkauf(login):
|
||||
anna = login("anna")
|
||||
home = state(anna)["lists"][0]["id"]
|
||||
reis = items(add(anna, home, "Reis", area="vorrat", quantity=4).json(), home)[0]
|
||||
data = anna.post(f"/api/haushalt/items/{reis['id']}/move").json()
|
||||
assert [(i["list"], i["quantity"]) for i in items(data, home)] == [("einkauf", 1)]
|
||||
|
||||
|
||||
def test_rezept_uebernehmen_in_gewaehlte_liste(login):
|
||||
anna = login("anna")
|
||||
urlaub = new_list(anna, "Urlaub")
|
||||
res = anna.post("/api/haushalt/rezept/uebernehmen", json={
|
||||
"items": [{"name": "Mehl", "quantity": 0.5, "unit": "kg"}], "aliases": [], "listId": urlaub,
|
||||
})
|
||||
assert res.status_code == 200
|
||||
assert [(i["name"], i["quantity"], i["unit"]) for i in items(res.json(), urlaub, "einkauf")] == [("Mehl", 0.5, "kg")]
|
||||
|
||||
|
||||
def test_einheitenwechsel_fuehrt_zusammen(login):
|
||||
anna = login("anna")
|
||||
home = state(anna)["lists"][0]["id"]
|
||||
add(anna, home, "Mehl", quantity=1, unit="kg")
|
||||
stk = items(add(anna, home, "Mehl", quantity=2).json(), home)
|
||||
stk = next(i for i in stk if i["unit"] == "stk")
|
||||
data = anna.patch(f"/api/haushalt/items/{stk['id']}", json={"unit": "kg"}).json()
|
||||
assert [(i["quantity"], i["unit"]) for i in items(data, home)] == [(3, "kg")]
|
||||
Reference in new issue
Block a user