mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-23 02:36:57 -04:00
925c2423de
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.
67 lines
2.5 KiB
TypeScript
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")
|
|
})
|
|
})
|