Skip to content

Commit 545c7e3

Browse files
committed
updates test_RetrySender to typescript
1 parent 5f83cb7 commit 545c7e3

File tree

2 files changed

+73
-34
lines changed

2 files changed

+73
-34
lines changed

src/types.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,14 @@ export interface Sender {
2020
export interface Sleeper {
2121
sleep(seconds: number): Promise<void>;
2222
}
23+
24+
export interface MockSenderInstance extends Sender {
25+
statusCodes: string[];
26+
headers?: Record<string, unknown> | undefined;
27+
error?: string | undefined;
28+
currentStatusCodeIndex: number;
29+
}
30+
31+
export interface MockSleeperInstance extends Sleeper {
32+
sleepDurations: number[];
33+
}

tests/test_RetrySender.ts

Lines changed: 62 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,79 @@ import { expect } from "chai";
22
import RetrySender from "../src/RetrySender.js";
33
import { MockSenderWithStatusCodesAndHeaders } from "./fixtures/mock_senders.js";
44
import Request from "../src/Request.js";
5-
import MockSleeper from "./fixtures/MockSleeper.js";
5+
import Response from "../src/Response.js";
6+
import type { Sender, Sleeper, MockSenderInstance, MockSleeperInstance } from "../src/types.js";
7+
8+
class CompatibleMockSender implements MockSenderInstance {
9+
statusCodes: string[];
10+
headers?: Record<string, unknown> | undefined;
11+
error?: string | undefined;
12+
currentStatusCodeIndex: number;
13+
private mockSender: {
14+
send(request: Request): Response;
15+
currentStatusCodeIndex: number;
16+
};
17+
18+
constructor(statusCodes: string[], headers?: Record<string, unknown>, error?: string) {
19+
this.statusCodes = statusCodes;
20+
this.headers = headers;
21+
this.error = error;
22+
this.currentStatusCodeIndex = 0;
23+
this.mockSender = new (MockSenderWithStatusCodesAndHeaders as new (
24+
...args: [string[], Record<string, unknown>?, string?]
25+
) => {
26+
send(request: Request): Response;
27+
currentStatusCodeIndex: number;
28+
})(statusCodes, headers, error);
29+
}
30+
31+
async send(request: Request): Promise<Response> {
32+
const result = this.mockSender.send(request);
33+
this.currentStatusCodeIndex = this.mockSender.currentStatusCodeIndex;
34+
return Promise.resolve(result);
35+
}
36+
}
37+
38+
class CompatibleMockSleeper implements MockSleeperInstance {
39+
sleepDurations: number[] = [];
40+
41+
async sleep(ms: number): Promise<void> {
42+
this.sleepDurations.push(ms);
43+
return Promise.resolve();
44+
}
45+
}
646

7-
async function sendWithRetry(retries: number, inner: any, sleeper: any) {
47+
async function sendWithRetry(retries: number, inner: Sender, sleeper: Sleeper) {
848
const request = new Request();
949
const sender = new RetrySender(retries, inner, sleeper);
1050
return await sender.send(request);
1151
}
1252

1353
describe("Retry Sender tests", function () {
1454
it("test success does not retry", async function () {
15-
let inner = new (MockSenderWithStatusCodesAndHeaders as any)(["200"]);
16-
await sendWithRetry(5, inner, new MockSleeper());
55+
let inner = new CompatibleMockSender(["200"]);
56+
await sendWithRetry(5, inner, new CompatibleMockSleeper());
1757

1858
expect(inner.currentStatusCodeIndex).to.equal(1);
1959
});
2060

2161
it("test client error does not retry", async function () {
22-
let inner = new (MockSenderWithStatusCodesAndHeaders as any)(["422"]);
23-
await sendWithRetry(5, inner, new MockSleeper());
62+
let inner = new CompatibleMockSender(["422"]);
63+
await sendWithRetry(5, inner, new CompatibleMockSleeper());
2464

2565
expect(inner.currentStatusCodeIndex).to.equal(1);
2666
});
2767

2868
it("test will retry until success", async function () {
29-
let inner = new (MockSenderWithStatusCodesAndHeaders as any)([
30-
"500",
31-
"500",
32-
"500",
33-
"200",
34-
"500",
35-
]);
36-
await sendWithRetry(10, inner, new MockSleeper());
69+
let inner = new CompatibleMockSender(["500", "500", "500", "200", "500"]);
70+
await sendWithRetry(10, inner, new CompatibleMockSleeper());
3771

3872
expect(inner.currentStatusCodeIndex).to.equal(4);
3973
});
4074

4175
it("test return response if retry limit exceeded", async function () {
42-
let inner = new (MockSenderWithStatusCodesAndHeaders as any)([
43-
"500",
44-
"500",
45-
"500",
46-
"500",
47-
"500",
48-
]);
49-
const sleeper = new MockSleeper();
76+
let inner = new CompatibleMockSender(["500", "500", "500", "500", "500"]);
77+
const sleeper = new CompatibleMockSleeper();
5078
const response = await sendWithRetry(4, inner, sleeper);
5179

5280
expect(response);
@@ -56,7 +84,7 @@ describe("Retry Sender tests", function () {
5684
});
5785

5886
it("test backoff does not exceed max", async function () {
59-
let inner = new (MockSenderWithStatusCodesAndHeaders as any)([
87+
let inner = new CompatibleMockSender([
6088
"500",
6189
"500",
6290
"500",
@@ -72,50 +100,50 @@ describe("Retry Sender tests", function () {
72100
"500",
73101
"200",
74102
]);
75-
const sleeper = new MockSleeper();
103+
const sleeper = new CompatibleMockSleeper();
76104

77105
await sendWithRetry(20, inner, sleeper);
78106

79107
expect(sleeper.sleepDurations).to.deep.equal([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10]);
80108
});
81109

82110
it("test empty status does not retry", async function () {
83-
let inner = new (MockSenderWithStatusCodesAndHeaders as any)([]);
84-
await sendWithRetry(5, inner, new MockSleeper());
111+
let inner = new CompatibleMockSender([]);
112+
await sendWithRetry(5, inner, new CompatibleMockSleeper());
85113

86114
expect(inner.currentStatusCodeIndex).to.equal(1);
87115
});
88116

89117
it("test sleep on rate limit", async function () {
90-
let inner = new (MockSenderWithStatusCodesAndHeaders as any)(["429", "200"]);
91-
const sleeper = new MockSleeper();
118+
let inner = new CompatibleMockSender(["429", "200"]);
119+
const sleeper = new CompatibleMockSleeper();
92120

93121
await sendWithRetry(5, inner, sleeper);
94122

95123
expect(sleeper.sleepDurations).to.deep.equal([10]);
96124
});
97125

98126
it("test rate limit error return", async function () {
99-
let inner = new (MockSenderWithStatusCodesAndHeaders as any)(["429"], { "Retry-After": 7 });
100-
const sleeper = new MockSleeper();
127+
let inner = new CompatibleMockSender(["429"], { "Retry-After": 7 });
128+
const sleeper = new CompatibleMockSleeper();
101129

102130
await sendWithRetry(10, inner, sleeper);
103131

104132
expect(sleeper.sleepDurations).to.deep.equal([7]);
105133
});
106134

107135
it("test retry after invalid value", async function () {
108-
let inner = new (MockSenderWithStatusCodesAndHeaders as any)(["429"], { "Retry-After": "a" });
109-
const sleeper = new MockSleeper();
136+
let inner = new CompatibleMockSender(["429"], { "Retry-After": "a" });
137+
const sleeper = new CompatibleMockSleeper();
110138

111139
await sendWithRetry(10, inner, sleeper);
112140

113141
expect(sleeper.sleepDurations).to.deep.equal([10]);
114142
});
115143

116144
it("test retry error", async function () {
117-
let inner = new (MockSenderWithStatusCodesAndHeaders as any)(["429"], undefined, "Big Bad");
118-
const sleeper = new MockSleeper();
145+
let inner = new CompatibleMockSender(["429"], undefined, "Big Bad");
146+
const sleeper = new CompatibleMockSleeper();
119147

120148
const response = await sendWithRetry(10, inner, sleeper);
121149

0 commit comments

Comments
 (0)