import { describe, it, expect } from 'vitest'; import { specToXml, getStructuredSpecPromptInstruction, getAppSpecFormatInstruction, APP_SPEC_XML_FORMAT, type SpecOutput, } from '@/lib/app-spec-format.js'; describe('app-spec-format.ts', () => { describe('specToXml', () => { it('should convert minimal spec to XML', () => { const spec: SpecOutput = { project_name: 'Test Project', overview: 'A test project', technology_stack: ['TypeScript', 'Node.js'], core_capabilities: ['Testing', 'Development'], implemented_features: [{ name: 'Feature 1', description: 'First feature' }], }; const xml = specToXml(spec); expect(xml).toContain(''); expect(xml).toContain(''); expect(xml).toContain(''); expect(xml).toContain('Test Project'); expect(xml).toContain('TypeScript'); expect(xml).toContain('Testing'); }); it('should escape XML special characters', () => { const spec: SpecOutput = { project_name: 'Test & Project', overview: 'Description with ', technology_stack: ['TypeScript'], core_capabilities: ['Cap'], implemented_features: [], }; const xml = specToXml(spec); expect(xml).toContain('Test & Project'); expect(xml).toContain('<tags>'); }); it('should include file_locations when provided', () => { const spec: SpecOutput = { project_name: 'Test', overview: 'Test', technology_stack: ['TS'], core_capabilities: ['Cap'], implemented_features: [ { name: 'Feature', description: 'Desc', file_locations: ['src/index.ts'], }, ], }; const xml = specToXml(spec); expect(xml).toContain(''); expect(xml).toContain('src/index.ts'); }); it('should not include file_locations when empty', () => { const spec: SpecOutput = { project_name: 'Test', overview: 'Test', technology_stack: ['TS'], core_capabilities: ['Cap'], implemented_features: [{ name: 'Feature', description: 'Desc', file_locations: [] }], }; const xml = specToXml(spec); expect(xml).not.toContain(''); }); it('should include additional_requirements when provided', () => { const spec: SpecOutput = { project_name: 'Test', overview: 'Test', technology_stack: ['TS'], core_capabilities: ['Cap'], implemented_features: [], additional_requirements: ['Node.js 18+'], }; const xml = specToXml(spec); expect(xml).toContain(''); expect(xml).toContain('Node.js 18+'); }); it('should include development_guidelines when provided', () => { const spec: SpecOutput = { project_name: 'Test', overview: 'Test', technology_stack: ['TS'], core_capabilities: ['Cap'], implemented_features: [], development_guidelines: ['Use ESLint'], }; const xml = specToXml(spec); expect(xml).toContain(''); expect(xml).toContain('Use ESLint'); }); it('should include implementation_roadmap when provided', () => { const spec: SpecOutput = { project_name: 'Test', overview: 'Test', technology_stack: ['TS'], core_capabilities: ['Cap'], implemented_features: [], implementation_roadmap: [{ phase: 'Phase 1', status: 'completed', description: 'Setup' }], }; const xml = specToXml(spec); expect(xml).toContain(''); expect(xml).toContain('completed'); }); it('should not include optional sections when empty', () => { const spec: SpecOutput = { project_name: 'Test', overview: 'Test', technology_stack: ['TS'], core_capabilities: ['Cap'], implemented_features: [], additional_requirements: [], development_guidelines: [], implementation_roadmap: [], }; const xml = specToXml(spec); expect(xml).not.toContain(''); expect(xml).not.toContain(''); expect(xml).not.toContain(''); }); }); describe('getStructuredSpecPromptInstruction', () => { it('should return non-empty prompt instruction', () => { const instruction = getStructuredSpecPromptInstruction(); expect(instruction).toBeTruthy(); expect(instruction.length).toBeGreaterThan(100); }); it('should mention required fields', () => { const instruction = getStructuredSpecPromptInstruction(); expect(instruction).toContain('project_name'); expect(instruction).toContain('overview'); expect(instruction).toContain('technology_stack'); }); }); describe('getAppSpecFormatInstruction', () => { it('should return non-empty format instruction', () => { const instruction = getAppSpecFormatInstruction(); expect(instruction).toBeTruthy(); expect(instruction.length).toBeGreaterThan(100); }); it('should include critical formatting requirements', () => { const instruction = getAppSpecFormatInstruction(); expect(instruction).toContain('CRITICAL FORMATTING REQUIREMENTS'); }); }); describe('APP_SPEC_XML_FORMAT', () => { it('should contain valid XML template structure', () => { expect(APP_SPEC_XML_FORMAT).toContain(''); expect(APP_SPEC_XML_FORMAT).toContain(''); }); }); });