test: neutrale Kategorie gilt auch fuer Einnahmen

Seit der Import keine Konten mehr verbindet, wird aus jedem Uebertrag ein
Paar: Ausgabe beim einen Konto, Einnahme beim anderen. Zaehlte nur die
Ausgabe nicht, stuende das Geld als Einnahme in der Auswertung und die
Monatsbilanz waere um den vollen Betrag zu gut.

Der Test belegt: eine neutrale Kategorie aus einer AUSGABEN-Gruppe laesst
sich einer Einnahme zuweisen, der Kontostand steigt, die Einnahmen der
Auswertung bleiben unveraendert – und ohne die Markierung zaehlt dieselbe
Buchung wieder mit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-21 17:24:51 +02:00
co-authored by Claude Opus 5
parent 9d930b3484
commit 6c64dba47d
+41
View File
@@ -99,3 +99,44 @@ def test_neutral_keyword_matches_both_directions(admin):
assert rows[0]["category_id"] == uebertrag["id"], "Ausgabe-Richtung" assert rows[0]["category_id"] == uebertrag["id"], "Ausgabe-Richtung"
assert rows[1]["category_id"] == uebertrag["id"], "Einnahme-Richtung ebenso" assert rows[1]["category_id"] == uebertrag["id"], "Einnahme-Richtung ebenso"
def _einnahmen(admin):
return admin.get("/api/dashboard/income-expense").json()["income"]
def test_neutrale_kategorie_gilt_auch_fuer_einnahmen(admin):
"""Die Gegenseite eines Kontoübertrags ist eine Einnahme – und darf ebenso
wenig in die Statistik einfliessen wie die Ausgabe.
Seit der Import keine Konten mehr verbindet, wird aus jedem Übertrag ein
Paar: Ausgabe beim einen Konto, Einnahme beim anderen. Zählte nur die
Ausgabe nicht, stünde das Geld als Einnahme in der Auswertung und die
Bilanz des Monats wäre um den vollen Betrag zu gut.
"""
acc = admin.post("/api/accounts", json={
"name": "Giro Neutral Einnahme", "type": "girokonto", "currency": "EUR",
"opening_balance_cents": 0,
}).json()
# Neutrale Kategorie liegt in einer AUSGABEN-Gruppe – sie muss trotzdem
# für eine Einnahme verwendbar sein.
uebertrag, = _expense_cats(admin, 1)
admin.patch(f"/api/categories/{uebertrag['id']}", json={"excluded_from_stats": True})
vorher = _einnahmen(admin)
heute = str(datetime.date.today())
r = admin.post("/api/transactions", json={
"type": "income", "date": heute, "account_id": acc["id"],
"amount_cents": 25000, "category_id": uebertrag["id"],
})
assert r.status_code == 201, r.text
# Der Kontostand steigt ...
assert admin.get(f"/api/accounts/{acc['id']}").json()["balance_cents"] == 25000
# ... die Einnahmen der Auswertung nicht.
assert _einnahmen(admin) == vorher
# Ohne die Markierung zählt dieselbe Buchung wieder mit.
admin.patch(f"/api/categories/{uebertrag['id']}", json={"excluded_from_stats": False})
assert _einnahmen(admin) == vorher + 25000
admin.patch(f"/api/categories/{uebertrag['id']}", json={"excluded_from_stats": True})