// @vitest-environment jsdom // // A Plex query follows a language switch. `plexLang()` read the i18n singleton, and under the // React Compiler a value with no reactive input is computed once: after switching to Hungarian the // comfort shelf kept asking for its English cards. The language now comes off useTranslation. Real // i18n (the key-echo mock does not re-render on a switch, which is the very thing under test). import { describe, it, expect, afterEach, vi } from "vitest"; import type { ReactNode } from "react"; import { renderHook, act, waitFor, cleanup } from "@testing-library/react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { setLanguage } from "../i18n"; import { api } from "../lib/api"; import { useComfortPin } from "./comfortPin"; // Unmount BEFORE the language goes back: a mounted reader re-renders on the switch, and under a loaded // run that render landed after the test environment was gone ("window is not defined"). afterEach(() => { cleanup(); vi.restoreAllMocks(); setLanguage("en"); }); function wrapper({ children }: { children: ReactNode }) { const qc = new QueryClient({ defaultOptions: { queries: { retry: false } } }); return {children}; } describe("the comfort shelf after a language switch", () => { it("asks for its cards in the new language", async () => { const get = vi.spyOn(api, "comfortPins").mockImplementation(() => new Promise(() => {})); setLanguage("en"); renderHook(() => useComfortPin(true), { wrapper }); await waitFor(() => expect(get).toHaveBeenCalledWith("en")); act(() => setLanguage("hu")); await waitFor(() => expect(get).toHaveBeenCalledWith("hu")); }); });