import { render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { beforeEach, describe, expect, it, vi } from "vitest"; import StartInstanceModal from "./StartInstanceModal"; import { useAppStore } from "../../stores/useAppStore"; import type { Instance, Profile } from "../../generated/types"; vi.mock("../../services/api", () => ({ launchInstance: vi.fn(), fetchInstances: vi.fn(), })); const profile: Profile = { id: "prof_alpha", name: "alpha", created: "2026-03-01T10:00:00Z", lastUsed: "2026-03-05T10:00:00Z", diskUsage: 1024, sizeMB: 12, running: false, }; describe("StartInstanceModal", () => { beforeEach(() => { vi.clearAllMocks(); useAppStore.setState({ instances: [] }); }); it("builds its own launch command from local form state", async () => { render( {}} />, ); const command = document.querySelector("textarea") as HTMLTextAreaElement; expect(command.value).toContain('"profileId":"prof_alpha"'); expect(command.value).toContain('"mode":"headed"'); await userEvent.type( screen.getByPlaceholderText("Auto-select from configured range"), "9988", ); await userEvent.click( screen.getByLabelText("Headless (best for Docker/VPS)"), ); expect(command.value).toContain('"port":"9988"'); expect(command.value).not.toContain('"mode":"headed"'); }); it("launches the selected profile and refreshes instances", async () => { const { fetchInstances, launchInstance } = await import("../../services/api"); const onClose = vi.fn(); const updatedInstances: Instance[] = [ { id: "inst_alpha", profileId: "prof_alpha", profileName: "alpha", port: "9988", headless: false, status: "running", startTime: "2026-03-06T10:00:00Z", attached: false, }, ]; vi.mocked(launchInstance).mockResolvedValue({} as never); vi.mocked(fetchInstances).mockResolvedValue(updatedInstances); render( , ); await userEvent.click(screen.getByRole("button", { name: "Start" })); await waitFor(() => { expect(launchInstance).toHaveBeenCalledWith({ name: "alpha", mode: "headed", port: undefined, }); }); expect(fetchInstances).toHaveBeenCalledTimes(1); expect(useAppStore.getState().instances).toEqual(updatedInstances); expect(onClose).toHaveBeenCalledTimes(1); }); });