diff options
author | Elizabeth Hunt <me@liz.coffee> | 2025-08-17 15:09:14 -0700 |
---|---|---|
committer | Elizabeth Hunt <me@liz.coffee> | 2025-08-17 15:32:01 -0700 |
commit | d9656076ec5c4138201080f0a250b57533357165 (patch) | |
tree | c23d32d95c532c8b25a112af4369d0aa0de55382 /tst/either.test.ts | |
parent | 3d61a9b0c29deb576ecd5d0e8de7b4426d5ab41c (diff) | |
download | pengueno-d9656076ec5c4138201080f0a250b57533357165.tar.gz pengueno-d9656076ec5c4138201080f0a250b57533357165.zip |
Add some retry behavior
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); + }); +}); |