import { describe, it, expect } from 'vitest'; import { getEnhancementPrompt, getSystemPrompt, getExamples, buildUserPrompt, isValidEnhancementMode, getAvailableEnhancementModes, IMPROVE_SYSTEM_PROMPT, TECHNICAL_SYSTEM_PROMPT, SIMPLIFY_SYSTEM_PROMPT, ACCEPTANCE_SYSTEM_PROMPT, IMPROVE_EXAMPLES, TECHNICAL_EXAMPLES, SIMPLIFY_EXAMPLES, ACCEPTANCE_EXAMPLES, } from '../src/enhancement.js'; describe('enhancement.ts', () => { describe('System Prompt Constants', () => { it('should export IMPROVE_SYSTEM_PROMPT', () => { expect(IMPROVE_SYSTEM_PROMPT).toBeDefined(); expect(typeof IMPROVE_SYSTEM_PROMPT).toBe('string'); expect(IMPROVE_SYSTEM_PROMPT).toContain('vague, unclear'); expect(IMPROVE_SYSTEM_PROMPT).toContain('actionable'); }); it('should export TECHNICAL_SYSTEM_PROMPT', () => { expect(TECHNICAL_SYSTEM_PROMPT).toBeDefined(); expect(typeof TECHNICAL_SYSTEM_PROMPT).toBe('string'); expect(TECHNICAL_SYSTEM_PROMPT).toContain('technical'); expect(TECHNICAL_SYSTEM_PROMPT).toContain('implementation'); }); it('should export SIMPLIFY_SYSTEM_PROMPT', () => { expect(SIMPLIFY_SYSTEM_PROMPT).toBeDefined(); expect(typeof SIMPLIFY_SYSTEM_PROMPT).toBe('string'); expect(SIMPLIFY_SYSTEM_PROMPT).toContain('verbose'); expect(SIMPLIFY_SYSTEM_PROMPT).toContain('concise'); }); it('should export ACCEPTANCE_SYSTEM_PROMPT', () => { expect(ACCEPTANCE_SYSTEM_PROMPT).toBeDefined(); expect(typeof ACCEPTANCE_SYSTEM_PROMPT).toBe('string'); expect(ACCEPTANCE_SYSTEM_PROMPT).toContain('acceptance criteria'); expect(ACCEPTANCE_SYSTEM_PROMPT).toContain('testable'); }); }); describe('Examples Constants', () => { it('should export IMPROVE_EXAMPLES with valid structure', () => { expect(IMPROVE_EXAMPLES).toBeDefined(); expect(Array.isArray(IMPROVE_EXAMPLES)).toBe(true); expect(IMPROVE_EXAMPLES.length).toBeGreaterThan(0); IMPROVE_EXAMPLES.forEach((example) => { expect(example).toHaveProperty('input'); expect(example).toHaveProperty('output'); expect(typeof example.input).toBe('string'); expect(typeof example.output).toBe('string'); }); }); it('should export TECHNICAL_EXAMPLES with valid structure', () => { expect(TECHNICAL_EXAMPLES).toBeDefined(); expect(Array.isArray(TECHNICAL_EXAMPLES)).toBe(true); expect(TECHNICAL_EXAMPLES.length).toBeGreaterThan(0); TECHNICAL_EXAMPLES.forEach((example) => { expect(example).toHaveProperty('input'); expect(example).toHaveProperty('output'); expect(typeof example.input).toBe('string'); expect(typeof example.output).toBe('string'); }); }); it('should export SIMPLIFY_EXAMPLES with valid structure', () => { expect(SIMPLIFY_EXAMPLES).toBeDefined(); expect(Array.isArray(SIMPLIFY_EXAMPLES)).toBe(true); expect(SIMPLIFY_EXAMPLES.length).toBeGreaterThan(0); SIMPLIFY_EXAMPLES.forEach((example) => { expect(example).toHaveProperty('input'); expect(example).toHaveProperty('output'); expect(typeof example.input).toBe('string'); expect(typeof example.output).toBe('string'); }); }); it('should export ACCEPTANCE_EXAMPLES with valid structure', () => { expect(ACCEPTANCE_EXAMPLES).toBeDefined(); expect(Array.isArray(ACCEPTANCE_EXAMPLES)).toBe(true); expect(ACCEPTANCE_EXAMPLES.length).toBeGreaterThan(0); ACCEPTANCE_EXAMPLES.forEach((example) => { expect(example).toHaveProperty('input'); expect(example).toHaveProperty('output'); expect(typeof example.input).toBe('string'); expect(typeof example.output).toBe('string'); }); }); it('should have shorter outputs in SIMPLIFY_EXAMPLES', () => { SIMPLIFY_EXAMPLES.forEach((example) => { // Simplify examples should have shorter output than input // (though not always strictly enforced, it's the general pattern) expect(example.output).toBeDefined(); expect(example.output.length).toBeGreaterThan(0); }); }); }); describe('getEnhancementPrompt', () => { it("should return prompt config for 'improve' mode", () => { const result = getEnhancementPrompt('improve'); expect(result).toHaveProperty('systemPrompt'); expect(result).toHaveProperty('description'); expect(result.systemPrompt).toBe(IMPROVE_SYSTEM_PROMPT); expect(result.description).toContain('vague'); expect(result.description).toContain('actionable'); }); it("should return prompt config for 'technical' mode", () => { const result = getEnhancementPrompt('technical'); expect(result).toHaveProperty('systemPrompt'); expect(result).toHaveProperty('description'); expect(result.systemPrompt).toBe(TECHNICAL_SYSTEM_PROMPT); expect(result.description).toContain('implementation'); }); it("should return prompt config for 'simplify' mode", () => { const result = getEnhancementPrompt('simplify'); expect(result).toHaveProperty('systemPrompt'); expect(result).toHaveProperty('description'); expect(result.systemPrompt).toBe(SIMPLIFY_SYSTEM_PROMPT); expect(result.description).toContain('verbose'); }); it("should return prompt config for 'acceptance' mode", () => { const result = getEnhancementPrompt('acceptance'); expect(result).toHaveProperty('systemPrompt'); expect(result).toHaveProperty('description'); expect(result.systemPrompt).toBe(ACCEPTANCE_SYSTEM_PROMPT); expect(result.description).toContain('acceptance'); }); it('should handle uppercase mode', () => { const result = getEnhancementPrompt('IMPROVE'); expect(result.systemPrompt).toBe(IMPROVE_SYSTEM_PROMPT); }); it('should handle mixed case mode', () => { const result = getEnhancementPrompt('TeChnIcaL'); expect(result.systemPrompt).toBe(TECHNICAL_SYSTEM_PROMPT); }); it("should fall back to 'improve' for invalid mode", () => { const result = getEnhancementPrompt('invalid-mode'); expect(result.systemPrompt).toBe(IMPROVE_SYSTEM_PROMPT); expect(result.description).toContain('vague'); }); it("should fall back to 'improve' for empty string", () => { const result = getEnhancementPrompt(''); expect(result.systemPrompt).toBe(IMPROVE_SYSTEM_PROMPT); }); }); describe('getSystemPrompt', () => { it("should return IMPROVE_SYSTEM_PROMPT for 'improve'", () => { const result = getSystemPrompt('improve'); expect(result).toBe(IMPROVE_SYSTEM_PROMPT); }); it("should return TECHNICAL_SYSTEM_PROMPT for 'technical'", () => { const result = getSystemPrompt('technical'); expect(result).toBe(TECHNICAL_SYSTEM_PROMPT); }); it("should return SIMPLIFY_SYSTEM_PROMPT for 'simplify'", () => { const result = getSystemPrompt('simplify'); expect(result).toBe(SIMPLIFY_SYSTEM_PROMPT); }); it("should return ACCEPTANCE_SYSTEM_PROMPT for 'acceptance'", () => { const result = getSystemPrompt('acceptance'); expect(result).toBe(ACCEPTANCE_SYSTEM_PROMPT); }); }); describe('getExamples', () => { it("should return IMPROVE_EXAMPLES for 'improve'", () => { const result = getExamples('improve'); expect(result).toBe(IMPROVE_EXAMPLES); expect(result.length).toBeGreaterThan(0); }); it("should return TECHNICAL_EXAMPLES for 'technical'", () => { const result = getExamples('technical'); expect(result).toBe(TECHNICAL_EXAMPLES); expect(result.length).toBeGreaterThan(0); }); it("should return SIMPLIFY_EXAMPLES for 'simplify'", () => { const result = getExamples('simplify'); expect(result).toBe(SIMPLIFY_EXAMPLES); expect(result.length).toBeGreaterThan(0); }); it("should return ACCEPTANCE_EXAMPLES for 'acceptance'", () => { const result = getExamples('acceptance'); expect(result).toBe(ACCEPTANCE_EXAMPLES); expect(result.length).toBeGreaterThan(0); }); }); describe('buildUserPrompt', () => { const testText = 'Add a login feature'; describe('with examples (default)', () => { it("should include examples by default for 'improve' mode", () => { const result = buildUserPrompt('improve', testText); expect(result).toContain('Here are some examples'); expect(result).toContain('Example 1:'); expect(result).toContain(IMPROVE_EXAMPLES[0].input); expect(result).toContain(IMPROVE_EXAMPLES[0].output); expect(result).toContain(testText); }); it("should include examples by default for 'technical' mode", () => { const result = buildUserPrompt('technical', testText); expect(result).toContain('Here are some examples'); expect(result).toContain('Example 1:'); expect(result).toContain(TECHNICAL_EXAMPLES[0].input); expect(result).toContain(testText); }); it('should include examples when explicitly set to true', () => { const result = buildUserPrompt('improve', testText, true); expect(result).toContain('Here are some examples'); expect(result).toContain(testText); }); it('should format all examples with numbered labels', () => { const result = buildUserPrompt('improve', testText); IMPROVE_EXAMPLES.forEach((_, index) => { expect(result).toContain(`Example ${index + 1}:`); }); }); it('should separate examples with dividers', () => { const result = buildUserPrompt('improve', testText); // Count dividers (---) - should be (examples.length) + 1 const dividerCount = (result.match(/---/g) || []).length; expect(dividerCount).toBe(IMPROVE_EXAMPLES.length); }); it("should include 'Now, please enhance' before user text", () => { const result = buildUserPrompt('improve', testText); expect(result).toContain('Now, please enhance the following'); expect(result).toContain(testText); }); }); describe('without examples', () => { it('should not include examples when includeExamples is false', () => { const result = buildUserPrompt('improve', testText, false); expect(result).not.toContain('Here are some examples'); expect(result).not.toContain('Example 1:'); expect(result).not.toContain(IMPROVE_EXAMPLES[0].input); }); it('should have simple prompt without examples', () => { const result = buildUserPrompt('improve', testText, false); expect(result).toBe(`Please enhance the following task description:\n\n${testText}`); }); it('should preserve user text without examples', () => { const result = buildUserPrompt('technical', testText, false); expect(result).toContain(testText); expect(result).toContain('Please enhance'); }); }); describe('text formatting', () => { it('should preserve multiline text', () => { const multilineText = 'Line 1\nLine 2\nLine 3'; const result = buildUserPrompt('improve', multilineText); expect(result).toContain(multilineText); }); it('should handle empty text', () => { const result = buildUserPrompt('improve', ''); // With examples by default, it should contain "Now, please enhance" expect(result).toContain('Now, please enhance'); expect(result).toContain('Here are some examples'); }); it('should handle whitespace-only text', () => { const result = buildUserPrompt('improve', ' '); expect(result).toContain(' '); }); it('should handle special characters in text', () => { const specialText = 'Test & "quotes" \'apostrophes\''; const result = buildUserPrompt('improve', specialText); expect(result).toContain(specialText); }); }); describe('all modes', () => { it('should work for all valid enhancement modes', () => { const modes: Array<'improve' | 'technical' | 'simplify' | 'acceptance'> = [ 'improve', 'technical', 'simplify', 'acceptance', ]; modes.forEach((mode) => { const result = buildUserPrompt(mode, testText); expect(result).toBeDefined(); expect(result).toContain(testText); expect(result.length).toBeGreaterThan(testText.length); }); }); }); }); describe('isValidEnhancementMode', () => { it("should return true for 'improve'", () => { expect(isValidEnhancementMode('improve')).toBe(true); }); it("should return true for 'technical'", () => { expect(isValidEnhancementMode('technical')).toBe(true); }); it("should return true for 'simplify'", () => { expect(isValidEnhancementMode('simplify')).toBe(true); }); it("should return true for 'acceptance'", () => { expect(isValidEnhancementMode('acceptance')).toBe(true); }); it('should return false for invalid mode', () => { expect(isValidEnhancementMode('invalid')).toBe(false); }); it('should return false for empty string', () => { expect(isValidEnhancementMode('')).toBe(false); }); it('should return false for uppercase mode', () => { // Should be case-sensitive since we check object keys directly expect(isValidEnhancementMode('IMPROVE')).toBe(false); }); it('should return false for mixed case mode', () => { expect(isValidEnhancementMode('ImProve')).toBe(false); }); it('should return false for partial mode names', () => { expect(isValidEnhancementMode('impro')).toBe(false); expect(isValidEnhancementMode('tech')).toBe(false); }); it('should return false for mode with extra characters', () => { expect(isValidEnhancementMode('improve ')).toBe(false); expect(isValidEnhancementMode(' improve')).toBe(false); }); }); describe('getAvailableEnhancementModes', () => { it('should return array of all enhancement modes', () => { const modes = getAvailableEnhancementModes(); expect(Array.isArray(modes)).toBe(true); expect(modes.length).toBe(4); }); it('should include all valid modes', () => { const modes = getAvailableEnhancementModes(); expect(modes).toContain('improve'); expect(modes).toContain('technical'); expect(modes).toContain('simplify'); expect(modes).toContain('acceptance'); }); it('should return modes in consistent order', () => { const modes1 = getAvailableEnhancementModes(); const modes2 = getAvailableEnhancementModes(); expect(modes1).toEqual(modes2); }); it('should return all valid modes that pass isValidEnhancementMode', () => { const modes = getAvailableEnhancementModes(); modes.forEach((mode) => { expect(isValidEnhancementMode(mode)).toBe(true); }); }); }); describe('Integration tests', () => { it('should work together: getEnhancementPrompt + buildUserPrompt', () => { const mode = 'improve'; const text = 'Add search feature'; const { systemPrompt, description } = getEnhancementPrompt(mode); const userPrompt = buildUserPrompt(mode, text); expect(systemPrompt).toBe(IMPROVE_SYSTEM_PROMPT); expect(description).toBeDefined(); expect(userPrompt).toContain(text); }); it('should handle complete enhancement workflow', () => { const availableModes = getAvailableEnhancementModes(); expect(availableModes.length).toBeGreaterThan(0); availableModes.forEach((mode) => { const isValid = isValidEnhancementMode(mode); expect(isValid).toBe(true); const systemPrompt = getSystemPrompt(mode); expect(systemPrompt).toBeDefined(); expect(systemPrompt.length).toBeGreaterThan(0); const examples = getExamples(mode); expect(Array.isArray(examples)).toBe(true); expect(examples.length).toBeGreaterThan(0); const userPrompt = buildUserPrompt(mode, 'test description'); expect(userPrompt).toContain('test description'); }); }); it('should provide consistent data across functions', () => { const mode = 'technical'; const promptConfig = getEnhancementPrompt(mode); const systemPrompt = getSystemPrompt(mode); const examples = getExamples(mode); expect(promptConfig.systemPrompt).toBe(systemPrompt); expect(examples).toBe(TECHNICAL_EXAMPLES); }); }); describe('Examples content validation', () => { it('IMPROVE_EXAMPLES should demonstrate improvement', () => { IMPROVE_EXAMPLES.forEach((example) => { // Output should be longer and more detailed than input expect(example.output.length).toBeGreaterThan(example.input.length); // Input should be brief/vague expect(example.input.length).toBeLessThan(100); }); }); it('TECHNICAL_EXAMPLES should contain technical terms', () => { const technicalTerms = [ 'API', 'endpoint', 'component', 'database', 'frontend', 'backend', 'validation', 'schema', 'React', 'GET', 'PUT', 'POST', ]; TECHNICAL_EXAMPLES.forEach((example) => { const hasAnyTechnicalTerm = technicalTerms.some((term) => example.output.includes(term)); expect(hasAnyTechnicalTerm).toBe(true); }); }); it('ACCEPTANCE_EXAMPLES should contain acceptance criteria format', () => { ACCEPTANCE_EXAMPLES.forEach((example) => { // Should contain numbered criteria or Given-When-Then format const hasAcceptanceCriteria = example.output.includes('Acceptance Criteria') || example.output.match(/\d+\./g); expect(hasAcceptanceCriteria).toBeTruthy(); // Should contain Given-When-Then format const hasGWT = example.output.includes('Given') && example.output.includes('when') && example.output.includes('then'); expect(hasGWT).toBe(true); }); }); }); });