/**
 * Copyright IBM Corp. 2024, 2025
 */
import axios from 'axios';
import { AxiosClient } from '../../../src/engine/protocol/axios-client.js';
import { HttpClientOpt } from '../../../src/engine/protocol/http-client.js';

jest.mock('axios');
const mockedAxios = axios as any as jest.Mock;

describe('HttpClient Interface Compliance', () => {
  let client: AxiosClient;
  beforeEach(() => {
    client = new AxiosClient();
    mockedAxios.mockReset();
  });

  it('should support all required HttpClientOpt options', async () => {
    mockedAxios.mockResolvedValueOnce({ data: { success: true } });
    const options: HttpClientOpt = {
      method: 'POST',
      url: 'https://example.com',
      headers: { 'X-Test': '1' },
      data: { test: 'value' },
      params: { q: 1 },
      auth: { username: 'u', password: 'p' },
      timeout: 5000,
      proxy: {
        host: '127.0.0.1',
        port: 9000,
        protocol: 'http',
        auth: { username: 'proxyUser', password: 'proxyPass' },
      },
    };
    const isFormDataAvailable: boolean = false;
    await expect(
      client.request(options, isFormDataAvailable),
    ).resolves.not.toThrow();
  });

  it('should retry on error with proxy config', async () => {
    mockedAxios.mockResolvedValueOnce({ data: { success: true } });
    const options: HttpClientOpt = {
      method: 'POST',
      url: 'https://example.com',
      headers: { 'X-Test': '1' },
      data: { test: 'value' },
      params: { q: 1 },
      auth: { username: 'u', password: 'p' },
      timeout: 500,
      proxy: {
        host: '127.0.0.1',
        port: 9000,
        protocol: 'http',
        auth: { username: 'proxyUser', password: 'proxyPass' },
      },
    };
    const isFormDataAvailable: boolean = false;
    await expect(
      client.request(options, isFormDataAvailable),
    ).resolves.not.toThrow();

    expect(mockedAxios).toHaveBeenCalledTimes(1);

    mockedAxios.mock.calls.forEach(([config]) => {
      expect(config.proxy).toEqual(
        expect.objectContaining({ host: '127.0.0.1', port: 9000 }),
      );
    });
  });
});
