1import type { EnvironmentId } from "@t3tools/contracts";
2import { act, useLayoutEffect } from "react";
3import { createRoot } from "react-dom/client";
4import { expect, it, vi } from "vite-plus/test";
5
6const harness = vi.hoisted(() => ({ saved: [] as unknown[] }));
7
8vi.mock("../../state/preferences", () => ({ updateMobilePreferencesAtom: {} }));
9vi.mock("@effect/atom-react", async (importOriginal) => ({
10 ...(await importOriginal<typeof import("@effect/atom-react")>()),
11 useAtomSet: () => (value: unknown) => harness.saved.push(value),
12}));
13
14import { HomeListOptionsProvider, useHomeListOptions } from "./home-list-options";
15
16const ENVIRONMENT = "env-1" as EnvironmentId;
17const AVAILABLE = new Set([ENVIRONMENT]);
18
19it("saves the scope from every update made in one event", async () => {
20 harness.saved = [];
21 let controls: ReturnType<typeof useHomeListOptions> | undefined;
22 function Probe() {
23 const result = useHomeListOptions(AVAILABLE);
24 useLayoutEffect(() => {
25 controls = result;
26 });
27 return null;
28 }
29
30 const root = createRoot(document.createElement("div"));
31 await act(async () =>
32 root.render(
33 <HomeListOptionsProvider projectGroupingMode="repository">
34 <Probe />
35 </HomeListOptionsProvider>,
36 ),
37 );
38 act(() => {
39 controls!.setSelectedEnvironmentId(ENVIRONMENT);
40 controls!.setSelectedProjectKey("env-1:project-1");
41 });
42
43 expect(harness.saved.at(-1)).toEqual({
44 threadListFilters: { environmentId: ENVIRONMENT, projectKey: "env-1:project-1" },
45 });
46 expect(controls!.options.selectedEnvironmentId).toBe(ENVIRONMENT);
47 expect(controls!.options.selectedProjectKey).toBe("env-1:project-1");
48 act(() => root.unmount());
49});