SPB Git forge

spb/toveli

Public
14commits 1branches 0releases
1.1 MBsize
maindefault branch
2 h agolast push
TypeScript 50.6% JavaScript 46.1% SQL 2.1% Shell 0.6% CSS 0.5%
1.6 KB · 15 lines typescript
Raw Blame History
1import { describe, expect, it } from "vitest";2import { computeMortgage, minDownPayment, cmhcRatePct, paymentFor, transferDuty } from "../src/lib/mortgage";3describe("hypothèque", () => {4  it("mise de fonds minimale (règle 2024)", () => { expect(minDownPayment(400000)).toBe(20000); expect(minDownPayment(600000)).toBe(25000 + 10000); expect(minDownPayment(1600000)).toBe(320000); });5  it("prime SCHL selon le RPV", () => { expect(cmhcRatePct(0.95)).toBe(4.0); expect(cmhcRatePct(0.8)).toBe(2.4); expect(cmhcRatePct(0.65)).toBe(0.6); });6  it("versement mensuel : 400 000 $ à 5 % sur 25 ans ≈ 2 326 $ (composition semestrielle)", () => { expect(Math.round(paymentFor(400000, 5, 25, 12))).toBeGreaterThan(2320); expect(Math.round(paymentFor(400000, 5, 25, 12))).toBeLessThan(2332); });7  it("résultat cohérent et avertissements", () => {8    const r = computeMortgage({ price: 500000, downPayment: 25000, rateAnnualPct: 4.89, amortYears: 25 });9    expect(r.cmhcPremium).toBeCloseTo(475000 * 0.04, 0); expect(r.loan).toBeCloseTo(494000, 0); expect(r.payment).toBeGreaterThan(2700); expect(r.payment).toBeLessThan(2900);10    expect(r.schedule.length).toBe(25); expect(r.schedule[24].balance).toBeLessThan(1); expect(r.stressTest.qualifyingRatePct).toBe(6.89);11    expect(computeMortgage({ price: 500000, downPayment: 10000, rateAnnualPct: 5, amortYears: 25 }).warnings.length).toBeGreaterThan(0);12  });13  it("droits de mutation", () => { expect(Math.round(transferDuty(300000))).toBe(Math.round(61500 * 0.005 + (300000 - 61500) * 0.01)); expect(transferDuty(1000000, true)).toBeGreaterThan(transferDuty(1000000, false)); });14});15