feat: Aufteilung – Drill-down in Kategorie per Klick auf Tortensegment (A13-T6)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -158,3 +158,121 @@ def test_tabelle_scrollbar_torte_darunter(client, db):
|
||||
t = _get(client, monat=MONAT).text
|
||||
assert re.search(r'<div class="tabelle-scroll">\s*<table', t)
|
||||
assert t.index('id="aufteilung-torte"') > t.index("</table>")
|
||||
|
||||
|
||||
def _drill(client, pfad="/aufteilung/kategorie", **params):
|
||||
return client.get(pfad, params={"monat": MONAT, **params})
|
||||
|
||||
|
||||
def test_hinweistext_und_segment_links(client, db):
|
||||
_login(client)
|
||||
_daten(db)
|
||||
t = _get(client, monat=MONAT).text
|
||||
assert "Für Kategorie-Aufteilung auf Segment klicken" in t
|
||||
assert 'hx-get="/aufteilung/kategorie?' in t
|
||||
assert "kategorie=Wohnen" in t
|
||||
assert 'hx-target="#aufteilung-kategorie"' in t
|
||||
assert '<div id="aufteilung-kategorie">' in t
|
||||
|
||||
|
||||
def test_frei_verfuegbar_ohne_link(client, db):
|
||||
_login(client)
|
||||
_daten(db)
|
||||
t = _get(client, monat=MONAT).text
|
||||
assert "kategorie=Frei" not in t
|
||||
frei = re.search(r'<path[^>]*class="seg frei[^"]*"[^>]*>', t).group(0)
|
||||
assert "hx-get" not in frei
|
||||
|
||||
|
||||
def test_fragment_zweite_torte_und_oob(client, db):
|
||||
_login(client)
|
||||
_daten(db)
|
||||
r = _drill(client, kategorie="Wohnen")
|
||||
assert r.status_code == 200
|
||||
assert "Wohnen: 1.000,00 € / Monat" in r.text
|
||||
assert "Miete" in r.text and "33,3 % der Einkünfte" in r.text
|
||||
assert '<div id="aufteilung-torte" hx-swap-oob="true">' in r.text
|
||||
assert "gewaehlt" in r.text
|
||||
assert "<html" not in r.text
|
||||
|
||||
|
||||
def test_seite_mit_kategorie_zeigt_zweite_torte(client, db):
|
||||
_login(client)
|
||||
_daten(db)
|
||||
t = _get(client, monat=MONAT, kategorie="Versicherung").text
|
||||
assert "Versicherung: 100,00 € / Monat" in t
|
||||
assert 'hx-swap-oob' not in t
|
||||
|
||||
|
||||
def test_unbekannte_kategorie_hinweis(client, db):
|
||||
_login(client)
|
||||
_daten(db)
|
||||
for pfad in ("/aufteilung", "/aufteilung/kategorie"):
|
||||
r = _drill(client, pfad, kategorie="Gibtsnicht")
|
||||
assert r.status_code == 200
|
||||
assert "Kategorie „Gibtsnicht“ hat in dieser Auswahl keine Kosten." in r.text
|
||||
|
||||
|
||||
def test_fragment_bei_fehler_nur_hinweis(client):
|
||||
_login(client)
|
||||
r = client.get("/aufteilung/kategorie", params={"monat": "2030-13", "kategorie": "X"})
|
||||
assert r.status_code == 200
|
||||
assert "Ungültiger Monat" in r.text and "hx-swap-oob" not in r.text
|
||||
|
||||
|
||||
def _viele_kategorien(db):
|
||||
eink = Category(name="Einkommen")
|
||||
kleine = [Category(name="Klein A"), Category(name="Klein B")]
|
||||
gross = Category(name="Groß")
|
||||
db.add_all([eink, gross, *kleine])
|
||||
db.flush()
|
||||
db.add_all([
|
||||
RecurringItem(name="Gehalt", amount=D("3000.00"), rhythm="monthly", due_day=1, category_id=eink.id),
|
||||
RecurringItem(name="Posten G", amount=D("-1000.00"), rhythm="monthly", due_day=1, category_id=gross.id),
|
||||
RecurringItem(name="Posten A", amount=D("-10.00"), rhythm="monthly", due_day=1, category_id=kleine[0].id),
|
||||
RecurringItem(name="Posten B", amount=D("-20.00"), rhythm="monthly", due_day=1, category_id=kleine[1].id),
|
||||
])
|
||||
db.commit()
|
||||
|
||||
|
||||
def test_sammelgruppe_uebrige(client, db):
|
||||
_login(client)
|
||||
_viele_kategorien(db)
|
||||
t = _get(client, monat=MONAT).text
|
||||
assert "sammel=1" in t
|
||||
r = _drill(client, sammel="1")
|
||||
assert "Übrige: 30,00 € / Monat" in r.text
|
||||
assert "Enthält: Klein B, Klein A" in r.text
|
||||
assert "Posten A" in r.text and "Posten B" in r.text
|
||||
|
||||
|
||||
def test_echte_kategorie_uebrige_nicht_verwechselt(client, db):
|
||||
_login(client)
|
||||
_viele_kategorien(db)
|
||||
echte = Category(name="Übrige")
|
||||
db.add(echte)
|
||||
db.flush()
|
||||
db.add(RecurringItem(name="Echt", amount=D("-500.00"), rhythm="monthly", due_day=1,
|
||||
category_id=echte.id))
|
||||
db.commit()
|
||||
r = _drill(client, kategorie="Übrige")
|
||||
assert "Übrige: 500,00 € / Monat" in r.text
|
||||
assert "Echt" in r.text and "Posten A" not in r.text
|
||||
r = _drill(client, sammel="1")
|
||||
assert "Übrige: 30,00 € / Monat" in r.text and "Echt" not in r.text
|
||||
|
||||
|
||||
def test_drilldown_sonderzeichen(client, db):
|
||||
_login(client)
|
||||
eink, haus = Category(name="Einkommen"), Category(name="Haus & Garten")
|
||||
db.add_all([eink, haus])
|
||||
db.flush()
|
||||
db.add_all([
|
||||
RecurringItem(name="Gehalt", amount=D("3000.00"), rhythm="monthly", due_day=1, category_id=eink.id),
|
||||
RecurringItem(name="Rasen", amount=D("-300.00"), rhythm="monthly", due_day=1, category_id=haus.id),
|
||||
])
|
||||
db.commit()
|
||||
t = _get(client, monat=MONAT).text
|
||||
assert "kategorie=Haus+%26+Garten" in t
|
||||
r = _drill(client, kategorie="Haus & Garten")
|
||||
assert "Haus & Garten: 300,00 € / Monat" in r.text and "Rasen" in r.text
|
||||
|
||||
Reference in New Issue
Block a user