import { describe, expect, it, vi } from 'vitest';
import { abortable } from '../abortable';

describe('abortable', () => {
  it('settles on abort even when the engine promise never settles', async () => {
    const controller = new AbortController();
    const onAbort = vi.fn();
    const pending = new Promise<never>(() => {});
    const result = abortable(pending, controller.signal, onAbort);

    controller.abort(new DOMException('cancelled', 'AbortError'));

    await expect(result).rejects.toMatchObject({ name: 'AbortError' });
    expect(onAbort).toHaveBeenCalledOnce();
  });

  it('does not call the abort hook for a completed operation', async () => {
    const controller = new AbortController();
    const onAbort = vi.fn();

    await expect(
      abortable(Promise.resolve('done'), controller.signal, onAbort),
    ).resolves.toBe('done');
    expect(onAbort).not.toHaveBeenCalled();
  });
});
