import { createRawSnippet } from "svelte";
import { describe, expect, it } from "vitest";
import CollectionStructureContractFailures from "./fixtures/CollectionStructureContractFailures.svelte";
import CollectionStructureConsumer from "./fixtures/CollectionStructureConsumer.svelte";
import {
DescriptionList,
DESCRIPTION_LIST_GAPS,
descriptionList,
type DescriptionListItem,
} from "./fixtures/collection-structure-consumer";
import { classes, classesOf, render, rendered } from "./mount";
function hasTermDetailPairs(element: HTMLElement): boolean {
const entries = [...element.children];
return entries.length > 0 && entries.every((entry) => {
const children = [...entry.children];
return children.length === 2 && children[0]?.tagName === "DT" && children[1]?.tagName === "DD";
});
}
describe("the deliberately failing DescriptionList fixture", () => {
it("diagnoses broken term/detail pairing", () => {
const element = rendered(render(CollectionStructureContractFailures, {
failure: "broken-term-detail-pairing",
}));
expect(element.tagName).toBe("DL");
expect(hasTermDetailPairs(element)).toBe(false);
});
});
describe("the Base DescriptionList", () => {
it("is available through Base", () => {
expect(DescriptionList).toBeDefined();
});
it("owns one native term/detail pair per caller entry", () => {
const items: readonly DescriptionListItem[] = [
{ term: "Region", detail: "South America" },
{
term: "Owner",
detail: createRawSnippet(() => ({ render: () => 'Platform team' })),
},
];
const element = rendered(render(DescriptionList, {
items,
"aria-label": "Service details",
}));
expect(element.tagName).toBe("DL");
expect(hasTermDetailPairs(element)).toBe(true);
expect([...element.querySelectorAll("dt")].map((term) => term.textContent?.trim()))
.toEqual(["Region", "Owner"]);
expect(element.querySelector("a")?.textContent).toBe("Platform team");
expect(element.getAttribute("aria-label")).toBe("Service details");
expect(element.tabIndex).toBe(-1);
});
it("keeps Density-owned pairing space in its public appearance seam", () => {
expect(DESCRIPTION_LIST_GAPS).toEqual(["sm", "md", "lg"]);
const element = rendered(render(DescriptionList, {
items: [{ term: "Region", detail: "South America" }],
gap: "lg",
class: "min-w-0",
}));
const slots = descriptionList({ gap: "lg" });
expect(classes(element)).toEqual(classesOf(slots.root({ class: "min-w-0" })));
expect(classes(element.querySelector("[data-description-item]")!))
.toEqual(classesOf(slots.item()));
expect(element.hasAttribute("data-theme")).toBe(false);
expect(element.hasAttribute("data-color-scheme")).toBe(false);
expect(element.hasAttribute("data-density")).toBe(false);
});
it("inherits every nested appearance axis", () => {
const element = render(CollectionStructureConsumer)
.querySelector("[data-nested-description-list]")!;
expect(element.hasAttribute("data-theme")).toBe(false);
expect(element.hasAttribute("data-color-scheme")).toBe(false);
expect(element.hasAttribute("data-density")).toBe(false);
});
});