1import { EnvironmentId } from "@t3tools/contracts";
2import { describe, expect, it, vi } from "vite-plus/test";
3
4import { act, fakeTimers, render } from "../../test/render";
5import { useEnvironmentStateHeldFor } from "./useEnvironmentDisconnectDelay";
6
7const first = EnvironmentId.make("env-first");
8const second = EnvironmentId.make("env-second");
9
10function Probe(props: { environmentId: EnvironmentId | null }) {
11 const held = useEnvironmentStateHeldFor(props.environmentId, 1_000);
12 return <output>{held ? "held" : "waiting"}</output>;
13}
14
15describe("useEnvironmentStateHeldFor", () => {
16 it("restarts the delay whenever the environment changes", async () => {
17 await using screen = await render(<Probe environmentId={first} />, {
18 // A bare hook probe; nothing here navigates.
19 router: false,
20 });
21 using _timers = fakeTimers();
22 await screen.rerender(<Probe environmentId={second} />);
23 await expect.element(screen.getByText("waiting")).toBeInTheDocument();
24
25 await act(() => vi.advanceTimersByTime(999));
26 await expect.element(screen.getByText("waiting")).toBeInTheDocument();
27
28 await act(() => vi.advanceTimersByTime(1));
29 await expect.element(screen.getByText("held")).toBeInTheDocument();
30
31 await screen.rerender(<Probe environmentId={null} />);
32 await expect.element(screen.getByText("waiting")).toBeInTheDocument();
33 await screen.rerender(<Probe environmentId={second} />);
34 await expect.element(screen.getByText("waiting")).toBeInTheDocument();
35 await act(() => vi.advanceTimersByTime(1_000));
36 await expect.element(screen.getByText("held")).toBeInTheDocument();
37 });
38});