import { en, loadTranslations, SUPPORTED_LOCALES } from "@snapotter/shared"; import { describe, expect, it } from "vitest"; describe("SUPPORTED_LOCALES", () => { it("has 21 locales including English", () => { expect(SUPPORTED_LOCALES).toHaveLength(21); }); it("includes English as first entry", () => { expect(SUPPORTED_LOCALES[0].code).toBe("en"); expect(SUPPORTED_LOCALES[0].dir).toBe("ltr"); }); it("has Arabic as RTL", () => { const ar = SUPPORTED_LOCALES.find((l) => l.code === "ar"); expect(ar).toBeDefined(); expect(ar?.dir).toBe("rtl"); }); it("all locales have required fields", () => { for (const locale of SUPPORTED_LOCALES) { expect(locale.code).toBeTruthy(); expect(locale.name).toBeTruthy(); expect(locale.nativeName).toBeTruthy(); expect(["ltr", "rtl"]).toContain(locale.dir); } }); }); describe("loadTranslations", () => { it("returns English translations for 'en'", async () => { const t = await loadTranslations("en"); expect(t.common.upload).toBe("Upload from computer"); }); it("returns English fallback for unsupported locale", async () => { const t = await loadTranslations("xx-XX"); expect(t.common.upload).toBe("Upload from computer"); }); }); describe("en translation completeness", () => { it("has all required top-level sections", () => { const sections = Object.keys(en); const required = [ "common", "categories", "tools", "toolSettings", "toolPage", "homePage", "fullscreenGrid", "editor", "settings", "auth", "changePassword", "automate", "nav", "files", "dropzone", "reviewPanel", "features", "help", "errors", "sidebar", "toolCard", "appLayout", ]; for (const key of required) { expect(sections, `missing section: ${key}`).toContain(key); } }); it("has 25 rotating phrases", () => { expect(en.auth.rotatingPhrases).toHaveLength(25); }); it("has 30 progress messages", () => { expect(en.features.progressMessages).toHaveLength(30); }); it("has 24 categories", () => { expect(Object.keys(en.categories)).toHaveLength(24); }); });