/** * Unit tests for main.js: applyLangToUi (locale-to-DOM) and lang re-evaluation behaviour. */ import { describe, it, expect, beforeAll } from "vitest"; beforeAll(() => { document.body.innerHTML = '
' + '

' + '
' + '' + "
" + '
' + '
' + '
'; }); import { applyLangToUi } from "./main.js"; import { state } from "./dom.js"; describe("applyLangToUi", () => { it("state.lang is set from getLang() at startup (getLang reads window.__DT_LANG; default en)", () => { expect(state.lang).toBe("en"); }); it("sets document title and loading text for en", () => { state.lang = "en"; applyLangToUi(); expect(document.title).toBe("Duty Calendar"); const loadingText = document.querySelector(".loading__text"); expect(loadingText && loadingText.textContent).toBe("Loading…"); }); it("sets document title and loading text for ru", () => { state.lang = "ru"; applyLangToUi(); expect(document.title).toBe("Календарь дежурств"); const loadingText = document.querySelector(".loading__text"); expect(loadingText && loadingText.textContent).toBe("Загрузка…"); }); it("sets documentElement.lang to state.lang", () => { state.lang = "en"; applyLangToUi(); expect(document.documentElement.lang).toBe("en"); state.lang = "ru"; applyLangToUi(); expect(document.documentElement.lang).toBe("ru"); }); it("sets weekday labels and nav aria-labels for current lang", () => { state.lang = "en"; applyLangToUi(); const weekdays = document.querySelectorAll(".weekdays span"); expect(weekdays.length).toBe(7); expect(weekdays[0].textContent).toBe("Mon"); const prevBtn = document.getElementById("prevMonth"); const nextBtn = document.getElementById("nextMonth"); expect(prevBtn && prevBtn.getAttribute("aria-label")).toBe("Previous month"); expect(nextBtn && nextBtn.getAttribute("aria-label")).toBe("Next month"); state.lang = "ru"; applyLangToUi(); expect(weekdays[0].textContent).toBe("Пн"); expect(prevBtn && prevBtn.getAttribute("aria-label")).toContain("Пред"); expect(nextBtn && nextBtn.getAttribute("aria-label")).toContain("След"); }); });