-
Notifications
You must be signed in to change notification settings - Fork 0
/
mod_test.ts
132 lines (124 loc) · 3.57 KB
/
mod_test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import { retry, retryAsync } from "./mod.ts";
import {
assertEquals,
assertThrowsAsync,
assert,
} from "https://deno.land/std@0.74.0/testing/asserts.ts";
const defaultOptions = { maxTry: 5, delay: 250 };
const startAssetRetryDuration = (maxTry = defaultOptions.maxTry) => {
const start = Date.now();
const expectedDuration = (maxTry - 1) * defaultOptions.delay;
return () => {
const stop = Date.now();
const actualDuration = stop - start;
assert(
actualDuration >= expectedDuration,
`Duration ${actualDuration} is not greater or equal than expected minimum duration ${expectedDuration}`,
);
};
};
Deno.test("retry shouLd work immediatly", async () => {
const expectedResult = 10103913232473;
let callCount = 0;
const cb = () => {
callCount++;
return expectedResult;
};
const actualResult = await retry(cb, defaultOptions);
assertEquals(callCount, 1);
assertEquals(actualResult, expectedResult);
});
Deno.test("retry shouLd be call until limit", async () => {
const errorMsg = "BOOM";
let callCount = 0;
const cb = () => {
callCount++;
throw new Error(errorMsg);
};
const assertActualDuration = startAssetRetryDuration();
await assertThrowsAsync(
async () => await retry(cb, defaultOptions),
Error,
errorMsg,
);
assertActualDuration();
assertEquals(callCount, 5);
});
Deno.test("retry shouLd be call until success", async () => {
const expectedResult = "youpi";
const expectedCallCount = 4;
let actualCallCount = 0;
const cb = () => {
actualCallCount++;
if (actualCallCount < expectedCallCount) {
throw new Error("Not yet");
}
return expectedResult;
};
const assertActualDuration = startAssetRetryDuration(expectedCallCount);
const actualResult = await retry(cb, defaultOptions);
assertActualDuration();
assertEquals(actualCallCount, expectedCallCount);
assertEquals(actualResult, expectedResult);
});
Deno.test("retryAsync shouLd work immediatly", async () => {
const expectedResult = 9856720325867;
let callCount = 0;
const cb = async () => {
callCount++;
return new Promise((resolve) =>
setTimeout(
() => resolve(expectedResult),
100,
)
);
};
const actualResult = await retryAsync(cb, defaultOptions);
assertEquals(callCount, 1);
assertEquals(actualResult, expectedResult);
});
Deno.test("retry shouLd be call until limit", async () => {
const errorMsg = "BOOM";
let callCount = 0;
const cb = async () => {
callCount++;
return new Promise<void>((_, reject) => {
setTimeout(
() => reject(new Error(errorMsg)),
100,
);
});
};
const assetRetryDuration = startAssetRetryDuration();
await assertThrowsAsync(
async () => await retryAsync(cb, defaultOptions),
Error,
errorMsg,
);
assetRetryDuration();
assertEquals(callCount, 5);
});
Deno.test("retryAsync shouLd be call until success", async () => {
const expectedResult = "youpi";
const expectedCallCount = 4;
let actualCallCount = 0;
const cb = async () => {
actualCallCount++;
return new Promise((resolve, reject) => {
setTimeout(
() => {
if (actualCallCount < expectedCallCount) {
return reject(new Error("Not yet"));
}
return resolve(expectedResult);
},
100,
);
});
};
const assetRetryDuration = startAssetRetryDuration(expectedCallCount);
const actualResult = await retry(cb, defaultOptions);
assetRetryDuration();
assertEquals(actualCallCount, expectedCallCount);
assertEquals(actualResult, expectedResult);
});