UNPKG

ai-switcher

Version:

A package which helps you switch between AI APIs using configurations, so that code changes are not required.

65 lines (56 loc) 1.87 kB
// src/__tests__/OpenAIClient.test.ts import { OpenAIClient } from '../clients/openai'; import { Message } from '../types'; // Mock OpenAI constructor and its methods jest.mock('openai', () => ({ __esModule: true, default: jest.fn().mockImplementation((opts) => ({ chat: { completions: { create: jest.fn() } }, embeddings: { create: jest.fn() } })) })); describe('OpenAIClient', () => { let client: OpenAIClient; let mockOpenAI: any; beforeEach(() => { jest.clearAllMocks(); client = new OpenAIClient('test-key'); mockOpenAI = require('openai').default.mock.results[0].value; }); describe('createCompletion', () => { const messages: Message[] = [{ role: 'user' as const, content: 'test' }]; it('should return completion response', async () => { mockOpenAI.chat.completions.create.mockResolvedValue({ choices: [{ message: { content: 'test response' } }] }); const result = await client.createCompletion(messages); expect(result).toBe('test response'); }); it('should handle rate limit errors', async () => { const error = new Error('Rate limit exceeded') as any; error.status = 429; mockOpenAI.chat.completions.create.mockRejectedValue(error); await expect(client.createCompletion(messages)).rejects.toMatchObject({ message: expect.stringContaining('Rate limit exceeded'), provider: 'openai', statusCode: 429 }); }); }); describe('createEmbedding', () => { it('should return embedding data', async () => { const fakeEmbedding = [0.1, 0.2, 0.3]; mockOpenAI.embeddings.create.mockResolvedValue({ data: [{ embedding: fakeEmbedding }] }); const result = await client.createEmbedding('test'); expect(result).toEqual(fakeEmbedding); }); }); });