From 676b0e2e1e04adf47185ecbc7604d0967e0cd735 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 8 Jul 2026 09:14:06 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=AA=20Add=20unit=20tests=20for=20i18n?= =?UTF-8?q?=20module?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add vitest suite for `i18n.ts` - Mock document and navigator globals to test DOM and browser interactions - Cover setLang, t, and detectLang methods Co-authored-by: Horizontal42 <75383519+Horizontal42@users.noreply.github.com> --- src/i18n.test.ts | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/i18n.test.ts diff --git a/src/i18n.test.ts b/src/i18n.test.ts new file mode 100644 index 0000000..40184d9 --- /dev/null +++ b/src/i18n.test.ts @@ -0,0 +1,61 @@ +import { describe, it, expect, beforeEach, vi, afterEach } from "vitest"; +import { setLang, t, detectLang } from "./i18n"; + +describe("i18n", () => { + + beforeEach(() => { + + const mockElements = [ + { dataset: { i18n: "settings" }, textContent: "" }, + { dataset: { i18n: "theme" }, textContent: "" } + ]; + + vi.stubGlobal("document", { + documentElement: { lang: "" }, + querySelectorAll: vi.fn().mockReturnValue(mockElements) + }); + vi.stubGlobal("navigator", { language: "en-US" }); + }); + + afterEach(() => { + vi.unstubAllGlobals(); + }); + + it("sets language and updates document lang", () => { + setLang("ru"); + expect(t("settings")).toBe("Настройки"); + expect(document.documentElement.lang).toBe("ru"); + + // Check if querySelectorAll was called and elements were updated + const elements = document.querySelectorAll("[data-i18n]"); + expect(elements[0].textContent).toBe("Настройки"); + expect(elements[1].textContent).toBe("Тема"); + + setLang("en"); + expect(t("settings")).toBe("Settings"); + expect(document.documentElement.lang).toBe("en"); + }); + + it("falls back to en for unknown languages", () => { + setLang("fr"); + expect(t("settings")).toBe("Settings"); + expect(document.documentElement.lang).toBe("en"); + }); + + it("falls back to en dictionary for missing keys in ru", () => { + // If a key exists in en but not ru, it should fallback to en + // we don't have one right now, but we can test missing keys in both + expect(t("unknown_key")).toBe("unknown_key"); + }); + + it("detects language from navigator", () => { + vi.stubGlobal("navigator", { language: "ru-RU" }); + expect(detectLang()).toBe("ru"); + + vi.stubGlobal("navigator", { language: "en-US" }); + expect(detectLang()).toBe("en"); + + vi.stubGlobal("navigator", { language: undefined }); + expect(detectLang()).toBe("en"); + }); +});