/ .github / scripts / claude-enhancer.test.js
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  });