// @vitest-environment node
import { describe, expect, it } from "vitest";
import { renderToStaticMarkup } from "react-dom/server";
import { ExternalObjectPill } from "./ExternalObjectPill";
import { ExternalObjectStatusSummary } from "./ExternalObjectStatusSummary";
describe("ExternalObjectPill", () => {
it("renders a clickable anchor when a URL is provided", () => {
const html = renderToStaticMarkup(
,
);
expect(html).toContain('href="https://github.com/acme/web/pull/241"');
expect(html).toContain('data-mention-kind="external-object"');
expect(html).toContain('data-external-status="succeeded"');
expect(html).toContain('data-external-liveness="fresh"');
expect(html).toContain("×4");
expect(html).toContain('aria-label="GitHub pull request — Succeeded: Add external refs"');
});
it("falls back to a non-interactive span when no URL is supplied", () => {
const html = renderToStaticMarkup(
,
);
expect(html).toContain('data-mention-kind="external-object"');
expect(html).not.toContain(" {
const stale = renderToStaticMarkup(
,
);
expect(stale).toContain("opacity-70");
expect(stale).toContain("[border-style:dashed]");
const auth = renderToStaticMarkup(
,
);
expect(auth).toContain("[border-style:dashed]");
});
it("does not show a source count when only a single mention is present", () => {
const html = renderToStaticMarkup(
,
);
expect(html).not.toContain("×");
});
it("labels detected GitHub pull requests without fetched status as not refreshed", () => {
const html = renderToStaticMarkup(
,
);
expect(html).toContain("PR 241 - Not yet refreshed");
expect(html).toContain('aria-label="GitHub pull request — Not yet refreshed: acme/web#241"');
expect(html).not.toContain("Not yet resolved");
});
it("uses the object link label, provider icon, and visible status when supplied", () => {
const html = renderToStaticMarkup(
,
);
expect(html).toContain("Merged");
expect(html).toContain("PR 241 - Merged");
expect(html).not.toContain("acme/web#241");
expect(html).toContain("text-violet-600");
expect(html).not.toContain(">Github Pull Request");
expect(html).toContain('aria-label="Github Pull Request — Merged: acme/web#241: Add rich object presentation metadata"');
});
it("labels generic URL link objects as URL instead of URL link", () => {
const html = renderToStaticMarkup(
,
);
expect(html).toContain('aria-label="URL — Not yet resolved"');
expect(html).not.toContain("URL link");
});
});
describe("ExternalObjectStatusSummary", () => {
it("hides itself when there are no external objects", () => {
const html = renderToStaticMarkup();
expect(html).toBe("");
});
it("hides itself when the highest severity is muted", () => {
const html = renderToStaticMarkup(
,
);
expect(html).toBe("");
});
it("shows the dominant-severity icon and count", () => {
const html = renderToStaticMarkup(
,
);
expect(html).toContain('data-external-status="failed"');
expect(html).toContain('data-external-tone="danger"');
expect(html).toContain(">3<");
expect(html).toContain("aria-label=\"External objects: 3 failed, 2 succeeded, 5 total\"");
});
});