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");
});
});
});