from datetime import date from decimal import Decimal def _ensure_rate(day: date, rate: str) -> None: from app.database import SessionLocal from app.models import ExchangeRate db = SessionLocal() try: if db.get(ExchangeRate, (day, "CHF")) is None: db.add(ExchangeRate(date=day, currency="CHF", rate_per_eur=Decimal(rate))) db.commit() finally: db.close() def test_conversion_and_override(admin): from app.database import SessionLocal from app.services import currency d = date(2026, 1, 15) _ensure_rate(d, "0.95") db = SessionLocal() try: assert currency.to_eur_cents(db, 9500, "CHF", d) == 10000 # 9500 / 0.95 assert currency.from_eur_cents(db, 10000, "CHF", d) == 9500 assert currency.convert(db, 10000, "EUR", "CHF", d) == 9500 assert currency.to_eur_cents(db, 5000, "EUR", d) == 5000 # EUR bleibt EUR # Manuell gesetzter Kurs hat Vorrang vor dem EZB-Kurs. assert currency.to_eur_cents(db, 10000, "CHF", d, fx_rate=2.0) == 5000 finally: db.close() def test_weekend_fallback(admin): from app.database import SessionLocal from app.services import currency friday = date(2026, 3, 6) sunday = date(2026, 3, 8) # kein Kurs -> Freitag gilt _ensure_rate(friday, "0.90") db = SessionLocal() try: assert currency.rate_on(db, "CHF", sunday) == Decimal("0.90") finally: db.close() def test_missing_rate_returns_none(admin): from app.database import SessionLocal from app.services import currency db = SessionLocal() try: # Weit in der Vergangenheit gibt es keinen Kurs -> None. assert currency.to_eur_cents(db, 1000, "CHF", date(1990, 1, 1)) is None finally: db.close()