import { Either } from '@emprespresso/pengueno'; describe('Either.retrying', () => { beforeEach(() => { jest.clearAllMocks(); }); test('succeeds on first attempt', async () => { const supplier = jest.fn().mockResolvedValue(Either.right('success')); const interval = jest.fn().mockResolvedValue(undefined); const result = await Either.retrying(supplier, 3, interval); expect(result.right().get()).toBe('success'); expect(supplier).toHaveBeenCalledTimes(1); }); test('never succeeds after all attempts', async () => { const supplier = jest.fn().mockResolvedValue(Either.left('failed')); const interval = jest.fn().mockResolvedValue(undefined); const result = await Either.retrying(supplier, 3, interval); expect(result.left().get()).toBe('failed'); expect(supplier).toHaveBeenCalledTimes(3); }); test('attempts correct number of times and calls interval with backoff', async () => { const supplier = jest.fn() .mockResolvedValueOnce(Either.left('attempt 1 failed')) .mockResolvedValueOnce(Either.left('attempt 2 failed')) .mockResolvedValueOnce(Either.right('attempt 3 success')); const interval = jest.fn().mockResolvedValue(undefined); const result = await Either.retrying(supplier, 3, interval); expect(result.right().get()).toBe('attempt 3 success'); expect(supplier).toHaveBeenCalledTimes(3); expect(interval).toHaveBeenCalledTimes(3); expect(interval).toHaveBeenNthCalledWith(1, 0); expect(interval).toHaveBeenNthCalledWith(2, 1); expect(interval).toHaveBeenNthCalledWith(3, 2); }); });