import { describe, it, expect } from '@jest/globals';
import { resolvePreset } from '../src/providers/cli/presets';
import { CLIProviderConfig } from '../src/config/types';
describe('resolvePreset', () => {
it('should resolve claude preset with correct defaults', () => {
const config: CLIProviderConfig = {
type: 'cli',
cli_type: 'claude',
nickname: 'Claude',
};
const resolved = resolvePreset(config);
expect(resolved.cli_command).toBe('claude');
expect(resolved.prompt_delivery).toBe('flag');
expect(resolved.prompt_flag).toBe('-p');
expect(resolved.output_format).toBe('json');
expect(resolved.cli_args).toEqual(['--output-format', 'json', '--max-turns', '3']);
expect(resolved.process_timeout).toBe(300000);
expect(resolved.nickname).toBe('Claude');
});
it('should resolve codex preset with correct defaults', () => {
const config: CLIProviderConfig = {
type: 'cli',
cli_type: 'codex',
nickname: 'Codex',
};
const resolved = resolvePreset(config);
expect(resolved.cli_command).toBe('codex');
expect(resolved.prompt_delivery).toBe('positional');
expect(resolved.output_format).toBe('jsonl');
expect(resolved.cli_args).toContain('exec');
expect(resolved.cli_args).toContain('--json');
});
it('should resolve gemini preset with correct defaults', () => {
const config: CLIProviderConfig = {
type: 'cli',
cli_type: 'gemini',
nickname: 'Gemini',
};
const resolved = resolvePreset(config);
expect(resolved.cli_command).toBe('gemini');
expect(resolved.prompt_delivery).toBe('flag');
expect(resolved.prompt_flag).toBe('-p');
expect(resolved.output_format).toBe('json');
expect(resolved.cli_args).toContain('--yolo');
});
it('should resolve grok preset with correct defaults', () => {
const config: CLIProviderConfig = {
type: 'cli',
cli_type: 'grok',
nickname: 'Grok',
};
const resolved = resolvePreset(config);
expect(resolved.cli_command).toBe('grok');
expect(resolved.prompt_delivery).toBe('flag');
expect(resolved.prompt_flag).toBe('-p');
expect(resolved.output_format).toBe('text');
expect(resolved.process_timeout).toBe(120000);
});
it('should resolve aider preset with correct defaults', () => {
const config: CLIProviderConfig = {
type: 'cli',
cli_type: 'aider',
nickname: 'Aider',
};
const resolved = resolvePreset(config);
expect(resolved.cli_command).toBe('aider');
expect(resolved.prompt_delivery).toBe('flag');
expect(resolved.prompt_flag).toBe('--message');
expect(resolved.output_format).toBe('text');
expect(resolved.cli_args).toContain('--yes');
});
it('should allow user overrides to take precedence over preset defaults', () => {
const config: CLIProviderConfig = {
type: 'cli',
cli_type: 'claude',
nickname: 'My Claude',
cli_command: '/custom/path/claude',
prompt_delivery: 'stdin',
output_format: 'text',
cli_args: ['--custom-flag'],
process_timeout: 60000,
};
const resolved = resolvePreset(config);
expect(resolved.cli_command).toBe('/custom/path/claude');
expect(resolved.prompt_delivery).toBe('stdin');
expect(resolved.output_format).toBe('text');
expect(resolved.cli_args).toEqual(['--custom-flag']);
expect(resolved.process_timeout).toBe(60000);
});
it('should require cli_command for custom type', () => {
const config: CLIProviderConfig = {
type: 'cli',
cli_type: 'custom',
nickname: 'Custom Tool',
};
expect(() => resolvePreset(config)).toThrow('cli_command is required for custom CLI providers');
});
it('should resolve custom type with all fields', () => {
const config: CLIProviderConfig = {
type: 'cli',
cli_type: 'custom',
cli_command: '/usr/bin/mytool',
prompt_delivery: 'positional',
output_format: 'json',
response_json_path: '$.answer',
nickname: 'My Tool',
default_model: 'v1',
working_directory: '/tmp',
env_vars: { MY_VAR: 'value' },
};
const resolved = resolvePreset(config);
expect(resolved.cli_command).toBe('/usr/bin/mytool');
expect(resolved.prompt_delivery).toBe('positional');
expect(resolved.output_format).toBe('json');
expect(resolved.response_json_path).toBe('$.answer');
expect(resolved.working_directory).toBe('/tmp');
expect(resolved.env_vars).toEqual({ MY_VAR: 'value' });
});
it('should pass through optional fields from config', () => {
const config: CLIProviderConfig = {
type: 'cli',
cli_type: 'claude',
nickname: 'Claude',
default_model: 'claude-opus-4-5-20251101',
models: ['claude-opus-4-5-20251101', 'claude-sonnet-4-20250514'],
system_prompt: 'You are helpful.',
};
const resolved = resolvePreset(config);
expect(resolved.default_model).toBe('claude-opus-4-5-20251101');
expect(resolved.models).toEqual(['claude-opus-4-5-20251101', 'claude-sonnet-4-20250514']);
expect(resolved.system_prompt).toBe('You are helpful.');
});
it('should throw for unknown CLI preset', () => {
const config: CLIProviderConfig = {
type: 'cli',
cli_type: 'unknown-preset' as 'claude', // Type cast to bypass TS check
nickname: 'Unknown',
};
expect(() => resolvePreset(config)).toThrow('Unknown CLI preset: unknown-preset');
});
});