91 lines
3.3 KiB
TypeScript
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');
|
|
});
|
|
});
|