// @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\""); }); });