import { describe, expect, it } from "vitest"; import { Weekday } from "@/generated/prisma/enums"; import { validateBusinessProfileInput, validateOpeningHoursInput } from "../business.service"; describe("validateBusinessProfileInput", () => { const base = { name: "Blake Heritage Barbershop", timezone: "Europe/London", currency: "GBP", locale: "en-GB", }; it("accepts a complete profile", () => { expect(validateBusinessProfileInput(base).valid).toBe(true); }); it("rejects an empty name", () => { const result = validateBusinessProfileInput({ ...base, name: " " }); expect(result.valid).toBe(false); expect(result.issues[0]?.code).toBe("INVALID_INPUT"); }); it("rejects a missing timezone/currency/locale", () => { const result = validateBusinessProfileInput({ ...base, timezone: "" }); expect(result.valid).toBe(false); expect(result.issues[0]?.code).toBe("INVALID_INPUT"); }); }); describe("validateOpeningHoursInput", () => { it("accepts a day marked closed with no times", () => { const result = validateOpeningHoursInput([{ dayOfWeek: Weekday.SUNDAY, isClosed: true }]); expect(result.valid).toBe(true); }); it("requires open/close times for an open day", () => { const result = validateOpeningHoursInput([{ dayOfWeek: Weekday.MONDAY, isClosed: false }]); expect(result.valid).toBe(false); expect(result.issues[0]?.code).toBe("INVALID_INPUT"); }); it("rejects opening time at or after closing time", () => { const result = validateOpeningHoursInput([ { dayOfWeek: Weekday.TUESDAY, isClosed: false, opensAtMinutes: 600, closesAtMinutes: 600 }, ]); expect(result.valid).toBe(false); expect(result.issues[0]?.code).toBe("INVALID_TIME_RANGE"); }); it("rejects times outside a single day", () => { const result = validateOpeningHoursInput([ { dayOfWeek: Weekday.WEDNESDAY, isClosed: false, opensAtMinutes: 0, closesAtMinutes: 25 * 60 }, ]); expect(result.valid).toBe(false); expect(result.issues[0]?.code).toBe("INVALID_TIME_RANGE"); }); it("rejects a negative opening time", () => { const result = validateOpeningHoursInput([ { dayOfWeek: Weekday.THURSDAY, isClosed: false, opensAtMinutes: -30, closesAtMinutes: 600 }, ]); expect(result.valid).toBe(false); expect(result.issues[0]?.code).toBe("INVALID_TIME_RANGE"); }); it("accepts a valid full week mixing open and closed days", () => { const result = validateOpeningHoursInput([ { dayOfWeek: Weekday.MONDAY, isClosed: false, opensAtMinutes: 10 * 60, closesAtMinutes: 19 * 60 }, { dayOfWeek: Weekday.SUNDAY, isClosed: true }, ]); expect(result.valid).toBe(true); }); });