diff options
Diffstat (limited to 'tst/either.test.ts')
-rw-r--r-- | tst/either.test.ts | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/tst/either.test.ts b/tst/either.test.ts new file mode 100644 index 0000000..790d392 --- /dev/null +++ b/tst/either.test.ts @@ -0,0 +1,45 @@ +import { Either } from '@emprespresso/pengueno'; + +describe('Either.retrying', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('succeeds on first attempt', async () => { + const supplier = jest.fn().mockResolvedValue(Either.right<string, string>('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<string, string>('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<string, string>('attempt 1 failed')) + .mockResolvedValueOnce(Either.left<string, string>('attempt 2 failed')) + .mockResolvedValueOnce(Either.right<string, string>('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); + }); +}); |