///
import { describe, expect, test } from "bun:test"
import { argsToConfig, formatConfigSummary, validateNonTuiArgs } from "./install-validators"
import type { InstallArgs } from "./types"
function createArgs(overrides: Partial = {}): InstallArgs {
return {
tui: false,
claude: "no",
openai: "no",
gemini: "no",
copilot: "no",
opencodeZen: "no",
zaiCodingPlan: "no",
kimiForCoding: "no",
opencodeGo: "no",
vercelAiGateway: "no",
skipAuth: false,
...overrides,
}
}
describe("argsToConfig", () => {
test("enables only OpenCode when platform is opencode", () => {
// #given
const args = createArgs({ platform: "opencode" })
// #when
const config = argsToConfig(args)
// #then
expect(config.platform).toBe("opencode")
expect(config.hasOpenCode).toBe(true)
expect(config.hasCodex).toBe(false)
})
test("enables only Codex when platform is codex", () => {
// #given
const args = createArgs({ platform: "codex" })
// #when
const config = argsToConfig(args)
// #then
expect(config.platform).toBe("codex")
expect(config.hasOpenCode).toBe(false)
expect(config.hasCodex).toBe(true)
})
test("enables both harnesses when platform is both", () => {
// #given
const args = createArgs({ platform: "both" })
// #when
const config = argsToConfig(args)
// #then
expect(config.platform).toBe("both")
expect(config.hasOpenCode).toBe(true)
expect(config.hasCodex).toBe(true)
})
test("defaults to OpenCode when platform is omitted", () => {
// #given
const args = createArgs()
// #when
const config = argsToConfig(args)
// #then
expect(config.platform).toBe("opencode")
expect(config.hasOpenCode).toBe(true)
expect(config.hasCodex).toBe(false)
})
})
describe("validateNonTuiArgs", () => {
test("rejects invalid --opencode-go values", () => {
// #given
const args = createArgs({ opencodeGo: "maybe" as InstallArgs["opencodeGo"] })
// #when
const result = validateNonTuiArgs(args)
// #then
expect(result.valid).toBe(false)
expect(result.errors).toContain("Invalid --opencode-go value: maybe (expected: no, yes)")
})
test("requires OpenCode provider flags when platform is opencode", () => {
// #given
const args = createArgs({ platform: "opencode", claude: undefined, gemini: undefined, copilot: undefined })
// #when
const result = validateNonTuiArgs(args)
// #then
expect(result.valid).toBe(false)
expect(result.errors).toContain("--claude is required (values: no, yes, max20)")
expect(result.errors).toContain("--gemini is required (values: no, yes)")
expect(result.errors).toContain("--copilot is required (values: no, yes)")
})
test("requires OpenCode provider flags when platform is both", () => {
// #given
const args = createArgs({ platform: "both", claude: undefined, gemini: undefined, copilot: undefined })
// #when
const result = validateNonTuiArgs(args)
// #then
expect(result.valid).toBe(false)
expect(result.errors).toContain("--claude is required (values: no, yes, max20)")
expect(result.errors).toContain("--gemini is required (values: no, yes)")
expect(result.errors).toContain("--copilot is required (values: no, yes)")
})
test("allows codex-only non-TUI installs without OpenCode provider flags", () => {
// #given
const args: InstallArgs = { tui: false, platform: "codex" }
// #when
const result = validateNonTuiArgs(args)
// #then
expect(result.valid).toBe(true)
expect(result.errors).toEqual([])
})
test("rejects OpenCode flags for codex-only non-TUI installs", () => {
// #given
const args = createArgs({ platform: "codex", claude: "yes" })
// #when
const result = validateNonTuiArgs(args)
// #then
expect(result.valid).toBe(false)
expect(result.errors).toContain("--claude cannot be used with --platform=codex")
})
})
describe("formatConfigSummary", () => {
test("shows platform instead of a separate Codex Harness provider line", () => {
// #given
const config = argsToConfig(createArgs({ platform: "both" }))
// #when
const summary = formatConfigSummary(config)
// #then
expect(summary).toContain("Platform: both")
expect(summary).not.toContain("Codex Harness")
})
})