import { i18n } from "@lingui/core"; import { I18nProvider } from "@lingui/react"; import { render, screen, waitFor } from "@testing-library/react"; import { beforeEach, describe, expect, test, vi } from "vitest"; import { userEvent } from "vitest/browser"; import { LocaleDirectionProvider } from "../../src/locales/LocaleDirectionProvider.js"; import { useLocale } from "../../src/locales/useLocale.js"; const expectHTMLAttr = (attr: "lang" | "dir", expected: string | null) => { expect(document.documentElement.getAttribute(attr)).toBe(expected); }; describe("LocaleDirectionProvider", () => { beforeEach(() => { document.documentElement.removeAttribute("dir"); document.documentElement.removeAttribute("lang"); }); test("throws error when used without I18nProvider", () => { const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => {}); try { expect(() => { render(
test
, ); }).toThrow(); } finally { consoleErrorSpy.mockRestore(); } }); test("works correctly when wrapped by I18nProvider", () => { i18n.loadAndActivate({ locale: "en", messages: {} }); expect(() => { render(
test
, ); }).not.toThrow(); expect(screen.getByTestId("content")).toBeInTheDocument(); }); test("updates document.documentElement.lang attribute and dir attribute for RTL locale", () => { i18n.loadAndActivate({ locale: "ar", messages: {} }); render(
test
, ); expectHTMLAttr("lang", "ar"); expectHTMLAttr("dir", "rtl"); }); test("updates document.documentElement.lang and dir attributes when locale changes", async () => { i18n.loadAndActivate({ locale: "en", messages: {} }); const LocaleButton = () => { const { setLocale } = useLocale(); return ( ); }; render( , ); expectHTMLAttr("dir", "ltr"); expectHTMLAttr("lang", "en"); await userEvent.click(screen.getByTestId("locale-button")); await waitFor(() => { expectHTMLAttr("dir", "rtl"); expectHTMLAttr("lang", "ar"); }); }); });