import { createRawSnippet } from "svelte"; import { describe, expect, it } from "vitest"; import OrderSummary from "../src/composites/OrderSummary.svelte"; import { orderSummary } from "../src/composites/order-summary.variants"; import { expectCommerceReadiness } from "./commerce-readiness"; import CommerceSurfacesConsumer from "./fixtures/CommerceSurfacesConsumer.svelte"; import { classes, classesOf, render, rendered } from "./mount"; const LINES = [ { label: "Subtotal", value: "$48.00" }, { label: "Delivery", value: "$5.00" }, ] as const; describe("OrderSummary", () => { it("composes a visibly named region from canonical Card and DescriptionList", () => { const summary = rendered( render(OrderSummary, { title: "Order summary", lines: LINES, totalLabel: "Total", total: "$53.00", }), ); expect(summary.getAttribute("role")).toBe("region"); expect(summary.getAttribute("aria-labelledby")).toBe( summary.querySelector("[data-section-heading]")?.id, ); expect(summary.querySelectorAll("[data-description-item]")).toHaveLength(2); expect(summary.querySelector("[data-order-summary-total] output")?.textContent).toBe("$53.00"); }); it("keeps caller-owned actions in native keyboard focus", () => { const summary = rendered( render(OrderSummary, { title: "Order summary", lines: LINES, totalLabel: "Total", total: "$53.00", actions: createRawSnippet(() => ({ render: () => '' })), }), ); const action = summary.querySelector("button")!; action.focus(); expect(document.activeElement).toBe(action); }); it("inherits nested appearance and keeps summary spacing Density-owned", () => { const scope = document.createElement("div"); scope.dataset.theme = "application"; scope.dataset.colorScheme = "dark"; scope.dataset.density = "compact"; const target = render(OrderSummary, { title: "Order summary", lines: LINES, totalLabel: "Total", total: "$53.00", }); scope.append(...target.children); const summary = scope.querySelector("[data-order-summary]")!; const styles = orderSummary(); for (const name of classesOf(styles.root())) expect(classes(summary)).toContain(name); expect(classes(summary.querySelector("[data-order-summary-total]")!)).toContain( "gap-[var(--reddb-spatial-gap-md)]", ); expect(summary.hasAttribute("data-theme")).toBe(false); expect(summary.hasAttribute("data-color-scheme")).toBe(false); expect(summary.hasAttribute("data-density")).toBe(false); }); it("consumer-compiles, exports, showcases, and declares complete readiness", () => { expect(render(CommerceSurfacesConsumer).querySelector("[data-order-summary]")).not.toBeNull(); expectCommerceReadiness("order-summary", "OrderSummary"); }); });