From 6c64dba47d3575358fa52dec1457d04ae4f11ed8 Mon Sep 17 00:00:00 2001 From: Guido Date: Fri, 21 Aug 2026 17:24:51 +0200 Subject: [PATCH] test: neutrale Kategorie gilt auch fuer Einnahmen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- backend/tests/test_neutral_category.py | 41 ++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/backend/tests/test_neutral_category.py b/backend/tests/test_neutral_category.py index e3aec8b..da6a70f 100644 --- a/backend/tests/test_neutral_category.py +++ b/backend/tests/test_neutral_category.py @@ -99,3 +99,44 @@ def test_neutral_keyword_matches_both_directions(admin): assert rows[0]["category_id"] == uebertrag["id"], "Ausgabe-Richtung" 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})