import { describe, it, expect, vi } from "vitest"; import { render, screen, fireEvent } from "@testing-library/react"; import { DockerProvisioningStatus } from "../DockerProvisioningStatus"; import type { DockerProvisionResult } from "@fusion/core"; vi.mock("lucide-react", () => ({ CheckCircle: () => CheckCircle, AlertCircle: () => AlertCircle, ExternalLink: () => ExternalLink, RefreshCw: () => RefreshCw, Terminal: () => Terminal, })); describe("DockerProvisioningStatus", () => { describe("provisioning state", () => { it("renders spinner and stage text when isProvisioning=true", () => { const { container } = render( , ); // Should show loading state with dots const dots = container.querySelectorAll(".provisioning-status__dot"); expect(dots.length).toBe(3); expect(screen.getByText("Creating Docker node...")).toBeInTheDocument(); }); }); describe("success state", () => { const successResult: DockerProvisionResult = { success: true, containerId: "abc123def456ghi789jkl012mno345pqr678", containerName: "fusion-test-abc12345", nodeId: "node_abc123", apiKey: "fn_testkey", portMapping: "4040:49152", durationMs: 2500, }; it("renders success message and container ID", () => { render( , ); expect(screen.getByText("Node created successfully!")).toBeInTheDocument(); // Container ID is truncated (first 12 chars) expect(screen.getByText("abc123def456")).toBeInTheDocument(); // Duration displayed expect(screen.getByText("Provisioned in 2.5s")).toBeInTheDocument(); }); it("renders View Node button when onViewNode is provided with nodeId", () => { const onViewNode = vi.fn(); render( , ); const button = screen.getByText("View Node"); expect(button).toBeInTheDocument(); fireEvent.click(button); expect(onViewNode).toHaveBeenCalledWith("node_abc123"); }); it("does not render View Node button without nodeId", () => { const onViewNode = vi.fn(); render( , ); expect(screen.queryByText("View Node")).not.toBeInTheDocument(); }); }); describe("failure state", () => { const failureResult: DockerProvisionResult = { success: false, error: "Image pull failed: not found", failedStage: "image-pull", durationMs: 500, }; it("renders error message and failed stage", () => { render( , ); expect(screen.getByText("Image pull failed: not found")).toBeInTheDocument(); expect(screen.getByText("Failed at: image-pull")).toBeInTheDocument(); }); it("renders Retry button when onRetry is provided", () => { const onRetry = vi.fn(); render( , ); const retryButton = screen.getByText("Retry"); expect(retryButton).toBeInTheDocument(); fireEvent.click(retryButton); expect(onRetry).toHaveBeenCalledTimes(1); }); it("does not render Retry button when onRetry is not provided", () => { render( , ); expect(screen.queryByText("Retry")).not.toBeInTheDocument(); }); it("renders docker logs hint when containerName is available", () => { render( , ); expect( screen.getByText("docker logs fusion-test-abc12345"), ).toBeInTheDocument(); }); it("displays error from prop when result has no error", () => { render( , ); expect(screen.getByText("Something went wrong")).toBeInTheDocument(); }); it("displays fallback error message when no error is available", () => { render( , ); expect(screen.getByText("Provisioning failed")).toBeInTheDocument(); }); }); });