test: Die Pruefdatei deckt auch die Nebenraeume ab

Erkennungswoerter einer Kategorie, markierte Woerter, der Stand des zweiten
Faktors und die Bankverbindungen kommen jetzt mit in
ios/Tests/Fixtures/antworten.json. Das Skript gibt die IDs aus der Saat
zurueck, damit ein Pfad wie /categories/{id}/keywords ueberhaupt gebaut
werden kann.

Zwei davon bleiben leer, und das steht auch dort: Eine Markierung entsteht
erst nach fuenf Anwendungen mit Korrekturen, eine Bankanbindung ohne echten
Anbieter gar nicht. Die Felder von BankConnectionOut deckt der Test also
NICHT ab - wer sie aendert, prueft von Hand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-10-21 22:03:28 +02:00
co-authored by Claude Opus 5
parent 6c6257b8f9
commit bab5cc5060
2 changed files with 58 additions and 27 deletions
+21 -4
View File
@@ -40,7 +40,7 @@ from app.main import app # noqa: E402
ZIEL = Path(__file__).resolve().parents[2] / "ios" / "Tests" / "Fixtures" / "antworten.json" ZIEL = Path(__file__).resolve().parents[2] / "ios" / "Tests" / "Fixtures" / "antworten.json"
def _seed(c: TestClient) -> None: def _seed(c: TestClient) -> dict:
"""Genug Daten, dass jedes Feld einmal belegt ist. """Genug Daten, dass jedes Feld einmal belegt ist.
Leere Listen pruefen nichts: Ein falscher Feldname in einer Zeile faellt Leere Listen pruefen nichts: Ein falscher Feldname in einer Zeile faellt
@@ -122,8 +122,18 @@ def _seed(c: TestClient) -> None:
"type": "income", "date": heute, "account_id": zweitgiro["id"], "type": "income", "date": heute, "account_id": zweitgiro["id"],
"amount_cents": 7500, "payee": "Dauerauftrag"}) "amount_cents": 7500, "payee": "Dauerauftrag"})
# --- Nebenraeume ------------------------------------------------------
# Ein Schlagwort, damit die Liste nicht leer ist. Die Markierung
# ("wird oft korrigiert") entsteht erst nach fuenf Anwendungen und laesst
# sich hier nicht erzwingen - dort bleibt die Liste leer.
c.post(f"/api/categories/{ausgabe['id']}/keywords", json={"word": "supermarkt"})
PFADE = { return {"kategorie": ausgabe["id"]}
def pfade(ids: dict) -> dict[str, str]:
"""Welche Antwort unter welchem Namen in die Pruefdatei kommt."""
return {
"version": "/api/version", "version": "/api/version",
"ichSelbst": "/api/auth/me", "ichSelbst": "/api/auth/me",
"einstellungen": "/api/settings", "einstellungen": "/api/settings",
@@ -142,6 +152,13 @@ PFADE = {
"eingang": "/api/inbox", "eingang": "/api/inbox",
"dubletten": "/api/transactions/dubletten", "dubletten": "/api/transactions/dubletten",
"uebertragsvorschlaege": "/api/uebertraege/vorschlaege", "uebertragsvorschlaege": "/api/uebertraege/vorschlaege",
"schlagwoerter_der_kategorie": f"/api/categories/{ids['kategorie']}/keywords",
"markierteSchlagwoerter": "/api/categories/keywords/flagged",
"zweiterFaktor": "/api/auth/2fa/status",
# Bleibt leer: Eine Bankanbindung laesst sich ohne echten Anbieter nicht
# herstellen. Der Test prueft hier nur, dass sich die leere Liste lesen
# laesst - die Felder von BankConnectionOut deckt er nicht ab.
"bankverbindungen": "/api/bank/connections",
} }
@@ -152,10 +169,10 @@ def main() -> int:
if r.status_code != 200: if r.status_code != 200:
print("Anmeldung fehlgeschlagen:", r.text) print("Anmeldung fehlgeschlagen:", r.text)
return 1 return 1
_seed(c) ids = _seed(c)
heraus = {} heraus = {}
for name, pfad in PFADE.items(): for name, pfad in pfade(ids).items():
antwort = c.get(pfad) antwort = c.get(pfad)
if antwort.status_code != 200: if antwort.status_code != 200:
print(f"{pfad} antwortet {antwort.status_code}: {antwort.text[:200]}") print(f"{pfad} antwortet {antwort.status_code}: {antwort.text[:200]}")
+17 -3
View File
@@ -13,7 +13,7 @@
"must_change_password": false, "must_change_password": false,
"must_change_password_reason": null, "must_change_password_reason": null,
"totp_enabled": false, "totp_enabled": false,
"created_at": "2026-10-21T19:21:28.289884", "created_at": "2026-10-21T19:57:08.443998",
"mfa_setup_required": false "mfa_setup_required": false
}, },
"einstellungen": [ "einstellungen": [
@@ -129,7 +129,7 @@
"is_archived": false, "is_archived": false,
"excluded_from_stats": false, "excluded_from_stats": false,
"spending_is_good": false, "spending_is_good": false,
"keyword_count": 0 "keyword_count": 1
}, },
{ {
"id": 2, "id": 2,
@@ -1339,7 +1339,7 @@
"fx_rate": null, "fx_rate": null,
"counter_amount_cents": null, "counter_amount_cents": null,
"counter_currency": null, "counter_currency": null,
"created_at": "2026-10-21T19:21:28.451708" "created_at": "2026-10-21T19:57:08.586391"
} }
], ],
"dubletten": { "dubletten": {
@@ -1400,5 +1400,19 @@
} }
} }
] ]
},
"schlagwoerter_der_kategorie": [
{
"id": 1,
"category_id": 1,
"word": "supermarkt",
"amount_cents": null
} }
],
"markierteSchlagwoerter": [],
"zweiterFaktor": {
"enabled": false,
"recovery_codes_left": 0
},
"bankverbindungen": []
} }