/** * @vitest-environment jsdom */ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { act, renderHook } from "@testing-library/react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import type { ReactNode } from "react"; import { setApiInstance } from "../api"; import type { ApiClient } from "../api/client"; import { setCurrentWorkspace } from "../platform/workspace-storage"; import { getIssueSurfaceViewStore, pruneIssueSurfaceViewStates, } from "../issues/stores/surface-view-store"; import { useDeleteProject } from "./mutations"; vi.mock("../hooks", () => ({ useWorkspaceId: () => "ws-1", })); function createWrapper(qc: QueryClient) { return function Wrapper({ children }: { children: ReactNode }) { return {children}; }; } describe("useDeleteProject", () => { let qc: QueryClient; let deleteProject: ReturnType Promise>>; beforeEach(() => { qc = new QueryClient({ defaultOptions: { queries: { retry: false } } }); deleteProject = vi.fn().mockResolvedValue(undefined); setApiInstance({ deleteProject } as unknown as ApiClient); setCurrentWorkspace("acme", "ws-1"); }); afterEach(() => { qc.clear(); pruneIssueSurfaceViewStates([]); setCurrentWorkspace(null, null); vi.restoreAllMocks(); }); it("clears the deleted project's issue surface view state", async () => { const store = getIssueSurfaceViewStore("project:p1"); store.getState().setViewMode("list"); expect(store.getState().viewMode).toBe("list"); const { result } = renderHook(() => useDeleteProject(), { wrapper: createWrapper(qc), }); await act(async () => { await result.current.mutateAsync("p1"); }); expect(deleteProject).toHaveBeenCalledWith("p1"); expect(store.getState().viewMode).toBe("board"); }); });