import { act, type ReactElement } from "react"; import { createRoot, type Root } from "react-dom/client"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { Text } from "react-native"; import { QueueItemRemove } from "./QueueItemRemove"; import { QueueItemSteer } from "./QueueItemSteer"; import { QueueItemText } from "./QueueItemText"; const h = vi.hoisted(() => ({ parts: [] as Array<{ type: "text" | "file"; text?: string }> | undefined, remove: vi.fn<() => void>(), steer: vi.fn<() => void>(), })); vi.mock("@assistant-ui/store", async (importOriginal) => { const actual = await importOriginal(); return { ...actual, useAui: () => ({ queueItem: { remove: h.remove, steer: h.steer } }), useAuiState: (selector: (state: { queueItem: typeof h }) => T) => selector({ queueItem: h }), }; }); (globalThis as Record).IS_REACT_ACT_ENVIRONMENT = true; describe("Queue item primitives", () => { let container: HTMLDivElement; let root: Root; beforeEach(() => { h.parts = []; h.remove.mockReset(); h.steer.mockReset(); container = document.createElement("div"); document.body.appendChild(container); root = createRoot(container); }); afterEach(async () => { await act(async () => { root.unmount(); }); container.remove(); }); const render = async (element: ReactElement) => { await act(async () => { root.render(element); }); }; const press = async (testID: string) => { const element = container.querySelector(`[data-testid="${testID}"]`); expect(element).not.toBeNull(); await act(async () => { element!.dispatchEvent( new MouseEvent("click", { bubbles: true, cancelable: true }), ); }); }; it("renders only text parts and supports child overrides", async () => { h.parts = [ { type: "text", text: "hello" }, { type: "file", text: "not rendered" }, { type: "text", text: "world" }, ]; await render(); expect(container.querySelector('[data-testid="text"]')?.textContent).toBe( "hello\n\nworld", ); await render( override , ); expect(container.querySelector('[data-testid="text"]')?.textContent).toBe( "override", ); }); it("removes a queue item when pressed", async () => { await render(remove); await press("remove"); expect(h.remove).toHaveBeenCalledTimes(1); }); it("steers a queue item when pressed", async () => { await render(steer); await press("steer"); expect(h.steer).toHaveBeenCalledTimes(1); }); it("renders nothing extra when queue item parts are missing", async () => { h.parts = undefined; await render(); expect(container.querySelector('[data-testid="text"]')?.textContent).toBe( "", ); }); it("passes the Pressable press state to function children", async () => { await render( {({ pressed }) => (pressed ? "pressed" : "idle")} , ); expect(container.querySelector('[data-testid="remove"]')?.textContent).toBe( "idle", ); await render( {({ pressed }) => (pressed ? "pressed" : "idle")} , ); expect(container.querySelector('[data-testid="remove"]')?.textContent).toBe( "pressed", ); await render( {({ pressed }) => (pressed ? "pressed" : "idle")} , ); expect(container.querySelector('[data-testid="steer"]')?.textContent).toBe( "pressed", ); }); });