summaryrefslogtreecommitdiff
path: root/tst/either.test.ts
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2025-08-17 15:09:14 -0700
committerElizabeth Hunt <me@liz.coffee>2025-08-17 15:32:01 -0700
commitd9656076ec5c4138201080f0a250b57533357165 (patch)
treec23d32d95c532c8b25a112af4369d0aa0de55382 /tst/either.test.ts
parent3d61a9b0c29deb576ecd5d0e8de7b4426d5ab41c (diff)
downloadpengueno-d9656076ec5c4138201080f0a250b57533357165.tar.gz
pengueno-d9656076ec5c4138201080f0a250b57533357165.zip
Add some retry behavior
Diffstat (limited to 'tst/either.test.ts')
-rw-r--r--tst/either.test.ts45
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);
+ });
+});