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:
@@ -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]}")
|
||||||
|
|||||||
@@ -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": []
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user