import { describe, it, expect } from "vitest";
import { render, screen } from "@testing-library/react";
import { NodeStatusIndicator } from "../NodeStatusIndicator";
import type { NodeConfig } from "@fusion/core";
describe("NodeStatusIndicator", () => {
describe("when node is null", () => {
it("renders Local text badge", () => {
render();
expect(screen.getByText("Local")).toBeInTheDocument();
expect(screen.getByText("Local")).toHaveClass("node-status-indicator__label");
});
it("does not show details when showDetails is true but node is null", () => {
render();
expect(screen.getByText("Local")).toBeInTheDocument();
expect(screen.queryByText(/·/)).not.toBeInTheDocument();
});
});
describe("when node type is local", () => {
const localNode: NodeConfig = {
id: "node_local",
name: "Local Node",
type: "local",
status: "online",
maxConcurrent: 4,
createdAt: "2026-01-01T00:00:00.000Z",
updatedAt: "2026-01-01T00:00:00.000Z",
};
it("renders Local text badge", () => {
render();
expect(screen.getByText("Local")).toBeInTheDocument();
});
it("does not show status dot for local nodes", () => {
const { container } = render();
const dots = container.querySelectorAll(".node-status-indicator__dot");
expect(dots).toHaveLength(0);
});
it("renders with --local modifier class", () => {
render();
const container = screen.getByText("Local").closest(".node-status-indicator");
expect(container).toHaveClass("node-status-indicator--local");
});
});
describe("when node type is remote", () => {
const remoteNode: NodeConfig = {
id: "node_abc123",
name: "Remote Server",
type: "remote",
url: "http://remote:4040",
status: "online",
maxConcurrent: 2,
createdAt: "2026-01-01T00:00:00.000Z",
updatedAt: "2026-01-01T00:00:00.000Z",
};
it("renders node name", () => {
render();
expect(screen.getByText("Remote Server")).toBeInTheDocument();
});
it("shows green dot for online status", () => {
const { container } = render();
const dot = container.querySelector(".node-status-indicator__dot--online");
expect(dot).toBeInTheDocument();
});
it("renders with --remote modifier class", () => {
render();
const container = screen.getByText("Remote Server").closest(".node-status-indicator");
expect(container).toHaveClass("node-status-indicator--remote");
});
it("shows red dot for offline status", () => {
const offlineNode = { ...remoteNode, status: "offline" as const };
const { container } = render();
const dot = container.querySelector(".node-status-indicator__dot--offline");
expect(dot).toBeInTheDocument();
});
it("shows red dot for error status", () => {
const errorNode = { ...remoteNode, status: "error" as const };
const { container } = render();
const dot = container.querySelector(".node-status-indicator__dot--error");
expect(dot).toBeInTheDocument();
});
it("shows yellow spinner for connecting status", () => {
const connectingNode = { ...remoteNode, status: "connecting" as const };
const { container } = render();
const dot = container.querySelector(".node-status-indicator__dot--connecting");
expect(dot).toBeInTheDocument();
expect(dot?.querySelector(".node-status-indicator__spinner")).toBeInTheDocument();
});
});
describe("showDetails option", () => {
const remoteNode: NodeConfig = {
id: "node_abc123",
name: "Remote Server",
type: "remote",
url: "http://remote:4040",
status: "online",
maxConcurrent: 2,
createdAt: "2026-01-01T00:00:00.000Z",
updatedAt: "2026-01-01T00:00:00.000Z",
};
it("does not show details by default", () => {
render();
expect(screen.queryByText(/·/)).not.toBeInTheDocument();
});
it("shows details when showDetails is true", () => {
render();
const details = screen.getByText(/remote · Online/);
expect(details).toBeInTheDocument();
expect(details).toHaveClass("node-status-indicator__details");
});
it("shows correct details for offline status", () => {
const offlineNode = { ...remoteNode, status: "offline" as const };
render();
const details = screen.getByText(/remote · Offline/);
expect(details).toBeInTheDocument();
});
it("shows correct details for connecting status", () => {
const connectingNode = { ...remoteNode, status: "connecting" as const };
render();
const details = screen.getByText(/remote · Connecting/);
expect(details).toBeInTheDocument();
});
});
});