From 6b4ddc97336d0ac2e35765d3ecf343403830df1a Mon Sep 17 00:00:00 2001 From: robonen Date: Thu, 26 Mar 2026 06:28:09 +0700 Subject: [PATCH] refactor(retry): simplify error handling in retry tests and ensure consistent promise rejection handling --- core/stdlib/src/async/retry/index.test.ts | 33 ++++++++++++----------- core/stdlib/src/async/tryIt/index.ts | 2 +- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/core/stdlib/src/async/retry/index.test.ts b/core/stdlib/src/async/retry/index.test.ts index 3fb7131..4fc61e1 100644 --- a/core/stdlib/src/async/retry/index.test.ts +++ b/core/stdlib/src/async/retry/index.test.ts @@ -99,53 +99,56 @@ describe('retry', () => { const failingFn = vi.fn().mockRejectedValue(new Error('Test error')); const retryPromise = retry(failingFn, { times: 3, delay: 1000 }); - + const result = expect(retryPromise).rejects.toThrow('Test error'); + // First call should happen immediately expect(failingFn).toHaveBeenCalledTimes(1); - + // Advance time to trigger first retry await vi.advanceTimersByTimeAsync(1000); expect(failingFn).toHaveBeenCalledTimes(2); - + // Advance time to trigger second retry await vi.advanceTimersByTimeAsync(1000); expect(failingFn).toHaveBeenCalledTimes(3); - - await expect(retryPromise).rejects.toThrow('Test error'); + + await result; }); it('use dynamic delay function', async () => { const failingFn = vi.fn().mockRejectedValue(new Error('Test error')); const delayFn = vi.fn((count: number) => count * 500); - + const retryPromise = retry(failingFn, { times: 3, delay: delayFn }); - + const result = expect(retryPromise).rejects.toThrow('Test error'); + // First call should happen immediately expect(failingFn).toHaveBeenCalledTimes(1); - + // First retry should wait for delay(2) = 1000ms await vi.advanceTimersByTimeAsync(1000); expect(failingFn).toHaveBeenCalledTimes(2); expect(delayFn).toHaveBeenCalledWith(2); - + // Second retry should wait for delay(3) = 1500ms await vi.advanceTimersByTimeAsync(1500); expect(failingFn).toHaveBeenCalledTimes(3); expect(delayFn).toHaveBeenCalledWith(3); - - await expect(retryPromise).rejects.toThrow('Test error'); + + await result; }); it('not delay after the last attempt', async () => { const failingFn = vi.fn().mockRejectedValue(new Error('Test error')); - + const retryPromise = retry(failingFn, { times: 2, delay: 1000 }); - + const result = expect(retryPromise).rejects.toThrow('Test error'); + // Wait for the first retry delay await vi.advanceTimersByTimeAsync(1000); - + // Should complete without further delays - await expect(retryPromise).rejects.toThrow('Test error'); + await result; expect(failingFn).toHaveBeenCalledTimes(2); }); diff --git a/core/stdlib/src/async/tryIt/index.ts b/core/stdlib/src/async/tryIt/index.ts index bec5838..f0734f4 100644 --- a/core/stdlib/src/async/tryIt/index.ts +++ b/core/stdlib/src/async/tryIt/index.ts @@ -32,7 +32,7 @@ export function tryIt( const result = fn(...args); if (isPromise(result)) - return result.then(onResolve).catch(onReject) as TryItReturn; + return result.then(onResolve, onReject) as TryItReturn; return { error: undefined, data: result } as TryItReturn; } catch (error) {