import * as React from "react";
import { render } from "@testing-library/react";
import DebugResultListItem from "../../../src/components/DebugResultListItem";
import { PatronDebugResult } from "../../../src/api/patronDebug";
describe("DebugResultListItem", () => {
const renderResult = (result: PatronDebugResult, sequence = 0) => {
return render();
};
it("renders success result with string details", () => {
const result: PatronDebugResult = {
label: "SIP2 Connection",
success: true,
details: "Connected to server:6001",
};
const { getByText } = renderResult(result);
expect(getByText("SIP2 Connection")).toBeInTheDocument();
expect(getByText("passed")).toBeInTheDocument();
expect(getByText("Connected to server:6001")).toBeInTheDocument();
});
it("renders failure result with string details", () => {
const result: PatronDebugResult = {
label: "Password Validation",
success: false,
details: "Password does not match",
};
const { getByText, container } = renderResult(result);
expect(getByText("Password Validation")).toBeInTheDocument();
expect(getByText("failed")).toBeInTheDocument();
const li = container.querySelector("li");
expect(li).toHaveClass("failure");
});
it("renders success result with CSS class", () => {
const result: PatronDebugResult = {
label: "Step 1",
success: true,
details: null,
};
const { container } = renderResult(result);
const li = container.querySelector("li");
expect(li).toHaveClass("success");
});
it("renders null details without detail section", () => {
const result: PatronDebugResult = {
label: "Step 1",
success: true,
details: null,
};
const { container } = renderResult(result);
expect(container.querySelector(".debug-result-detail")).toBeNull();
expect(container.querySelector(".debug-result-table")).toBeNull();
expect(container.querySelector(".debug-result-list")).toBeNull();
});
it("renders list details as ordered list in panel", () => {
const result: PatronDebugResult = {
label: "Multi Result",
success: true,
details: ["item one", "item two", "item three"],
};
const { getByText, container } = renderResult(result);
expect(getByText("item one")).toBeInTheDocument();
expect(getByText("item two")).toBeInTheDocument();
expect(getByText("item three")).toBeInTheDocument();
const ol = container.querySelector(".debug-result-list");
expect(ol).toBeInTheDocument();
});
it("renders dict details as key-value table in panel", () => {
const result: PatronDebugResult = {
label: "Patron Data",
success: true,
details: {
username: "jdoe",
barcode: "12345",
fines: "0.00",
},
};
const { getByText, container } = renderResult(result);
expect(getByText("username")).toBeInTheDocument();
expect(getByText("jdoe")).toBeInTheDocument();
expect(getByText("barcode")).toBeInTheDocument();
expect(getByText("12345")).toBeInTheDocument();
const table = container.querySelector(".debug-result-table");
expect(table).toBeInTheDocument();
});
it("renders dict details with nested object values as JSON", () => {
const result: PatronDebugResult = {
label: "SirsiDynix Data",
success: true,
details: {
patronType: { key: "testtype", label: "Test Type" },
name: "Jane Doe",
},
};
const { getByText, container } = renderResult(result);
expect(getByText("patronType")).toBeInTheDocument();
// Nested object should render as pretty-printed JSON inside a tag
const codeEl = container.querySelector(
"td.debug-result-value code"
) as HTMLElement;
expect(codeEl).toBeInTheDocument();
expect(codeEl.textContent).toBe(
JSON.stringify({ key: "testtype", label: "Test Type" }, null, 2)
);
expect(getByText("name")).toBeInTheDocument();
expect(getByText("Jane Doe")).toBeInTheDocument();
});
it("renders top-level number details as text content", () => {
const result: PatronDebugResult = {
label: "Retry Count",
success: true,
details: 3,
};
const { getByText, container } = renderResult(result);
expect(getByText("Retry Count")).toBeInTheDocument();
expect(getByText("3")).toBeInTheDocument();
expect(container.querySelector(".debug-result-table")).toBeNull();
});
it("renders top-level boolean details as text content", () => {
const result: PatronDebugResult = {
label: "Eligibility",
success: false,
details: false,
};
const { getByText, container } = renderResult(result);
expect(getByText("Eligibility")).toBeInTheDocument();
expect(getByText("false")).toBeInTheDocument();
expect(container.querySelector(".debug-result-table")).toBeNull();
});
it("renders dict details with mixed value types (number, boolean, null)", () => {
const result: PatronDebugResult = {
label: "Mixed Data",
success: true,
details: {
username: "jdoe",
fines: 2.5,
active: true,
block_reason: null,
},
};
const { getByText, container } = renderResult(result);
expect(getByText("username")).toBeInTheDocument();
expect(getByText("jdoe")).toBeInTheDocument();
expect(getByText("fines")).toBeInTheDocument();
expect(getByText("2.5")).toBeInTheDocument();
expect(getByText("active")).toBeInTheDocument();
expect(getByText("true")).toBeInTheDocument();
expect(getByText("block_reason")).toBeInTheDocument();
expect(getByText("null")).toBeInTheDocument();
const table = container.querySelector(".debug-result-table");
expect(table).toBeInTheDocument();
});
});