Files
opencode/packages/tui/test/mini/form.shared.test.ts
Simon Klee 925c2423de mini: add reconnect, forms, and shared targets (#37811)
Centralize session target resolution for mini and noninteractive
run paths. Recover from transport drops, replace questions with
forms, and keep tool/catalog state location-scoped with live
progress and theme discovery.
2026-07-19 22:45:10 +02:00

67 lines
2.5 KiB
TypeScript

import { describe, expect, test } from "bun:test"
import type { FormField, FormInfo } from "@opencode-ai/client/promise"
import {
createFormBodyState,
formAcknowledge,
formAnswer,
formCommitInput,
formPick,
formReply,
formSetExternalReady,
formSetField,
formSetSelected,
formUnsupported,
formValidate,
} from "../../src/mini/form.shared"
function request(fields: FormField[]): FormInfo {
return { id: "frm_1", sessionID: "ses_1", title: "Input", fields: fields as FormInfo["fields"] }
}
describe("Mini form state", () => {
test("builds every supported answer and preserves owner location", () => {
const form = request([
{ key: "choice", type: "string", options: [{ value: "fast", label: "Fast" }], default: "fast" },
{ key: "count", type: "number" },
{ key: "whole", type: "integer", default: 2 },
{ key: "enabled", type: "boolean", default: false },
{ key: "tags", type: "multiselect", options: [], custom: true },
{ key: "external", type: "external", url: "https://example.com/action" },
])
let state = formSetField(createFormBodyState(form), form, 1)
state = formCommitInput(state, form, "1.5")
state = formSetField(state, form, 4)
state = formSetSelected(state, 0)
state = formPick(state, form)
state = formCommitInput(state, form, "custom")
state = formSetField(state, form, 5)
state = formAcknowledge(formSetExternalReady(state, "external"), form)
const answer = { choice: "fast", count: 1.5, whole: 2, enabled: false, tags: ["custom"], external: true }
expect(formAnswer(form, state)).toEqual(answer)
expect(formReply({ ...form, location: { directory: "/tmp", workspaceID: "wrk_1" } }, state)).toEqual({
sessionID: "ses_1",
formID: "frm_1",
answer,
location: { directory: "/tmp", workspaceID: "wrk_1" },
})
})
test("rejects invalid and deliberately unsupported shapes", () => {
const invalid = request([
{ key: "required", type: "string", required: true },
{ key: "external", type: "external", url: "https://example.com" },
])
expect(formValidate(invalid, createFormBodyState(invalid))).toContain("Answer required")
expect(formUnsupported(request([{ key: "value", type: "string", pattern: "^a" }]))).toContain("Pattern")
expect(
formUnsupported(
request([
{ key: "toggle", type: "boolean" },
{ key: "value", type: "string", when: [{ key: "toggle", op: "eq", value: true }] },
]),
),
).toContain("Conditional")
})
})