import { describe, expect, it } from "vitest"; import { BOOKING_VALIDATION_ERROR_CODES } from "@/services/scheduling/types"; import { getFirstFriendlyMessage, getFriendlyMessage, getFriendlyValidationMessages } from "../error-messages"; describe("getFriendlyMessage", () => { it("has a specific, non-empty message for every code the domain layer can produce", () => { for (const code of BOOKING_VALIDATION_ERROR_CODES) { const message = getFriendlyMessage(code); expect(message.length).toBeGreaterThan(0); } }); it("never leaks the raw code into the message", () => { for (const code of BOOKING_VALIDATION_ERROR_CODES) { expect(getFriendlyMessage(code)).not.toContain(code); } }); it("gives SLOT_UNAVAILABLE a message that doesn't sound like an internal error", () => { expect(getFriendlyMessage("SLOT_UNAVAILABLE").toLowerCase()).toContain("booked"); }); }); describe("getFriendlyValidationMessages", () => { it("maps every issue in a validation result", () => { const messages = getFriendlyValidationMessages({ valid: false, issues: [ { code: "STAFF_ON_BREAK", message: "internal" }, { code: "BELOW_MIN_NOTICE", message: "internal" }, ], }); expect(messages).toHaveLength(2); expect(messages[0]).toBe(getFriendlyMessage("STAFF_ON_BREAK")); expect(messages[1]).toBe(getFriendlyMessage("BELOW_MIN_NOTICE")); }); it("returns an empty array for a valid result", () => { expect(getFriendlyValidationMessages({ valid: true, issues: [] })).toEqual([]); }); }); describe("getFirstFriendlyMessage", () => { it("returns the first issue's friendly message", () => { const message = getFirstFriendlyMessage({ valid: false, issues: [ { code: "BUSINESS_CLOSED", message: "internal" }, { code: "STAFF_ON_LEAVE", message: "internal" }, ], }); expect(message).toBe(getFriendlyMessage("BUSINESS_CLOSED")); }); it("falls back gracefully when there are no issues", () => { expect(getFirstFriendlyMessage({ valid: true, issues: [] })).toMatch(/went wrong/i); }); });