import { forwardRef, useImperativeHandle, useRef, useState, type ReactNode } from "react"; import { describe, it, expect, vi, beforeEach } from "vitest"; import { render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; const mockQuickCreateIssue = vi.hoisted(() => vi.fn()); const mockSetLastAgentId = vi.hoisted(() => vi.fn()); const mockSetPrompt = vi.hoisted(() => vi.fn()); const mockClearPrompt = vi.hoisted(() => vi.fn()); const mockSetKeepOpen = vi.hoisted(() => vi.fn()); const mockSetLastMode = vi.hoisted(() => vi.fn()); const mockToastSuccess = vi.hoisted(() => vi.fn()); const mockQuickCreateStore = { lastAgentId: null as string | null, setLastAgentId: mockSetLastAgentId, prompt: "Persisted draft prompt", setPrompt: mockSetPrompt, clearPrompt: mockClearPrompt, keepOpen: false, setKeepOpen: mockSetKeepOpen, }; vi.mock("@tanstack/react-query", () => ({ useQuery: ({ queryKey }: { queryKey: string[] }) => { switch (queryKey[0]) { case "members": return { data: [{ user_id: "user-1", role: "admin" }] }; case "agents": return { data: [{ id: "agent-1", name: "Bohan", archived_at: null, runtime_id: "runtime-1" }], }; case "runtimes": return { data: [{ id: "runtime-1", metadata: { cli_version: "1.2.3" } }] }; default: return { data: [] }; } }, })); vi.mock("@multica/core/api", () => ({ api: { quickCreateIssue: mockQuickCreateIssue, }, ApiError: class ApiError extends Error { body?: unknown; }, })); vi.mock("@multica/core/hooks", () => ({ useWorkspaceId: () => "ws-test", })); vi.mock("@multica/core/paths", () => ({ useCurrentWorkspace: () => ({ name: "Test Workspace" }), })); vi.mock("@multica/core/workspace/queries", () => ({ agentListOptions: () => ({ queryKey: ["agents"] }), memberListOptions: () => ({ queryKey: ["members"] }), })); vi.mock("@multica/core/issues/stores/quick-create-store", () => ({ useQuickCreateStore: (selector?: (state: typeof mockQuickCreateStore) => unknown) => (selector ? selector(mockQuickCreateStore) : mockQuickCreateStore), })); vi.mock("@multica/core/issues/stores/create-mode-store", () => ({ useCreateModeStore: (selector?: (state: { setLastMode: typeof mockSetLastMode }) => unknown) => (selector ? selector({ setLastMode: mockSetLastMode }) : { setLastMode: mockSetLastMode }), })); vi.mock("@multica/core/auth", () => ({ useAuthStore: (selector?: (state: { user: { id: string } }) => unknown) => (selector ? selector({ user: { id: "user-1" } }) : { user: { id: "user-1" } }), })); vi.mock("@multica/core/runtimes", () => ({ runtimeListOptions: () => ({ queryKey: ["runtimes"] }), checkQuickCreateCliVersion: () => ({ state: "ok", min: "1.0.0" }), readRuntimeCliVersion: () => "1.2.3", MIN_QUICK_CREATE_CLI_VERSION: "1.0.0", })); vi.mock("@multica/core/hooks/use-file-upload", () => ({ useFileUpload: () => ({ uploadWithToast: vi.fn(), uploading: false }), })); vi.mock("../issues/components/pickers/assignee-picker", () => ({ canAssignAgent: () => true, })); vi.mock("../common/actor-avatar", () => ({ ActorAvatar: () => , })); vi.mock("../issues/components", () => ({ PriorityPicker: () =>
, DueDatePicker: () =>
, })); vi.mock("../projects/components/project-picker", () => ({ ProjectPicker: () =>
, })); vi.mock("../common/pill-button", () => ({ PillButton: () =>
, })); vi.mock("../editor", () => { const ContentEditor = forwardRef(({ defaultValue, onUpdate, onSubmit, placeholder }: any, ref: any) => { const valueRef = useRef(defaultValue || ""); const [value, setValue] = useState(defaultValue || ""); useImperativeHandle(ref, () => ({ getMarkdown: () => valueRef.current, clearContent: () => { valueRef.current = ""; setValue(""); }, uploadFile: vi.fn(), focus: vi.fn(), })); return (