Spaces:
Paused
Paused
| import { describe, expect, it } from "vitest"; | |
| import type { AuthProfileStore } from "../agents/auth-profiles.js"; | |
| import { | |
| buildAuthChoiceGroups, | |
| buildAuthChoiceOptions, | |
| formatAuthChoiceChoicesForCli, | |
| } from "./auth-choice-options.js"; | |
| describe("buildAuthChoiceOptions", () => { | |
| it("includes GitHub Copilot", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.find((opt) => opt.value === "github-copilot")).toBeDefined(); | |
| }); | |
| it("includes setup-token option for Anthropic", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "token")).toBe(true); | |
| }); | |
| it("includes Z.AI (GLM) auth choice", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "zai-api-key")).toBe(true); | |
| }); | |
| it("includes Xiaomi auth choice", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "xiaomi-api-key")).toBe(true); | |
| }); | |
| it("includes MiniMax auth choice", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "minimax-api")).toBe(true); | |
| expect(options.some((opt) => opt.value === "minimax-api-lightning")).toBe(true); | |
| }); | |
| it("includes Moonshot auth choice", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "moonshot-api-key")).toBe(true); | |
| expect(options.some((opt) => opt.value === "moonshot-api-key-cn")).toBe(true); | |
| expect(options.some((opt) => opt.value === "kimi-code-api-key")).toBe(true); | |
| expect(options.some((opt) => opt.value === "together-api-key")).toBe(true); | |
| }); | |
| it("includes Vercel AI Gateway auth choice", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "ai-gateway-api-key")).toBe(true); | |
| }); | |
| it("includes Cloudflare AI Gateway auth choice", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "cloudflare-ai-gateway-api-key")).toBe(true); | |
| }); | |
| it("includes Together AI auth choice", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "together-api-key")).toBe(true); | |
| }); | |
| it("includes Synthetic auth choice", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "synthetic-api-key")).toBe(true); | |
| }); | |
| it("includes Chutes OAuth auth choice", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "chutes")).toBe(true); | |
| }); | |
| it("includes Qwen auth choice", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "qwen-portal")).toBe(true); | |
| }); | |
| it("includes xAI auth choice", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "xai-api-key")).toBe(true); | |
| }); | |
| it("includes vLLM auth choice", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| expect(options.some((opt) => opt.value === "vllm")).toBe(true); | |
| }); | |
| it("builds cli help choices from the same catalog", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const options = buildAuthChoiceOptions({ | |
| store, | |
| includeSkip: true, | |
| }); | |
| const cliChoices = formatAuthChoiceChoicesForCli({ | |
| includeLegacyAliases: false, | |
| includeSkip: true, | |
| }).split("|"); | |
| for (const option of options) { | |
| expect(cliChoices).toContain(option.value); | |
| } | |
| }); | |
| it("can include legacy aliases in cli help choices", () => { | |
| const cliChoices = formatAuthChoiceChoicesForCli({ | |
| includeLegacyAliases: true, | |
| includeSkip: true, | |
| }).split("|"); | |
| expect(cliChoices).toContain("setup-token"); | |
| expect(cliChoices).toContain("oauth"); | |
| expect(cliChoices).toContain("claude-cli"); | |
| expect(cliChoices).toContain("codex-cli"); | |
| }); | |
| it("shows Chutes in grouped provider selection", () => { | |
| const store: AuthProfileStore = { version: 1, profiles: {} }; | |
| const { groups } = buildAuthChoiceGroups({ | |
| store, | |
| includeSkip: false, | |
| }); | |
| const chutesGroup = groups.find((group) => group.value === "chutes"); | |
| expect(chutesGroup).toBeDefined(); | |
| expect(chutesGroup?.options.some((opt) => opt.value === "chutes")).toBe(true); | |
| }); | |
| }); | |