76 lines
2.6 KiB
TypeScript
76 lines
2.6 KiB
TypeScript
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
|
|
vi.mock("expo", () => ({
|
|
reloadAppAsync: vi.fn().mockResolvedValue(undefined),
|
|
}));
|
|
|
|
vi.mock("react-native", () => ({
|
|
I18nManager: {
|
|
allowRTL: vi.fn(),
|
|
forceRTL: vi.fn(),
|
|
isRTL: false,
|
|
},
|
|
Platform: { OS: "ios" },
|
|
}));
|
|
|
|
describe("mobile ui direction", () => {
|
|
beforeEach(() => {
|
|
vi.resetModules();
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.unstubAllGlobals();
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
it("resolves a locale tag from Intl", async () => {
|
|
const resolvedOptions = vi.fn().mockReturnValue({ locale: "he-IL" });
|
|
vi.stubGlobal("Intl", {
|
|
...Intl,
|
|
DateTimeFormat: vi.fn().mockImplementation(() => ({ resolvedOptions })),
|
|
});
|
|
const { resolveMobileUiLocale } = await import("./ui-direction");
|
|
|
|
expect(resolveMobileUiLocale()).toBe("he-IL");
|
|
});
|
|
|
|
it("forces rtl and reloads when the runtime is still ltr", async () => {
|
|
const { I18nManager } = await import("react-native");
|
|
const { reloadAppAsync } = await import("expo");
|
|
(I18nManager as { isRTL: boolean }).isRTL = false;
|
|
const { applyMobileUiDirection } = await import("./ui-direction");
|
|
|
|
expect(applyMobileUiDirection("he-IL")).toBe(true);
|
|
expect(I18nManager.allowRTL).toHaveBeenCalledWith(true);
|
|
expect(I18nManager.forceRTL).toHaveBeenCalledWith(true);
|
|
await Promise.resolve();
|
|
expect(reloadAppAsync).toHaveBeenCalledWith("ui-direction");
|
|
});
|
|
|
|
it("forces ltr and reloads when the runtime is still rtl", async () => {
|
|
const { I18nManager } = await import("react-native");
|
|
const { reloadAppAsync } = await import("expo");
|
|
(I18nManager as { isRTL: boolean }).isRTL = true;
|
|
const { applyMobileUiDirection } = await import("./ui-direction");
|
|
|
|
expect(applyMobileUiDirection("en-US")).toBe(false);
|
|
expect(I18nManager.allowRTL).toHaveBeenCalledWith(true);
|
|
expect(I18nManager.forceRTL).toHaveBeenCalledWith(false);
|
|
await Promise.resolve();
|
|
expect(reloadAppAsync).toHaveBeenCalledWith("ui-direction");
|
|
});
|
|
|
|
it("skips forceRTL and reload when layout already matches the locale", async () => {
|
|
const { I18nManager } = await import("react-native");
|
|
const { reloadAppAsync } = await import("expo");
|
|
(I18nManager as { isRTL: boolean }).isRTL = true;
|
|
const { applyMobileUiDirection } = await import("./ui-direction");
|
|
|
|
expect(applyMobileUiDirection("he-IL")).toBe(true);
|
|
expect(I18nManager.allowRTL).toHaveBeenCalledWith(true);
|
|
expect(I18nManager.forceRTL).not.toHaveBeenCalled();
|
|
await Promise.resolve();
|
|
expect(reloadAppAsync).not.toHaveBeenCalled();
|
|
});
|
|
});
|