claude-enhancer.test.js
1 const { test, suite } = require('node:test'); 2 const assert = require('assert'); 3 const { CVContentEnhancer, ClaudeApiClient } = require('./claude-enhancer.js'); 4 5 suite('ClaudeApiClient', () => { 6 let client; 7 8 test.beforeEach(() => { 9 client = new ClaudeApiClient('mock_api_key'); 10 }); 11 12 test('should generate different cache keys for different source content', () => { 13 const messages = [{ role: 'user', content: 'test prompt' }]; 14 const temperature = 0.5; 15 const maxTokens = 100; 16 17 const requestPayload = { messages, temperature, maxTokens }; 18 19 const key1 = client.generateCacheKey(requestPayload, 'source content 1'); 20 const key2 = client.generateCacheKey(requestPayload, 'source content 2'); 21 const key3 = client.generateCacheKey(requestPayload, 'source content 1'); 22 23 assert.notStrictEqual(key1, key2, 'Keys should be different for different source content'); 24 assert.strictEqual(key1, key3, 'Keys should be the same for identical source content'); 25 }); 26 27 test('should generate different cache keys for different messages', () => { 28 const temperature = 0.5; 29 const maxTokens = 100; 30 const sourceContent = 'some source'; 31 32 const messages1 = [{ role: 'user', content: 'prompt 1' }]; 33 const messages2 = [{ role: 'user', content: 'prompt 2' }]; 34 35 const requestPayload1 = { messages: messages1, temperature, maxTokens }; 36 const requestPayload2 = { messages: messages2, temperature, maxTokens }; 37 38 const key1 = client.generateCacheKey(requestPayload1, sourceContent); 39 const key2 = client.generateCacheKey(requestPayload2, sourceContent); 40 41 assert.notStrictEqual(key1, key2, 'Keys should be different for different messages'); 42 }); 43 }); 44 45 suite('CVContentEnhancer', () => { 46 let enhancer; 47 48 test.beforeEach(() => { 49 process.env.ANTHROPIC_API_KEY = 'mock_key'; 50 enhancer = new CVContentEnhancer(); 51 // Disable XML prompts so the legacy path is used (avoids xmlIntegrator dependency) 52 enhancer.useXMLPrompts = false; 53 // Mock the makeRequest to return valid JSON matching expected response shape 54 enhancer.client.makeRequest = async (_messages, _options, _sourceContent) => { 55 const mockResponse = JSON.stringify({ 56 enhanced_summary: "Enhanced professional summary for testing.", 57 strategic_improvements: { positioning_shift: "test" }, 58 ats_keywords: ["testing"], 59 confidence_score: 0.9 60 }); 61 return { content: [{ text: mockResponse }], usage: { input_tokens: 10, output_tokens: 5 } }; 62 }; 63 enhancer.loadCurrentCVData = async () => ({ professional_summary: "Original summary." }); 64 enhancer.loadActivityMetrics = async () => ({}); 65 }); 66 67 test.afterEach(() => { 68 delete process.env.ANTHROPIC_API_KEY; 69 }); 70 71 test('should enhance professional summary', async () => { 72 const result = await enhancer.enhanceProfessionalSummary({}, {}); 73 assert.strictEqual(typeof result.enhanced, 'string'); 74 assert.ok(result.enhanced.length > 0, 'Enhanced summary should not be empty'); 75 assert.strictEqual(result.enhancement_applied, true); 76 }); 77 });