memos/web/tests/i18n-document-direction.test.ts

47 lines
1.5 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from "vitest";
import i18n from "@/i18n";
import { getLocaleDirection, loadLocale, subscribeToLocaleDirection } from "@/utils/i18n";
const originalLanguage = i18n.language;
const originalLangAttribute = document.documentElement.getAttribute("lang");
const originalDirAttribute = document.documentElement.getAttribute("dir");
const restoreAttribute = (name: "lang" | "dir", value: string | null) => {
if (value === null) {
document.documentElement.removeAttribute(name);
} else {
document.documentElement.setAttribute(name, value);
}
};
describe("document locale direction", () => {
afterEach(async () => {
localStorage.clear();
restoreAttribute("lang", originalLangAttribute);
restoreAttribute("dir", originalDirAttribute);
await i18n.changeLanguage(originalLanguage);
});
it.each([
["ar", "rtl"],
["fa", "rtl"],
["he", "rtl"],
["en", "ltr"],
] as const)("sets %s as a %s document", (locale, direction) => {
loadLocale(locale);
expect(document.documentElement).toHaveAttribute("lang", locale);
expect(document.documentElement).toHaveAttribute("dir", direction);
});
it("notifies direction consumers before translations finish loading", () => {
const listener = vi.fn();
const unsubscribe = subscribeToLocaleDirection(listener);
loadLocale("ar");
expect(getLocaleDirection()).toBe("rtl");
expect(listener).toHaveBeenCalledOnce();
unsubscribe();
});
});