useTags reset the language in a finally while its hook was still mounted;
the switch scheduled a render, and in a loaded gate run it landed after
the jsdom environment was torn down ('window is not defined', two
unhandled errors). auditColumns and comfortPin had the same shape.
38 lines
1.7 KiB
TypeScript
38 lines
1.7 KiB
TypeScript
// @vitest-environment jsdom
|
|
//
|
|
// E30 S3: 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", E31 S5).
|
|
afterEach(() => {
|
|
cleanup();
|
|
vi.restoreAllMocks();
|
|
setLanguage("en");
|
|
});
|
|
|
|
function wrapper({ children }: { children: ReactNode }) {
|
|
const qc = new QueryClient({ defaultOptions: { queries: { retry: false } } });
|
|
return <QueryClientProvider client={qc}>{children}</QueryClientProvider>;
|
|
}
|
|
|
|
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"));
|
|
});
|
|
});
|