Files
flynn/src/cli/setup/providers.test.ts
T
2026-02-17 15:50:30 -08:00

91 lines
3.3 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import type { Interface as ReadlineInterface } from 'readline/promises';
import { createPrompter } from './prompts.js';
import { ConfigBuilder } from './config.js';
import { setupProviders } from './providers.js';
function mockReadline(inputs: string[]) {
let questionIdx = 0;
return {
async question(_query: string) {
const answer = inputs[questionIdx++];
return answer ?? '';
},
close() {
// no-op
},
[Symbol.asyncIterator]() {
return this;
},
async next() {
return { done: true };
},
} as unknown as ReadlineInterface;
}
describe('setupProviders', () => {
it('configures anthropic as default provider', async () => {
const rl = mockReadline(['1', 'sk-ant-test123', '', 'n']);
const p = createPrompter(rl);
const builder = new ConfigBuilder();
await setupProviders(p, builder);
const config = builder.build();
expect(config.models.default.provider).toBe('anthropic');
expect(config.models.default.api_key).toBe('sk-ant-test123');
expect(config.models.default.model).toBe('claude-sonnet-4-6-20260217');
});
it('configures ollama as default provider', async () => {
const rl = mockReadline(['3', '', '', 'n']);
const p = createPrompter(rl);
const builder = new ConfigBuilder();
await setupProviders(p, builder);
const config = builder.build();
expect(config.models.default.provider).toBe('ollama');
expect(config.models.default.endpoint).toBe('http://localhost:11434');
});
it('configures anthropic with fast tier', async () => {
const rl = mockReadline(['1', 'sk-ant-test123', '', 'y', '']);
const p = createPrompter(rl);
const builder = new ConfigBuilder();
await setupProviders(p, builder);
const config = builder.build();
expect(config.models.default.provider).toBe('anthropic');
expect(config.models.fast).toBeDefined();
expect(config.models.fast.provider).toBe('anthropic');
});
it('configures vercel gateway as default provider (second tier)', async () => {
// Pick "More providers..." then pick "Vercel AI Gateway".
// Prompts: api key, endpoint, model, then confirm fast tier.
const rl = mockReadline(['4', '3', 'sk-vercel-test123', '', '', 'n']);
const p = createPrompter(rl);
const builder = new ConfigBuilder();
await setupProviders(p, builder);
const config = builder.build();
expect(config.models.default.provider).toBe('vercel');
expect(config.models.default.api_key).toBe('sk-vercel-test123');
expect(config.models.default.endpoint).toBe('https://ai-gateway.vercel.sh/v1');
expect(config.models.default.model).toBe('openai/gpt-4.1');
});
it('configures minimax as default provider (second tier)', async () => {
// Pick "More providers..." then pick "MiniMax".
// Prompts: api key, endpoint, model, then confirm fast tier.
const rl = mockReadline(['4', '6', 'sk-minimax-test123', '', '', 'n']);
const p = createPrompter(rl);
const builder = new ConfigBuilder();
await setupProviders(p, builder);
const config = builder.build();
expect(config.models.default.provider).toBe('minimax');
expect(config.models.default.api_key).toBe('sk-minimax-test123');
expect(config.models.default.endpoint).toBe('https://api.minimax.io/v1');
expect(config.models.default.model).toBe('MiniMax-M1');
});
});