import type { SortableOptions } from 'sortablejs';

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

import { useSortable } from '../use-sortable';

describe('useSortable', () => {
  beforeEach(() => {
    vi.mock('sortablejs/modular/sortable.complete.esm.js', () => ({
      default: {
        create: vi.fn(),
      },
    }));
  });
  it('should call Sortable.create with the correct options', async () => {
    // Create a mock element
    const mockElement = document.createElement('div') as HTMLDivElement;

    // Define custom options
    const customOptions: SortableOptions = {
      group: 'test-group',
      sort: false,
    };

    // Use the useSortable function
    const { initializeSortable } = useSortable(mockElement, customOptions);

    // Initialize sortable
    await initializeSortable();

    // Import sortablejs to access the mocked create function
    const Sortable =
      // @ts-expect-error - This is a dynamic import
      await import('sortablejs/modular/sortable.complete.esm.js');

    // Verify that Sortable.create was called with the correct parameters
    expect(Sortable.default.create).toHaveBeenCalledTimes(1);
    expect(Sortable.default.create).toHaveBeenCalledWith(
      mockElement,
      expect.objectContaining({
        animation: 300,
        delay: 400,
        delayOnTouchOnly: true,
        ...customOptions,
      }),
    );
  });
});
