import { createRawSnippet } from "svelte";
import { describe, expect, it } from "vitest";
import Incentive from "../src/composites/Incentive.svelte";
import { incentive } from "../src/composites/incentive.variants";
import MerchandisingSurfacesConsumer from "./fixtures/MerchandisingSurfacesConsumer.svelte";
import { expectLayoutReadiness } from "./layout-readiness";
import { classes, classesOf, render, rendered } from "./mount";
describe("Incentive", () => {
it("composes canonical MediaObject and SectionHeading contracts into a named value proposition", () => {
const icon = createRawSnippet(() => ({
render: () => '',
}));
const incentive = rendered(
render(Incentive, {
title: "Complimentary delivery",
description: "Orders over $50 ship free.",
level: 3,
icon,
}),
);
const heading = incentive.querySelector("[data-section-heading] h3")!;
expect(incentive.matches("[data-media-object][data-incentive][role=region]")).toBe(true);
expect(incentive.getAttribute("aria-labelledby")).toBe(heading.id);
expect(heading.textContent).toBe("Complimentary delivery");
expect(incentive.textContent).toContain("Orders over $50 ship free.");
expect(incentive.querySelector("[data-incentive-icon]")?.getAttribute("aria-hidden")).toBe(
"true",
);
});
it("preserves focus for caller-owned incentive actions", () => {
const root = render(MerchandisingSurfacesConsumer);
const action = root.querySelector("[data-incentive] a")!;
action.focus();
expect(document.activeElement).toBe(action);
});
it("routes incentive rhythm through Density and inherits every nested appearance axis", () => {
const root = render(MerchandisingSurfacesConsumer);
const surface = root.querySelector("[data-incentive]")!;
const icon = surface.querySelector("[data-incentive-icon]")!;
expect(classes(surface)).toEqual(classesOf(incentive().root()));
expect(classes(surface)).toContain("gap-[var(--reddb-spatial-gap-md)]");
expect(classes(icon)).toContain("p-[var(--reddb-spatial-inset-sm)]");
expect(surface.closest('[data-theme="base"][data-color-scheme="dark"][data-density="compact"]'))
.not.toBeNull();
expect(surface.hasAttribute("data-theme")).toBe(false);
expect(surface.hasAttribute("data-color-scheme")).toBe(false);
expect(surface.hasAttribute("data-density")).toBe(false);
});
it("ships showcase, consumer, distributed export, and readiness evidence", () => {
expect(render(MerchandisingSurfacesConsumer).querySelector("[data-incentive]")).not.toBeNull();
expectLayoutReadiness("incentive", "Incentive");
});
});