import { beforeEach, describe, expect, it, vi } from 'vitest';

const requestMocks = vi.hoisted(() => ({
  get: vi.fn(),
  post: vi.fn(),
  put: vi.fn(),
}));

vi.mock('#/api/request', () => ({
  defHttp: requestMocks,
}));

// eslint-disable-next-line import/first -- request module must be mocked before loading the API wrapper.
import {
  createSourceDataItem,
  createSourcePath,
  getSourceDataItems,
  getSourceEnumObjects,
  getSourceEnumOptions,
  getSourcePaths,
  getSourcePreviewSamples,
  previewSourceDataItem,
  publishSourceDataItem,
  saveSourceDataItem,
} from './sources';

describe('ELN source API paths', () => {
  beforeEach(() => vi.clearAllMocks());

  it('uses lowerCamelCase path segments', () => {
    getSourceDataItems();
    getSourcePaths();
    getSourcePreviewSamples();
    getSourceEnumObjects();
    createSourcePath({} as never);
    createSourceDataItem({} as never);
    getSourceEnumOptions({ labelFieldId: 'label', objectId: 'object', valueFieldId: 'value' });
    saveSourceDataItem('item-1', {} as never);
    previewSourceDataItem('item-1', 'sample-1');
    publishSourceDataItem('item-1', { expectedEditVersion: 0, sampleId: 'sample-1' });

    expect(requestMocks.get.mock.calls.map(([request]) => request.url)).toEqual([
      '/api/lims/eln/sources/dataItems',
      '/api/lims/eln/sources/sourcePaths',
      '/api/lims/eln/sources/previewSamples',
      '/api/lims/eln/sources/enumObjects',
    ]);
    expect(requestMocks.post.mock.calls.map(([request]) => request.url)).toEqual([
      '/api/lims/eln/sources/sourcePaths',
      '/api/lims/eln/sources/dataItems',
      '/api/lims/eln/sources/enumOptions',
      '/api/lims/eln/sources/dataItems/item-1/preview',
      '/api/lims/eln/sources/dataItems/item-1/publish',
    ]);
    expect(requestMocks.put).toHaveBeenCalledWith({
      data: {},
      url: '/api/lims/eln/sources/dataItems/item-1',
    });
  });
});
