// @vitest-environment jsdom import { act } from "react"; import type { ComponentProps } from "react"; import { createRoot } from "react-dom/client"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import type { Issue, Project } from "@paperclipai/shared"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { IssueWorkspaceCard } from "./IssueWorkspaceCard"; const mockInstanceSettingsApi = vi.hoisted(() => ({ getExperimental: vi.fn(), })); const mockExecutionWorkspacesApi = vi.hoisted(() => ({ list: vi.fn(), })); vi.mock("../api/instanceSettings", () => ({ instanceSettingsApi: mockInstanceSettingsApi, })); vi.mock("../api/execution-workspaces", () => ({ executionWorkspacesApi: mockExecutionWorkspacesApi, })); vi.mock("../context/CompanyContext", () => ({ useCompany: () => ({ selectedCompanyId: "company-1", }), })); vi.mock("@/lib/router", () => ({ Link: ({ children, to, ...props }: ComponentProps<"a"> & { to: string }) => {children}, })); // eslint-disable-next-line @typescript-eslint/no-explicit-any (globalThis as any).IS_REACT_ACT_ENVIRONMENT = true; function createIssue(overrides: Partial = {}): Issue { return { id: "issue-1", companyId: "company-1", projectId: "project-1", projectWorkspaceId: null, goalId: null, parentId: null, title: "Issue workspace", description: null, status: "todo", priority: "medium", assigneeAgentId: null, assigneeUserId: null, checkoutRunId: null, executionRunId: null, executionAgentNameKey: null, executionLockedAt: null, createdByAgentId: null, createdByUserId: null, issueNumber: 1, identifier: "PAP-1", requestDepth: 0, billingCode: null, assigneeAdapterOverrides: null, executionWorkspaceId: null, executionWorkspacePreference: "shared_workspace", executionWorkspaceSettings: { mode: "shared_workspace" }, startedAt: null, completedAt: null, cancelledAt: null, hiddenAt: null, createdAt: new Date("2026-04-08T00:00:00.000Z"), updatedAt: new Date("2026-04-08T00:00:00.000Z"), ...overrides, }; } function createProject(): Project { return { id: "project-1", companyId: "company-1", urlKey: "project-1", goalId: null, goalIds: [], goals: [], name: "Project 1", description: null, status: "in_progress", leadAgentId: null, targetDate: null, color: "#22c55e", env: null, pauseReason: null, pausedAt: null, archivedAt: null, executionWorkspacePolicy: { enabled: true, defaultMode: "shared_workspace", allowIssueOverride: true, }, codebase: { workspaceId: null, repoUrl: null, repoRef: null, defaultRef: null, repoName: null, localFolder: null, managedFolder: "/tmp/project-1", effectiveLocalFolder: "/tmp/project-1", origin: "managed_checkout", }, workspaces: [], primaryWorkspace: null, createdAt: new Date("2026-04-08T00:00:00.000Z"), updatedAt: new Date("2026-04-08T00:00:00.000Z"), }; } function renderCard(container: HTMLDivElement) { const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false }, }, }); const root = createRoot(container); act(() => { root.render( {}} /> , ); }); return root; } async function flush() { await act(async () => { await Promise.resolve(); await Promise.resolve(); }); } describe("IssueWorkspaceCard", () => { let container: HTMLDivElement; beforeEach(() => { container = document.createElement("div"); document.body.appendChild(container); mockExecutionWorkspacesApi.list.mockReset(); mockExecutionWorkspacesApi.list.mockResolvedValue([]); }); afterEach(() => { document.body.innerHTML = ""; }); it("renders a stable skeleton while workspace settings are still loading", async () => { mockInstanceSettingsApi.getExperimental.mockImplementation(() => new Promise(() => {})); const root = renderCard(container); await flush(); expect(container.querySelector('[data-testid="issue-workspace-card-skeleton"]')).not.toBeNull(); await act(async () => { root.unmount(); }); }); });