import { createRawSnippet } from "svelte";
import { describe, expect, it, vi } from "vitest";
import {
AlertDialog,
alertDialog as alertDialogAppearance,
alertDialogActions,
button,
} from "./fixtures/drawer-alert-dialog-consumer";
import { classes, classesOf, render } from "./mount";
function text(content: string) {
return createRawSnippet(() => ({ render: () => `
${content}
` }));
}
describe("the Base AlertDialog", () => {
it("keeps destructive confirmation open when the outside surface is clicked", () => {
const root = render(AlertDialog, {
triggerLabel: "Delete deployment",
title: "Delete deployment?",
confirmLabel: "Delete",
children: text("This cannot be undone."),
});
root.querySelector("[data-dialog-trigger]")!.click();
const dialog = root.querySelector("dialog")!;
expect(dialog.getAttribute("role")).toBe("alertdialog");
dialog.dispatchEvent(new MouseEvent("click", { bubbles: true }));
expect(dialog.open).toBe(true);
});
it("focuses the safe action and restores invoking focus after either decision", () => {
const onconfirm = vi.fn();
const root = render(AlertDialog, {
triggerLabel: "Delete deployment",
title: "Delete deployment?",
confirmLabel: "Delete",
cancelLabel: "Keep deployment",
onconfirm,
children: text("This cannot be undone."),
});
const trigger = root.querySelector("[data-dialog-trigger]")!;
trigger.focus();
trigger.click();
const dialog = root.querySelector("dialog")!;
const cancel = root.querySelector("[data-alert-dialog-cancel]")!;
expect(document.activeElement).toBe(cancel);
cancel.click();
expect(dialog.open).toBe(false);
expect(document.activeElement).toBe(trigger);
expect(onconfirm).not.toHaveBeenCalled();
trigger.click();
root.querySelector("[data-alert-dialog-confirm]")!.click();
expect(dialog.open).toBe(false);
expect(document.activeElement).toBe(trigger);
expect(onconfirm).toHaveBeenCalledTimes(1);
});
it("wears its exported token appearance and canonical Button actions", () => {
const root = render(AlertDialog, {
triggerLabel: "Delete deployment",
title: "Delete deployment?",
confirmLabel: "Delete",
class: "consumer-alert-dialog",
});
const dialog = root.querySelector("dialog")!;
const actions = root.querySelector("[data-alert-dialog-actions]")!;
const cancel = root.querySelector("[data-alert-dialog-cancel]")!;
const confirm = root.querySelector("[data-alert-dialog-confirm]")!;
expect(classes(dialog)).toEqual(
classesOf(alertDialogAppearance({ class: "consumer-alert-dialog" })),
);
expect(classes(actions)).toEqual(classesOf(alertDialogActions()));
expect(classes(actions).has("gap-[var(--reddb-spatial-gap-md)]")).toBe(true);
expect(classes(cancel)).toEqual(classesOf(button({ variant: "secondary", size: "sm" })));
expect(classes(confirm)).toEqual(classesOf(button({ variant: "primary", tone: "danger", size: "sm" })));
expect(classes(dialog).has("motion-reduce:transition-none")).toBe(true);
});
});