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();
});
});
});