Skip to content

Commit 01ad868

Browse files
committed
test: add more tests for delayDecider
1 parent df323f4 commit 01ad868

File tree

1 file changed

+76
-61
lines changed

1 file changed

+76
-61
lines changed

packages/middleware-retry/src/defaultStrategy.spec.ts

Lines changed: 76 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ describe("defaultStrategy", () => {
5757
await retryStrategy.retry(next, {} as any);
5858
} catch (error) {
5959
expect(error).toStrictEqual(mockError);
60+
return error;
6061
}
6162
};
6263

@@ -110,7 +111,7 @@ describe("defaultStrategy", () => {
110111
});
111112
});
112113

113-
describe("retryDecider", () => {
114+
describe("retryDecider init", () => {
114115
it("sets defaultRetryDecider if options is undefined", () => {
115116
const retryStrategy = new StandardRetryStrategy(maxAttempts);
116117
expect(retryStrategy["retryDecider"]).toBe(defaultRetryDecider);
@@ -130,7 +131,7 @@ describe("defaultStrategy", () => {
130131
});
131132
});
132133

133-
describe("delayDecider", () => {
134+
describe("delayDecider init", () => {
134135
it("sets defaultDelayDecider if options is undefined", () => {
135136
const retryStrategy = new StandardRetryStrategy(maxAttempts);
136137
expect(retryStrategy["delayDecider"]).toBe(defaultDelayDecider);
@@ -150,7 +151,7 @@ describe("defaultStrategy", () => {
150151
});
151152
});
152153

153-
describe("retryQuota", () => {
154+
describe("retryQuota init", () => {
154155
it("sets getDefaultRetryQuota if options is undefined", () => {
155156
const retryStrategy = new StandardRetryStrategy(maxAttempts);
156157
expect(retryStrategy["retryQuota"]).toBe(getDefaultRetryQuota());
@@ -170,31 +171,82 @@ describe("defaultStrategy", () => {
170171
});
171172
});
172173

173-
describe("delayBase passed to delayDecider", () => {
174-
const testDelayBasePassed = async (
175-
delayBaseToTest: number,
176-
mockThrottlingError: boolean
177-
) => {
178-
(isThrottlingError as jest.Mock).mockReturnValueOnce(mockThrottlingError);
174+
describe("delayDecider", () => {
175+
describe("delayBase value passed", () => {
176+
const testDelayBasePassed = async (
177+
delayBaseToTest: number,
178+
mockThrottlingError: boolean
179+
) => {
180+
(isThrottlingError as jest.Mock).mockReturnValueOnce(
181+
mockThrottlingError
182+
);
183+
184+
const mockError = new Error();
185+
await mockSuccessAfterOneFail(maxAttempts, { mockError });
186+
187+
expect(isThrottlingError as jest.Mock).toHaveBeenCalledTimes(1);
188+
expect(isThrottlingError as jest.Mock).toHaveBeenCalledWith(mockError);
189+
expect(defaultDelayDecider as jest.Mock).toHaveBeenCalledTimes(1);
190+
expect((defaultDelayDecider as jest.Mock).mock.calls[0][0]).toBe(
191+
delayBaseToTest
192+
);
193+
};
194+
195+
it("should be equal to THROTTLING_RETRY_DELAY_BASE if error is throttling error", async () => {
196+
return testDelayBasePassed(THROTTLING_RETRY_DELAY_BASE, true);
197+
});
179198

180-
const mockError = new Error();
181-
await mockSuccessAfterOneFail(maxAttempts, { mockError });
182-
183-
expect(isThrottlingError as jest.Mock).toHaveBeenCalledTimes(1);
184-
expect(isThrottlingError as jest.Mock).toHaveBeenCalledWith(mockError);
185-
expect(defaultDelayDecider as jest.Mock).toHaveBeenCalledTimes(1);
186-
expect(defaultDelayDecider as jest.Mock).toHaveBeenCalledWith(
187-
delayBaseToTest,
188-
1
189-
);
190-
};
199+
it("should be equal to DEFAULT_RETRY_DELAY_BASE in error is not a throttling error", async () => {
200+
return testDelayBasePassed(DEFAULT_RETRY_DELAY_BASE, false);
201+
});
202+
});
203+
204+
describe("attempts value passed", () => {
205+
it("on successful operation", async () => {
206+
await mockSuccessfulOperation(maxAttempts);
207+
expect(defaultDelayDecider as jest.Mock).not.toHaveBeenCalled();
208+
});
209+
210+
it("in case of single failure", async () => {
211+
await mockSuccessAfterOneFail(maxAttempts);
212+
expect(defaultDelayDecider as jest.Mock).toHaveBeenCalledTimes(1);
213+
expect((defaultDelayDecider as jest.Mock).mock.calls[0][1]).toBe(1);
214+
});
191215

192-
it("should be equal to THROTTLING_RETRY_DELAY_BASE if error is throttling error", async () => {
193-
return testDelayBasePassed(THROTTLING_RETRY_DELAY_BASE, true);
216+
it("on all fails", async () => {
217+
await mockFailedOperation(maxAttempts);
218+
expect(defaultDelayDecider as jest.Mock).toHaveBeenCalledTimes(2);
219+
expect((defaultDelayDecider as jest.Mock).mock.calls[0][1]).toBe(1);
220+
expect((defaultDelayDecider as jest.Mock).mock.calls[1][1]).toBe(2);
221+
});
194222
});
195223

196-
it("should be equal to DEFAULT_RETRY_DELAY_BASE in error is not a throttling error", async () => {
197-
return testDelayBasePassed(DEFAULT_RETRY_DELAY_BASE, false);
224+
it("delay value returned", async () => {
225+
jest.spyOn(global, "setTimeout");
226+
227+
const FIRST_DELAY = 100;
228+
const SECOND_DELAY = 200;
229+
230+
(defaultDelayDecider as jest.Mock)
231+
.mockReturnValueOnce(FIRST_DELAY)
232+
.mockReturnValueOnce(SECOND_DELAY);
233+
234+
const maxAttempts = 3;
235+
const error = await mockFailedOperation(maxAttempts);
236+
expect(error.$metadata.totalRetryDelay).toEqual(
237+
FIRST_DELAY + SECOND_DELAY
238+
);
239+
240+
expect(defaultDelayDecider as jest.Mock).toHaveBeenCalledTimes(
241+
maxAttempts - 1
242+
);
243+
expect(setTimeout).toHaveBeenCalledTimes(maxAttempts - 1);
244+
expect(((setTimeout as unknown) as jest.Mock).mock.calls[0][1]).toBe(
245+
FIRST_DELAY
246+
);
247+
expect(((setTimeout as unknown) as jest.Mock).mock.calls[1][1]).toBe(
248+
SECOND_DELAY
249+
);
198250
});
199251
});
200252

@@ -332,41 +384,4 @@ describe("defaultStrategy", () => {
332384
expect(releaseRetryTokens).not.toHaveBeenCalled();
333385
});
334386
});
335-
336-
it("should delay equal to the value returned by delayDecider", async () => {
337-
jest.spyOn(global, "setTimeout");
338-
339-
const FIRST_DELAY = 100;
340-
const SECOND_DELAY = 200;
341-
342-
(defaultDelayDecider as jest.Mock)
343-
.mockReturnValueOnce(FIRST_DELAY)
344-
.mockReturnValueOnce(SECOND_DELAY);
345-
346-
const mockError = new Error("mockError");
347-
const next = jest.fn().mockRejectedValue(mockError);
348-
349-
const retryStrategy = new StandardRetryStrategy(3);
350-
try {
351-
await retryStrategy.retry(next, {} as any);
352-
} catch (error) {
353-
expect(error).toStrictEqual(mockError);
354-
expect(error.$metadata.totalRetryDelay).toEqual(
355-
FIRST_DELAY + SECOND_DELAY
356-
);
357-
}
358-
359-
expect(defaultDelayDecider as jest.Mock).toHaveBeenCalledTimes(2);
360-
expect(setTimeout).toHaveBeenCalledTimes(2);
361-
expect(setTimeout).toHaveBeenNthCalledWith(
362-
1,
363-
expect.any(Function),
364-
FIRST_DELAY
365-
);
366-
expect(setTimeout).toHaveBeenNthCalledWith(
367-
2,
368-
expect.any(Function),
369-
SECOND_DELAY
370-
);
371-
});
372387
});

0 commit comments

Comments
 (0)