import { GoogleGenerativeAI } from '@google/generative-ai'; import { LLMService } from '../src/services/LLMService'; // Mock the GoogleGenerativeAI class and its methods jest.mock('@google/generative-ai', () => ({ GoogleGenerativeAI: jest.fn().mockImplementation(() => ({ getGenerativeModel: jest.fn().mockReturnValue({ generateContent: jest.fn().mockResolvedValue({ response: { text: jest.fn().mockReturnValue( JSON.stringify({ "item1": "Concept A", "item2": "Concept A", "item3": "Concept B" }) ), }, }), }), })), })); describe('LLMService', () => { let llmService: LLMService; const mockApiKey = 'test-api-key'; beforeEach(() => { llmService = new LLMService(mockApiKey); }); it('should call the Gemini API with the correct prompt and return parsed content', async () => { const desires = [ { wants: ['item1'], accepts: [], noGoes: [] }, { wants: ['item2'], accepts: [], noGoes: [] }, { wants: [], accepts: ['item3'], noGoes: [] }, ]; const result = await llmService.analyzeDesires(desires); expect(GoogleGenerativeAI).toHaveBeenCalledWith(mockApiKey); expect(llmService['model'].generateContent).toHaveBeenCalled(); expect(result).toEqual({ "item1": "Concept A", "item2": "Concept A", "item3": "Concept B" }); }); it('should handle API errors gracefully', async () => { llmService['model'].generateContent.mockRejectedValueOnce(new Error('API Error')); await expect(llmService.analyzeDesires([])).rejects.toThrow('API Error'); }); });