85 lines
2.9 KiB
Python
85 lines
2.9 KiB
Python
from datetime import date, timedelta
|
|
from decimal import Decimal
|
|
|
|
|
|
def test_pages_require_login(client):
|
|
for path in ("/", "/buchungen", "/import", "/planung", "/hilfe"):
|
|
r = client.get(path, follow_redirects=False)
|
|
assert r.status_code in (302, 303), path
|
|
assert r.headers["location"] == "/login"
|
|
|
|
|
|
def test_pages_render_after_login(client):
|
|
client.post("/login", data={"username": "admin", "password": "geheim"})
|
|
for path in ("/", "/buchungen", "/import", "/planung", "/hilfe"):
|
|
r = client.get(path)
|
|
assert r.status_code == 200
|
|
assert "Finanzberatung" in r.text
|
|
assert "Gebrauchsanleitung" in client.get("/hilfe").text
|
|
|
|
|
|
def test_import_page_has_dropzone_and_list(client):
|
|
client.post("/login", data={"username": "admin", "password": "geheim"})
|
|
r = client.get("/import")
|
|
assert r.status_code == 200
|
|
assert 'id="dropzone"' in r.text
|
|
assert 'id="imports"' in r.text
|
|
|
|
|
|
def test_import_list_fragment_requires_login(client):
|
|
r = client.get("/import/list", follow_redirects=False)
|
|
assert r.status_code in (302, 303)
|
|
|
|
|
|
def test_import_list_fragment_renders_after_login(client):
|
|
client.post("/login", data={"username": "admin", "password": "geheim"})
|
|
r = client.get("/import/list")
|
|
assert r.status_code == 200
|
|
assert "Noch keine Imports" in r.text
|
|
|
|
|
|
def test_version_visible(client):
|
|
r = client.get("/api/version", headers={"Authorization": "Bearer test-key"})
|
|
assert r.status_code == 200 and r.json()["version"] == "0.2.0"
|
|
client.post("/login", data={"username": "admin", "password": "geheim"})
|
|
assert "v0.2.0" in client.get("/").text
|
|
|
|
|
|
def test_buchungen_pagination(client, db):
|
|
from app.models.tables import Account, Transaction
|
|
|
|
acc = Account(bank="dkb", iban="DE01", name="G", type="giro")
|
|
db.add(acc)
|
|
db.flush()
|
|
base = date(2026, 1, 1)
|
|
for i in range(1, 61):
|
|
purpose = "MARKER51" if i == 51 else f"TX{i}"
|
|
db.add(Transaction(
|
|
account_id=acc.id, booking_date=base + timedelta(days=i),
|
|
amount=Decimal("10.00"), purpose=purpose, counterparty="X",
|
|
status="confirmed", dedup_hash=f"hash-{i}",
|
|
))
|
|
db.commit()
|
|
|
|
client.post("/login", data={"username": "admin", "password": "geheim"})
|
|
|
|
r1 = client.get("/buchungen")
|
|
assert r1.status_code == 200
|
|
assert "Seite 1 von 2" in r1.text
|
|
assert "Weiter" in r1.text
|
|
assert "MARKER51" not in r1.text
|
|
|
|
r2 = client.get("/buchungen?page=2")
|
|
assert r2.status_code == 200
|
|
assert "Seite 2 von 2" in r2.text
|
|
assert "Zurück" in r2.text
|
|
assert "MARKER51" in r2.text
|
|
|
|
|
|
def test_planning_page_has_all_sections(client):
|
|
client.post("/login", data={"username": "admin", "password": "geheim"})
|
|
r = client.get("/planung")
|
|
assert r.status_code == 200
|
|
for heading in ("Wiederkehrende Posten", "Einmalposten", "Kredite", "Szenarien"):
|
|
assert heading in r.text
|