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