import { assertEquals, assertStringIncludes } from "@std/assert"; import type { JsonValue } from "@berry/api"; import type { ConfigurationContext } from "@berry/api/web.ts"; import { fill, withDom } from "@berry/util/dom.ts"; import renderers from "./web.tsx"; const openrouter = { provider: "openrouter", modelId: "lab/model" }; function harness(patch: Partial = {}) { const view = renderers.configuration!(); document.body.append(view.element); const saves: Record[] = []; let context: ConfigurationContext = { tid: "3mxd6epszps5d", extension: "openrouter-routing", model: openrouter, schema: { properties: {} }, values: { sort: "default", maxCompletionPrice: "1" }, saveStatus: "idle", error: null, save(patch) { saves.push(patch); return Promise.resolve(); }, renderDefault: () => { throw new Error("The routing form is its own."); }, ...patch, }; const update = (patch: Partial) => view.update(context = { ...context, ...patch }); update({}); const control = (label: string) => [...view.element.querySelectorAll("label")] .find((element) => element.textContent?.includes(label))! .querySelector("input, select")!; return { view, saves, update, control }; } Deno.test("routing stages typed values and keeps a refused edit to fix", () => withDom(() => { const { saves, update, control } = harness(); const price = control("Max output"); assertEquals(price.value, "1"); price.focus(); fill(price, "-0.5"); assertEquals(saves, [{ maxCompletionPrice: "-0.5" }]); price.blur(); update({ error: "Output price must be a nonnegative decimal in $/M tokens.", }); assertEquals(price.value, "-0.5"); assertStringIncludes(document.body.textContent!, "Output price must be"); update({ values: { sort: "price", maxCompletionPrice: "1" } }); assertEquals(control("Sort").value, "price"); assertEquals(price.value, "-0.5"); })); Deno.test("a new conversation's draft takes each keystroke", () => withDom(() => { const { saves, control } = harness({ tid: null }); fill(control("Allowed"), "baseten/fast"); assertEquals(saves, [{ only: "baseten/fast" }]); })); Deno.test("routing configuration events are hidden without suppressing unrelated events", () => { assertEquals(renderers.event!({ type: "configured", values: { sort: "price" } }), null); assertEquals(renderers.event!({ type: "other" }), undefined); });