import { afterEach, describe, expect, it, vi } from "vitest"; import { bankDateInputValue, bankMonth, bankToday } from "./form-validation"; import { bankCardSchema, bankDateSchema, positiveMoneySchema, } from "./form.schema"; import { bankMoneyValue } from "./money"; afterEach(() => vi.useRealTimers()); describe("bank form input", () => { it("keeps input bounds exact without rounding and canonicalizes leading zeros", () => { expect(positiveMoneySchema.safeParse("92233720368547758.07").success).toBe( true, ); for (const invalid of [ "92233720368547758.08", "1.001", "0", "-1", "abc", "1e3", ]) { expect(positiveMoneySchema.safeParse(invalid).success).toBe(false); } expect(bankMoneyValue(" -00010,20 ")).toBe("-10.20"); const values = { bankName: "", lastFour: "", name: "A", openingBalance: "-92233720368547758.08", openingDate: "2026-01-01", }; expect(bankCardSchema.safeParse(values).success).toBe(true); expect( bankCardSchema.safeParse({ ...values, openingBalance: "-92233720368547758.09", }).success, ).toBe(false); expect( bankCardSchema.safeParse({ ...values, lastFour: "123" }).success, ).toBe(false); }); it("uses Moscow date and refuses nonexistent or future calendar days", () => { vi.useFakeTimers(); vi.setSystemTime(new Date("2026-08-31T21:30:00Z")); expect(bankToday()).toBe("2026-09-01"); expect(bankMonth(null)).toBe("2026-09"); expect(bankMonth("2026-13")).toBe("2026-09"); expect(bankDateSchema.safeParse("2026-09-01").success).toBe(true); expect(bankDateSchema.safeParse("2026-09-02").success).toBe(false); expect(bankDateSchema.safeParse("2026-02-30").success).toBe(false); expect(bankDateSchema.safeParse("0000-01-01").success).toBe(false); expect(bankDateSchema.safeParse("0001-01-01").success).toBe(true); expect(bankDateSchema.safeParse("0099-12-31").success).toBe(true); }); }); it("converts local date input without accepting impossible or unfinished dates", () => { expect(bankDateInputValue("07.08.2026")).toBe("2026-08-07"); expect( bankDateSchema.safeParse(bankDateInputValue("29.02.2024")).success, ).toBe(true); for (const value of ["31.02.2026", "07.08.", ""]) { expect(bankDateSchema.safeParse(bankDateInputValue(value)).success).toBe( false, ); } });