mirror of
https://github.com/anomalyco/opencode.git
synced 2026-09-29 05:53:24 +08:00
106 lines
4.0 KiB
TypeScript
106 lines
4.0 KiB
TypeScript
import { expect, test } from "bun:test"
|
|
import { Effect } from "effect"
|
|
import type { FormFields } from "@opencode/client"
|
|
import { answerForm } from "../src/commands/handlers/auth/form"
|
|
|
|
test("resolves hidden defaults without an interactive terminal", async () => {
|
|
const fields = [
|
|
{ type: "string", key: "server", hidden: true, default: "https://example.com/console" },
|
|
{ type: "boolean", key: "enabled", hidden: true, default: false },
|
|
{ type: "integer", key: "count", hidden: true, default: 0 },
|
|
{ type: "string", key: "optional", hidden: true },
|
|
] satisfies FormFields
|
|
expect(await Effect.runPromise(answerForm(fields))).toEqual({
|
|
server: "https://example.com/console",
|
|
enabled: false,
|
|
count: 0,
|
|
})
|
|
expect(await Effect.runPromise(answerForm(fields, ["server=https://staging.example.com/console"]))).toEqual({
|
|
server: "https://staging.example.com/console",
|
|
enabled: false,
|
|
count: 0,
|
|
})
|
|
})
|
|
|
|
test("parses typed answers and evaluates conditions in form order", async () => {
|
|
const fields = [
|
|
{ type: "string", key: "deployment", options: [{ value: "enterprise", label: "Enterprise" }] },
|
|
{ type: "string", key: "host", when: [{ key: "deployment", op: "eq", value: "enterprise" }] },
|
|
{ type: "boolean", key: "enabled" },
|
|
{ type: "integer", key: "count", minimum: 0 },
|
|
{ type: "number", key: "rate" },
|
|
{ type: "multiselect", key: "scopes", options: [{ value: "read", label: "Read" }] },
|
|
] satisfies FormFields
|
|
expect(
|
|
await Effect.runPromise(
|
|
answerForm(fields, [
|
|
"host=example.com",
|
|
"deployment=enterprise",
|
|
"enabled=false",
|
|
"count=0",
|
|
"rate=1.5",
|
|
'scopes=["read"]',
|
|
]),
|
|
),
|
|
).toEqual({ deployment: "enterprise", host: "example.com", enabled: false, count: 0, rate: 1.5, scopes: ["read"] })
|
|
})
|
|
|
|
test("preserves empty strings and equals signs in supplied text", async () => {
|
|
expect(
|
|
await Effect.runPromise(
|
|
answerForm(
|
|
[
|
|
{ type: "string", key: "server" },
|
|
{ type: "string", key: "optional" },
|
|
],
|
|
["server=https://example.com/console?tenant=a=b", "optional="],
|
|
),
|
|
),
|
|
).toEqual({ server: "https://example.com/console?tenant=a=b", optional: "" })
|
|
})
|
|
|
|
const invalidAnswers: { fields: FormFields | undefined; supplied: string[]; error: string }[] = [
|
|
{ fields: undefined, supplied: ["missing-separator"], error: "Expected --answer key=value" },
|
|
{ fields: undefined, supplied: ["=missing-key"], error: "Expected --answer key=value" },
|
|
{ fields: undefined, supplied: ["unknown=value"], error: "Unknown form field: unknown" },
|
|
{
|
|
fields: [{ type: "string", key: "known" }],
|
|
supplied: ["unknown=value"],
|
|
error: "Unknown form field: unknown",
|
|
},
|
|
{
|
|
fields: [
|
|
{ type: "boolean", key: "enabled", hidden: true, default: false },
|
|
{ type: "string", key: "host", when: [{ key: "enabled", op: "eq", value: true }] },
|
|
],
|
|
supplied: ["host=example.com"],
|
|
error: "Form field is not active: host",
|
|
},
|
|
{ fields: [{ type: "integer", key: "count" }], supplied: ["count=1.5"], error: "Expected an integer" },
|
|
{ fields: [{ type: "boolean", key: "enabled" }], supplied: ["enabled=yes"], error: "Expected a JSON value" },
|
|
{
|
|
fields: [{ type: "string", key: "server", format: "uri", hidden: true }],
|
|
supplied: ["server=not a URL"],
|
|
error: "Expected a URL",
|
|
},
|
|
{
|
|
fields: [{ type: "string", key: "required", hidden: true, required: true }],
|
|
supplied: [],
|
|
error: "Answer required",
|
|
},
|
|
{
|
|
fields: [{ type: "multiselect", key: "scopes", options: [{ value: "read", label: "Read" }] }],
|
|
supplied: ['scopes=["write"]'],
|
|
error: "Select only available options",
|
|
},
|
|
{
|
|
fields: [{ type: "external", key: "approve", url: "https://example.com" }],
|
|
supplied: ["approve=true"],
|
|
error: "requires interactive confirmation",
|
|
},
|
|
]
|
|
|
|
test.each(invalidAnswers)("rejects invalid form answers: $error", async (input) => {
|
|
await expect(Effect.runPromise(answerForm(input.fields, input.supplied))).rejects.toThrow(input.error)
|
|
})
|