import { FleetTaxiYandexRepository } from './fleet-taxi-yandex-repository';
import { HttpClientFactory } from './interfaces/http-client-factory';
import { Configuration } from './models/configuration';
import { DriversListRequest } from './models/driver/drivers-list-request';
import { AddTransactionQueryRequest } from './models/transaction/add-transaction-query-request';
import { describe, it, expect, vi, beforeEach } from 'vitest';

// Correcting the mock factory
// @ts-expect-error mock object
const mockHttpClientFactory: HttpClientFactory = () => ({
  post: vi.fn().mockImplementation((url, requestBody) => {
    // Mocking a response structure similar to Axios
    return Promise.resolve({ data: { url, requestBody } });
  }),
});

describe('FleetTaxiYandexRepository', () => {
  let repository: FleetTaxiYandexRepository;
  let mockHttp: ReturnType<HttpClientFactory>;

  beforeEach(() => {
    const mockConfig: Partial<Configuration> = {
      fleetApiEndpoint: 'https://fleet-api.taxi.yandex.net',
      fleetParkId: 'testParkId',
      fleetApiKey: 'testApiKey',
      fleetClientId: 'testClientId',
    };
    mockHttp = mockHttpClientFactory();
    repository = new FleetTaxiYandexRepository(mockConfig as Configuration, () => mockHttp);
  });

  describe('postGetDriverProfilesList', () => {
    it('should request driver-profiles endpoint on fleet.taxi.yandex.net', async () => {
      // @ts-expect-error mock object
      const mockRequestBody: DriversListRequest = {};

      await repository.postGetDriverProfilesList(mockRequestBody);

      expect(mockHttp.post).toHaveBeenCalledWith(
        'https://fleet-api.taxi.yandex.net/v1/parks/driver-profiles/list',
        mockRequestBody,
      );
    });
  });

  describe('postAddDriverProfilesTransactions', () => {
    it('should request driver profiles transactions endpoint on fleet.taxi.yandex.net', async () => {
      // @ts-expect-error mock object
      const mockRequestBody: AddTransactionQueryRequest = {};
      const idempotencyToken = 'testToken';

      await repository.postAddDriverProfilesTransactions(idempotencyToken, mockRequestBody);

      expect(mockHttp.post).toHaveBeenCalledWith(
        'https://fleet-api.taxi.yandex.net/v2/parks/driver-profiles/transactions',
        mockRequestBody,
        {
          headers: {
            'X-Idempotency-Token': idempotencyToken,
          },
        },
      );
    });
  });
});
