1
- import { RetryQueue } from "../src/retry -queue" ;
1
+ import PQueue from "p -queue" ;
2
2
3
3
describe ( "RetryQueue" , ( ) => {
4
- let queue : RetryQueue ;
5
-
6
4
beforeEach ( ( ) => {
7
- queue = new RetryQueue ( ) ;
8
5
jest . useRealTimers ( ) ;
9
6
} ) ;
10
7
11
8
test ( "should process tasks in order of priority" , async ( ) => {
9
+ // Force sequential execution by overriding concurrency limit
10
+ const queue = new PQueue ( { concurrency : 1 , autoStart : false } ) ;
11
+
12
12
jest . useFakeTimers ( ) ;
13
13
let executionOrder : number [ ] = [ ] ;
14
14
15
- // Force sequential execution by overriding concurrency limit
16
- // @ts -ignore - accessing private property for testing
17
- queue [ "concurrencyLimit" ] = 1 ;
18
-
19
15
// Create three tasks with different priorities
20
16
const task1 = jest . fn ( ) . mockImplementation ( async ( ) => {
21
17
executionOrder . push ( 1 ) ;
@@ -33,9 +29,12 @@ describe("RetryQueue", () => {
33
29
} ) ;
34
30
35
31
// Set up promises to track task completion
36
- const promise2 = queue . enqueue ( task2 , 2 ) ;
37
- const promise3 = queue . enqueue ( task3 , 3 ) ;
38
- const promise1 = queue . enqueue ( task1 , 1 ) ;
32
+ const promise1 = queue . add ( task2 , { priority : 2 } ) ;
33
+ const promise2 = queue . add ( task3 , { priority : 1 } ) ;
34
+ const promise3 = queue . add ( task1 , { priority : 3 } ) ;
35
+
36
+ // Start the queue
37
+ queue . start ( ) ;
39
38
40
39
// Advance timers to allow the sorting to complete
41
40
jest . advanceTimersByTime ( 10 ) ;
@@ -59,13 +58,18 @@ describe("RetryQueue", () => {
59
58
} ) ;
60
59
61
60
test ( "should handle task failures correctly" , async ( ) => {
61
+ const queue = new PQueue ( { concurrency : 3 , autoStart : false } ) ;
62
+
62
63
const successTask = jest . fn ( ) . mockResolvedValue ( "success" ) ;
63
64
const failureTask = jest . fn ( ) . mockRejectedValue ( new Error ( "Task failed" ) ) ;
64
65
65
- const successPromise = queue . enqueue ( successTask , 1 ) ;
66
- const failurePromise = queue . enqueue ( failureTask , 2 ) ;
66
+ const successPromise = queue . add ( successTask , { priority : 2 } ) ;
67
+ const failurePromise = queue . add ( failureTask , { priority : 1 } ) ;
68
+
69
+ // Start the queue
70
+ queue . start ( ) ;
67
71
68
- // Success task should resolve
72
+ // Succes, priority: task should resolve
69
73
await expect ( successPromise ) . resolves . toBe ( "success" ) ;
70
74
71
75
// Failure task should reject
@@ -76,6 +80,8 @@ describe("RetryQueue", () => {
76
80
} ) ;
77
81
78
82
test ( "should respect concurrency limit" , async ( ) => {
83
+ const queue = new PQueue ( { concurrency : 3 , autoStart : false } ) ;
84
+
79
85
// Create a mock implementation to track concurrent execution
80
86
let concurrentCount = 0 ;
81
87
let maxConcurrentCount = 0 ;
@@ -97,9 +103,12 @@ describe("RetryQueue", () => {
97
103
// Queue multiple slow tasks
98
104
const promises = [ ] ;
99
105
for ( let i = 0 ; i < 10 ; i ++ ) {
100
- promises . push ( queue . enqueue ( createTask ( 10 ) , ( i % 3 ) + 1 ) ) ; // Vary priority
106
+ promises . push ( queue . add ( createTask ( 10 ) , { priority : i + 1 } ) ) ;
101
107
}
102
108
109
+ // Start the queue
110
+ queue . start ( ) ;
111
+
103
112
// Wait for all tasks to complete
104
113
await Promise . all ( promises ) ;
105
114
@@ -109,10 +118,9 @@ describe("RetryQueue", () => {
109
118
} ) ;
110
119
111
120
test ( "should continue processing queue after task completion" , async ( ) => {
121
+ const queue = new PQueue ( { concurrency : 1 , autoStart : false } ) ;
122
+
112
123
jest . useFakeTimers ( ) ;
113
- // Force sequential execution
114
- // @ts -ignore - accessing private property for testing
115
- queue [ "concurrencyLimit" ] = 1 ;
116
124
117
125
const executionOrder : number [ ] = [ ] ;
118
126
@@ -135,9 +143,12 @@ describe("RetryQueue", () => {
135
143
} ;
136
144
137
145
// Enqueue tasks
138
- const promise1 = queue . enqueue ( slowTask , 1 ) ; // Higher priority
139
- const promise2 = queue . enqueue ( fastTask1 , 2 ) ;
140
- const promise3 = queue . enqueue ( fastTask2 , 3 ) ;
146
+ const promise1 = queue . add ( slowTask , { priority : 3 } ) ; // Higher priority
147
+ const promise2 = queue . add ( fastTask1 , { priority : 2 } ) ;
148
+ const promise3 = queue . add ( fastTask2 , { priority : 1 } ) ;
149
+
150
+ // Start the queue
151
+ queue . start ( ) ;
141
152
142
153
// Advance timers to allow sorting to complete
143
154
jest . advanceTimersByTime ( 10 ) ;
@@ -156,18 +167,18 @@ describe("RetryQueue", () => {
156
167
} ) ;
157
168
158
169
test ( "should handle empty queue gracefully" , async ( ) => {
170
+ const queue = new PQueue ( { concurrency : 3 } ) ;
159
171
// Just make sure no errors are thrown
160
172
expect ( ( ) => {
161
173
// @ts -ignore - accessing private method for testing
162
- queue . processQueue ( ) ;
174
+ queue . start ( ) ;
163
175
} ) . not . toThrow ( ) ;
164
176
} ) ;
165
177
166
178
test ( "should handle many tasks with same priority in order of addition" , async ( ) => {
179
+ const queue = new PQueue ( { concurrency : 1 , autoStart : false } ) ;
180
+
167
181
jest . useFakeTimers ( ) ;
168
- // Force sequential execution
169
- // @ts -ignore - accessing private property for testing
170
- queue [ "concurrencyLimit" ] = 1 ;
171
182
172
183
const executionOrder : number [ ] = [ ] ;
173
184
@@ -182,9 +193,12 @@ describe("RetryQueue", () => {
182
193
// Queue tasks with same priority
183
194
const promises = [ ] ;
184
195
for ( let i = 1 ; i <= 5 ; i ++ ) {
185
- promises . push ( queue . enqueue ( createNumberedTask ( i ) , 1 ) ) ; // All same priority
196
+ promises . push ( queue . add ( createNumberedTask ( i ) , { priority : 1 } ) ) ;
186
197
}
187
198
199
+ // Start the queue
200
+ queue . start ( ) ;
201
+
188
202
// Advance timers to allow sorting to complete
189
203
jest . advanceTimersByTime ( 10 ) ;
190
204
@@ -202,20 +216,28 @@ describe("RetryQueue", () => {
202
216
} ) ;
203
217
204
218
test ( "should handle large number of tasks efficiently" , async ( ) => {
219
+ const queue = new PQueue ( { concurrency : 3 , autoStart : false } ) ;
220
+
205
221
const taskCount = 50 ; // Reduced for faster test execution
206
222
const completedTasks : number [ ] = [ ] ;
207
223
208
224
// Create many tasks
209
225
const promises = [ ] ;
210
226
for ( let i = 0 ; i < taskCount ; i ++ ) {
211
227
promises . push (
212
- queue . enqueue ( async ( ) => {
213
- completedTasks . push ( i ) ;
214
- return i ;
215
- } , i % 10 ) // Cycle through 10 priority levels
216
- ) ;
228
+ queue . add (
229
+ async ( ) => {
230
+ completedTasks . push ( i ) ;
231
+ return i ;
232
+ } ,
233
+ { priority : i }
234
+ )
235
+ ) ; // Cycle through 10 priority levels
217
236
}
218
237
238
+ // Start the queue
239
+ queue . start ( ) ;
240
+
219
241
// Wait for all tasks to complete
220
242
await Promise . all ( promises ) ;
221
243
0 commit comments