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