import expect from 'expect'; import {abortable} from './abortable'; import {spyOn} from './testUtils/spy'; import {nextTick} from './utils/nextTick'; it('abortable endless promise', async () => { const abortController = new AbortController(); const signal = abortController.signal; const addEventListenerSpy = spyOn(signal, 'addEventListener'); const removeEventListenerSpy = spyOn(signal, 'removeEventListener'); let result: PromiseSettledResult | undefined; abortable( signal, new Promise(() => {}), ).then( value => { result = {status: 'fulfilled', value}; }, reason => { result = {status: 'rejected', reason}; }, ); await nextTick(); expect(result).toBeUndefined(); abortController.abort(); await nextTick(); expect(result).toMatchObject({ status: 'rejected', reason: {name: 'AbortError'}, }); expect(addEventListenerSpy.callCount).toBe(1); expect(removeEventListenerSpy.callCount).toBe(1); }); it('abort before reject', async () => { const abortController = new AbortController(); const signal = abortController.signal; const addEventListenerSpy = spyOn(signal, 'addEventListener'); const removeEventListenerSpy = spyOn(signal, 'removeEventListener'); abortController.abort(); let result: PromiseSettledResult | undefined; abortable( signal, new Promise((resolve, reject) => { reject('test'); }), ).then( value => { result = {status: 'fulfilled', value}; }, reason => { result = {status: 'rejected', reason}; }, ); await nextTick(); expect(result).toMatchObject({ status: 'rejected', reason: {name: 'AbortError'}, }); expect(addEventListenerSpy.callCount).toBe(0); expect(removeEventListenerSpy.callCount).toBe(0); });