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
text/typescript
// 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);
});
});
});