refactor(retry): simplify error handling in retry tests and ensure consistent promise rejection handling
This commit is contained in:
@@ -99,53 +99,56 @@ describe('retry', () => {
|
|||||||
const failingFn = vi.fn().mockRejectedValue(new Error('Test error'));
|
const failingFn = vi.fn().mockRejectedValue(new Error('Test error'));
|
||||||
|
|
||||||
const retryPromise = retry(failingFn, { times: 3, delay: 1000 });
|
const retryPromise = retry(failingFn, { times: 3, delay: 1000 });
|
||||||
|
const result = expect(retryPromise).rejects.toThrow('Test error');
|
||||||
|
|
||||||
// First call should happen immediately
|
// First call should happen immediately
|
||||||
expect(failingFn).toHaveBeenCalledTimes(1);
|
expect(failingFn).toHaveBeenCalledTimes(1);
|
||||||
|
|
||||||
// Advance time to trigger first retry
|
// Advance time to trigger first retry
|
||||||
await vi.advanceTimersByTimeAsync(1000);
|
await vi.advanceTimersByTimeAsync(1000);
|
||||||
expect(failingFn).toHaveBeenCalledTimes(2);
|
expect(failingFn).toHaveBeenCalledTimes(2);
|
||||||
|
|
||||||
// Advance time to trigger second retry
|
// Advance time to trigger second retry
|
||||||
await vi.advanceTimersByTimeAsync(1000);
|
await vi.advanceTimersByTimeAsync(1000);
|
||||||
expect(failingFn).toHaveBeenCalledTimes(3);
|
expect(failingFn).toHaveBeenCalledTimes(3);
|
||||||
|
|
||||||
await expect(retryPromise).rejects.toThrow('Test error');
|
await result;
|
||||||
});
|
});
|
||||||
|
|
||||||
it('use dynamic delay function', async () => {
|
it('use dynamic delay function', async () => {
|
||||||
const failingFn = vi.fn().mockRejectedValue(new Error('Test error'));
|
const failingFn = vi.fn().mockRejectedValue(new Error('Test error'));
|
||||||
const delayFn = vi.fn((count: number) => count * 500);
|
const delayFn = vi.fn((count: number) => count * 500);
|
||||||
|
|
||||||
const retryPromise = retry(failingFn, { times: 3, delay: delayFn });
|
const retryPromise = retry(failingFn, { times: 3, delay: delayFn });
|
||||||
|
const result = expect(retryPromise).rejects.toThrow('Test error');
|
||||||
|
|
||||||
// First call should happen immediately
|
// First call should happen immediately
|
||||||
expect(failingFn).toHaveBeenCalledTimes(1);
|
expect(failingFn).toHaveBeenCalledTimes(1);
|
||||||
|
|
||||||
// First retry should wait for delay(2) = 1000ms
|
// First retry should wait for delay(2) = 1000ms
|
||||||
await vi.advanceTimersByTimeAsync(1000);
|
await vi.advanceTimersByTimeAsync(1000);
|
||||||
expect(failingFn).toHaveBeenCalledTimes(2);
|
expect(failingFn).toHaveBeenCalledTimes(2);
|
||||||
expect(delayFn).toHaveBeenCalledWith(2);
|
expect(delayFn).toHaveBeenCalledWith(2);
|
||||||
|
|
||||||
// Second retry should wait for delay(3) = 1500ms
|
// Second retry should wait for delay(3) = 1500ms
|
||||||
await vi.advanceTimersByTimeAsync(1500);
|
await vi.advanceTimersByTimeAsync(1500);
|
||||||
expect(failingFn).toHaveBeenCalledTimes(3);
|
expect(failingFn).toHaveBeenCalledTimes(3);
|
||||||
expect(delayFn).toHaveBeenCalledWith(3);
|
expect(delayFn).toHaveBeenCalledWith(3);
|
||||||
|
|
||||||
await expect(retryPromise).rejects.toThrow('Test error');
|
await result;
|
||||||
});
|
});
|
||||||
|
|
||||||
it('not delay after the last attempt', async () => {
|
it('not delay after the last attempt', async () => {
|
||||||
const failingFn = vi.fn().mockRejectedValue(new Error('Test error'));
|
const failingFn = vi.fn().mockRejectedValue(new Error('Test error'));
|
||||||
|
|
||||||
const retryPromise = retry(failingFn, { times: 2, delay: 1000 });
|
const retryPromise = retry(failingFn, { times: 2, delay: 1000 });
|
||||||
|
const result = expect(retryPromise).rejects.toThrow('Test error');
|
||||||
|
|
||||||
// Wait for the first retry delay
|
// Wait for the first retry delay
|
||||||
await vi.advanceTimersByTimeAsync(1000);
|
await vi.advanceTimersByTimeAsync(1000);
|
||||||
|
|
||||||
// Should complete without further delays
|
// Should complete without further delays
|
||||||
await expect(retryPromise).rejects.toThrow('Test error');
|
await result;
|
||||||
expect(failingFn).toHaveBeenCalledTimes(2);
|
expect(failingFn).toHaveBeenCalledTimes(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ export function tryIt<Args extends any[], Return>(
|
|||||||
const result = fn(...args);
|
const result = fn(...args);
|
||||||
|
|
||||||
if (isPromise(result))
|
if (isPromise(result))
|
||||||
return result.then(onResolve).catch(onReject) as TryItReturn<Return>;
|
return result.then(onResolve, onReject) as TryItReturn<Return>;
|
||||||
|
|
||||||
return { error: undefined, data: result } as TryItReturn<Return>;
|
return { error: undefined, data: result } as TryItReturn<Return>;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user