import { describe, expect, it } from "vitest"; import { t } from "."; import en from "./locales/en.json"; import { localeMessages } from "./locales"; import { validateLocaleMessages } from "./locale-validation"; describe("locale validation", () => { it("resolves English messages with key and default fallbacks", () => { expect(t("app.noCompanies.title")).toBe(en.app.noCompanies.title); expect(t("app.missing", { defaultValue: "Fallback" })).toBe("Fallback"); expect(t("app.missing")).toBe("app.missing"); }); it("accepts registered locale files", () => { expect(Object.keys(localeMessages)).toContain("en"); for (const [locale, messages] of Object.entries(localeMessages)) { expect(validateLocaleMessages(messages), locale).toEqual([]); } }); it("rejects missing and extra nested keys", () => { expect( validateLocaleMessages({ app: { noCompanies: { title: en.app.noCompanies.title, description: en.app.noCompanies.description, unexpected: "Unexpected", }, }, }), ).toEqual( expect.arrayContaining([ "app.noCompanies.newCompany is missing", "app.noCompanies.unexpected is not defined in English", ]), ); }); it("rejects non-string leaves", () => { expect( validateLocaleMessages({ app: { noCompanies: { ...en.app.noCompanies, title: ["Create your first company"], }, }, }), ).toEqual(expect.arrayContaining(["app.noCompanies.title must be a string"])); }); it("requires interpolation placeholders to match English", () => { const reference = { message: "Invite {{name}} to {{company}}", }; expect(validateLocaleMessages({ message: "Invite {{name}}" }, reference)).toEqual([ 'message interpolation placeholders must match English exactly: expected ["company","name"], received ["name"]', ]); }); it("rejects executable, raw HTML, and unexpected link payloads not present in English", () => { const reference = { script: "Create company", handler: "Create company", js: "Create company", data: "Create company", url: "Create company", html: "Create company", }; expect( validateLocaleMessages( { script: "", handler: 'Create', js: "javascript:alert(1)", data: "data:text/html,hello", url: "https://example.test", html: "Create company", }, reference, ), ).toEqual( expect.arrayContaining([ "script contains disallowed { expect(validateLocaleMessages({ message: "x".repeat(200) }, { message: "Short" })).toEqual([ "message is too long: 200 characters exceeds 133", ]); }); });