import { assertEquals, assertStringIncludes } from "@std/assert"; import { press, withDom } from "@berry/util/dom.ts"; import type { JsonValue } from "@berry/api"; import type { HeaderContext, HeaderView } from "@berry/api/web.ts"; import { builtRenderers } from "./fixture.ts"; Deno.test("subscription headers open only on press, reject stale replies, and dismiss on Escape or focus-out", async () => { await withDom(async (window) => { let view: HeaderView | undefined; const settle = async () => { for (let i = 0; i < 5; i++) await Promise.resolve(); }; try { view = (await builtRenderers("subscription")).header!(); const element = view.element as HTMLElement; document.body.append(element); const button = element.querySelector("button")!; const requests: string[] = []; const old = Promise.withResolvers(); const context: HeaderContext = { tid: "test", model: { provider: "anthropic", modelId: "claude" }, command: () => Promise.reject(new Error("the widget asks its own handler")), connect: () => { throw new Error("the widget opens no channels"); }, request(name, args) { assertEquals(name, "usage"); const { provider } = args as { provider: string }; requests.push(provider); if (provider === "anthropic") return old.promise as Promise; return Promise.resolve({ status: "ok", fetchedAt: "2026-04-01T12:00:00Z", windows: [{ label: "5 hours", usedPercent: 25, resetsAt: "2026-04-02T12:00:00Z" }], }); }, }; view.update({ ...context, model: { provider: "other", modelId: "other" } }); assertEquals(element.hidden, true); assertEquals(requests, []); view.update(context); assertEquals(element.hidden, false); assertEquals(requests, []); const panel = element.querySelector('[role="region"]')!; element.dispatchEvent(new window.Event("mouseenter") as unknown as Event); button.dispatchEvent(new window.FocusEvent("focusin", { bubbles: true }) as unknown as Event); assertEquals(requests, []); assertEquals(button.getAttribute("aria-expanded"), "false"); assertEquals(panel.hidden, true); button.click(); assertEquals(requests, ["anthropic"]); assertEquals(button.getAttribute("aria-expanded"), "true"); assertEquals(panel.hidden, false); view.update({ ...context, model: { provider: "openai-codex", modelId: "codex" } }); assertEquals(panel.hidden, true); button.click(); await settle(); assertEquals(requests, ["anthropic", "openai-codex"]); assertStringIncludes(element.textContent!, "25% used"); old.resolve({ status: "error", message: "Old Claude reply" }); await settle(); assertEquals(element.textContent!.includes("Old Claude reply"), false); element.dispatchEvent(new window.Event("mouseleave") as unknown as Event); assertEquals(button.getAttribute("aria-expanded"), "true"); button.click(); assertEquals(button.getAttribute("aria-expanded"), "false"); assertEquals(panel.hidden, true); button.click(); assertEquals(button.getAttribute("aria-expanded"), "true"); assertEquals(requests.length, 2); press(element, "Escape"); assertEquals(button.getAttribute("aria-expanded"), "false"); assertEquals(panel.hidden, true); button.click(); button.dispatchEvent( new window.FocusEvent("focusout", { bubbles: true, relatedTarget: window.document.body, }) as unknown as Event, ); assertEquals(button.getAttribute("aria-expanded"), "false"); assertEquals(panel.hidden, true); view.update({ ...context, model: { provider: "opencode-go", modelId: "kimi" } }); assertEquals(element.hidden, false); assertStringIncludes(button.getAttribute("aria-label")!, "OpenCode Go"); assertEquals(panel.hidden, true); button.click(); await settle(); assertEquals(requests, ["anthropic", "openai-codex", "opencode-go"]); assertStringIncludes(panel.textContent!, "OpenCode Go"); assertStringIncludes(panel.textContent!, "25% used"); view.dispose?.(); view = undefined; button.click(); assertEquals(requests.length, 3); } finally { view?.dispose?.(); } }); });