193 lines
5.9 KiB
TypeScript
193 lines
5.9 KiB
TypeScript
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-key-cn")).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);
|
|
});
|
|
});
|