from datetime import date from decimal import Decimal from app.engine.loans import add_months, annuity_payment, loan_schedule def test_add_months_clamps_month_end(): assert add_months(date(2026, 1, 31), 1) == date(2026, 2, 28) def test_annuity_payment(): # 10.000 EUR, 6 % p.a., 48 Monate -> 234,85 EUR Monatsrate assert annuity_payment(Decimal("10000"), Decimal("6"), 48) == Decimal("234.85") def test_annuity_schedule_amortizes_fully(): plan = loan_schedule(Decimal("10000"), Decimal("6"), 48, date(2026, 8, 1), "annuity") assert len(plan) == 48 assert plan[-1].remaining == Decimal("0.00") assert plan[0].due == date(2026, 9, 1) assert plan[0].interest == Decimal("50.00") # 10000 * 0,5 % assert plan[0].payment < 0 def test_bullet_loan(): plan = loan_schedule(Decimal("10000"), Decimal("6"), 12, date(2026, 8, 1), "bullet") assert all(i.principal == 0 for i in plan[:-1]) assert plan[-1].principal == Decimal("10000") assert plan[-1].remaining == Decimal("0.00")