// @vitest-environment jsdom
import { act } from "react";
import { createRoot } from "react-dom/client";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { BlockedReasonChip } from "./BlockedReasonChip";
(globalThis as unknown as { IS_REACT_ACT_ENVIRONMENT: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
describe("BlockedReasonChip", () => {
let container: HTMLDivElement;
beforeEach(() => {
container = document.createElement("div");
document.body.appendChild(container);
});
afterEach(() => {
container.remove();
});
it("renders the canonical group label and exposes severity via aria-label", () => {
const root = createRoot(container);
act(() => {
root.render(
,
);
});
const chip = container.querySelector('[data-testid="blocked-reason-chip"]');
expect(chip).not.toBeNull();
expect(chip?.getAttribute("data-variant")).toBe("needs_decision");
expect(chip?.getAttribute("data-severity")).toBe("high");
expect(chip?.getAttribute("aria-label")).toBe("Reason: Needs decision, severity high");
expect(chip?.textContent).toContain("Needs decision");
act(() => {
root.unmount();
});
});
it("includes a severity dot for critical and high but not medium/low", () => {
const cases: Array<["critical" | "high" | "medium" | "low", boolean]> = [
["critical", true],
["high", true],
["medium", false],
["low", false],
];
for (const [severity, hasDot] of cases) {
const local = document.createElement("div");
document.body.appendChild(local);
const root = createRoot(local);
act(() => {
root.render();
});
const chip = local.querySelector('[data-testid="blocked-reason-chip"]');
const dot = chip?.querySelector('[aria-hidden="true"]');
if (hasDot) {
expect(dot).not.toBeNull();
} else {
// The first inner span (icon) is always aria-hidden, but the dot is the first child.
// Distinguish by class name presence of bg-red-500/bg-orange-500.
const classy = chip?.querySelector('span[class*="bg-red-500"], span[class*="bg-orange-500"]');
expect(classy).toBeNull();
}
act(() => {
root.unmount();
});
local.remove();
}
});
it("hides the icon when compact is true", () => {
const root = createRoot(container);
act(() => {
root.render(
,
);
});
const chip = container.querySelector('[data-testid="blocked-reason-chip"]');
const svg = chip?.querySelector("svg");
expect(svg).toBeNull();
act(() => {
root.unmount();
});
});
});