106 lines
3.2 KiB
TypeScript
106 lines
3.2 KiB
TypeScript
import { parseSpec } from '../src/utils/spec-parser.js';
|
|
|
|
describe('Spec Parser', () => {
|
|
describe('JSON parsing', () => {
|
|
it('should parse valid JSON spec', () => {
|
|
const content = JSON.stringify({
|
|
name: 'test-cli',
|
|
version: '1.0.0',
|
|
description: 'A test CLI',
|
|
commands: [{ name: 'test', description: 'Test command' }],
|
|
});
|
|
|
|
const result = parseSpec({ content, format: 'json' });
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.spec).toBeDefined();
|
|
expect(result.spec?.name).toBe('test-cli');
|
|
expect(result.spec?.version).toBe('1.0.0');
|
|
});
|
|
|
|
it('should detect JSON format automatically', () => {
|
|
const content = '{"name": "test", "version": "1.0.0", "description": "test", "commands": [{"name": "cmd", "description": "a command"}]}';
|
|
const result = parseSpec({ content, format: 'auto' });
|
|
|
|
expect(result.success).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('YAML parsing', () => {
|
|
it('should parse valid YAML spec', () => {
|
|
const content = `
|
|
name: test-cli
|
|
version: 1.0.0
|
|
description: A test CLI
|
|
commands:
|
|
- name: test
|
|
description: Test command
|
|
`;
|
|
|
|
const result = parseSpec({ content, format: 'yaml' });
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.spec).toBeDefined();
|
|
expect(result.spec?.name).toBe('test-cli');
|
|
});
|
|
|
|
it('should detect YAML format automatically', () => {
|
|
const content = 'name: test\nversion: 1.0.0\ndescription: test\ncommands:\n - name: cmd\n description: a command';
|
|
const result = parseSpec({ content, format: 'auto' });
|
|
|
|
expect(result.success).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('Error handling', () => {
|
|
it('should fail on invalid JSON', () => {
|
|
const content = '{invalid json}';
|
|
const result = parseSpec({ content, format: 'json' });
|
|
|
|
expect(result.success).toBe(false);
|
|
expect(result.errors).toBeDefined();
|
|
expect(result.errors?.length).toBeGreaterThan(0);
|
|
});
|
|
|
|
it('should fail on missing required fields', () => {
|
|
const content = JSON.stringify({
|
|
name: 'test',
|
|
commands: [],
|
|
});
|
|
|
|
const result = parseSpec({ content, format: 'json' });
|
|
|
|
expect(result.success).toBe(false);
|
|
expect(result.errors?.some((e) => e.includes('version'))).toBe(true);
|
|
});
|
|
|
|
it('should fail on empty commands array', () => {
|
|
const content = JSON.stringify({
|
|
name: 'test',
|
|
version: '1.0.0',
|
|
description: 'test',
|
|
commands: [],
|
|
});
|
|
|
|
const result = parseSpec({ content, format: 'json' });
|
|
|
|
expect(result.success).toBe(false);
|
|
expect(result.errors?.some((e) => e.includes('command'))).toBe(true);
|
|
});
|
|
|
|
it('should fail when file does not exist', () => {
|
|
const result = parseSpec({ filePath: '/nonexistent/path/spec.yaml' });
|
|
|
|
expect(result.success).toBe(false);
|
|
expect(result.errors?.some((e) => e.includes('not found'))).toBe(true);
|
|
});
|
|
|
|
it('should fail when no content or file path provided', () => {
|
|
const result = parseSpec({});
|
|
|
|
expect(result.success).toBe(false);
|
|
expect(result.errors?.some((e) => e.includes('filePath or content'))).toBe(true);
|
|
});
|
|
});
|
|
});
|