// @vitest-environment happy-dom import { act, useState } from "react"; import { createRoot } from "react-dom/client"; import { expect, it, vi } from "vitest"; import { ArtifactSelect } from "./catalog-select"; const items = ["Gladiator", "Wanderer", "Emblem"].map((name) => ({ key: name.toLowerCase(), name, imageUrl: "/artifact.png", rarity: 5, })); function Picker() { const [values, setValues] = useState([]); return ; } it("selects at most two artifact sets and allows removing and clearing them", async () => { vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true); const container = document.createElement("div"); document.body.append(container); const root = createRoot(container); const option = (name: string) => Array.from(document.querySelectorAll("[role=option]")) .find((element) => element.textContent?.includes(name))!; const click = async (element: HTMLElement) => { await act(async () => { element.click(); }); }; try { await act(async () => { root.render(); }); const trigger = container.querySelector("[data-slot=combobox-trigger]")!; await click(trigger); const input = document.querySelector('input[placeholder="Search artifacts"]')!; const search = async (value: string) => { await act(async () => { Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, "value")!.set!.call(input, value); input.dispatchEvent(new Event("input", { bubbles: true })); }); }; await search("gladiatr"); expect(document.querySelectorAll("[role=option]")).toHaveLength(1); expect(option("Gladiator")).toBeDefined(); await act(async () => { input.focus(); input.dispatchEvent(new KeyboardEvent("keydown", { key: "ArrowDown", bubbles: true })); }); await act(async () => { input.dispatchEvent(new KeyboardEvent("keydown", { key: "Enter", bubbles: true })); }); expect(trigger.textContent).toContain("Gladiator"); await search(""); await click(option("Wanderer")); expect(trigger.textContent).toContain("Gladiator + Wanderer"); expect(option("Emblem").getAttribute("aria-disabled")).toBe("true"); await click(option("Gladiator")); expect(trigger.textContent).toContain("Wanderer"); expect(trigger.textContent).not.toContain("Gladiator"); expect(option("Emblem").getAttribute("aria-disabled")).not.toBe("true"); await click(trigger); await click(trigger); expect(trigger.textContent).toContain("Wanderer"); await click(document.querySelector("[data-slot=combobox-clear]")!); expect(trigger.textContent).toContain("Artifact sets"); } finally { await act(async () => { root.unmount(); }); container.remove(); vi.unstubAllGlobals(); } });