From d9656076ec5c4138201080f0a250b57533357165 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Sun, 17 Aug 2025 15:09:14 -0700 Subject: Add some retry behavior --- tst/either.test.ts | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 tst/either.test.ts (limited to 'tst') 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('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); + }); +}); -- cgit v1.2.3-70-g09d2