import { createRawSnippet } from "svelte"; import { describe, expect, it } from "vitest"; import { DEFAULT_PHONE_MOCKUP_RATIO, PhoneMockup, phoneMockup as phoneMockupAppearance, } from "../src/index"; import MockupContractFailures from "./fixtures/MockupContractFailures.svelte"; import { classes, classesOf, render, rendered, styleOf } from "./mount"; const queuePreview = () => createRawSnippet(() => ({ render: () => '', })); describe("the deliberately failing frame fixture", () => { it("swallows the accessible content when the whole frame is hidden", () => { const root = render(MockupContractFailures, { failure: "swallowed-content" }); const article = root.querySelector('article[aria-label="Deployment preview"]')!; expect(article.closest('[aria-hidden="true"]')).not.toBeNull(); }); }); describe("the Base PhoneMockup", () => { it("keeps caller landmarks and focus outside its decorative phone body", () => { const element = rendered( render(PhoneMockup, { class: "max-w-xs", children: queuePreview() }), ); const chrome = element.querySelector("[data-phone-mockup-chrome]")!; const viewport = element.querySelector("[data-phone-mockup-viewport]")!; const navigation = viewport.querySelector('nav[aria-label="Phone queue"]')!; const button = navigation.querySelector("button")!; expect(element.getAttribute("role")).toBe("presentation"); expect(element.hasAttribute("aria-hidden")).toBe(false); expect(chrome.getAttribute("aria-hidden")).toBe("true"); expect(chrome.querySelector("a, button, input, select, textarea")).toBeNull(); expect(navigation.getAttribute("aria-label")).toBe("Phone queue"); button.focus(); expect(document.activeElement).toBe(button); expect(styleOf(viewport, "aspect-ratio")).toBe(`${DEFAULT_PHONE_MOCKUP_RATIO} / 1`); expect(classes(element)).toEqual( classesOf(phoneMockupAppearance().root({ class: "max-w-xs" })), ); expect(element.hasAttribute("data-theme")).toBe(false); expect(element.hasAttribute("data-color-scheme")).toBe(false); expect(element.hasAttribute("data-density")).toBe(false); }); });