@@ -33,6 +33,8 @@ describe('QueryExecutor', () => {
33
33
}
34
34
}
35
35
36
+ const aAbortController = new AbortController ( )
37
+
36
38
it . each ( [
37
39
[ 'bookmarkManager set' , { bookmarkManager : aBookmarkManager } , { bookmarkManager : aBookmarkManager } ] ,
38
40
[ 'bookmarkManager undefined' , { bookmarkManager : undefined } , { bookmarkManager : undefined } ] ,
@@ -41,7 +43,10 @@ describe('QueryExecutor', () => {
41
43
[ 'impersonatedUser set' , { impersonatedUser : 'anUser' } , { impersonatedUser : 'anUser' } ] ,
42
44
[ 'impersonatedUser undefined' , { impersonatedUser : undefined } , { impersonatedUser : undefined } ] ,
43
45
[ 'auth set' , { auth : { scheme : 'none' , credentials : '' } } , { auth : { scheme : 'none' , credentials : '' } } ] ,
44
- [ 'auth undefined' , { auth : undefined } , { auth : undefined } ]
46
+ [ 'auth undefined' , { auth : undefined } , { auth : undefined } ] ,
47
+ [ 'signal set' , { signal : aAbortController . signal } , { } ] ,
48
+ [ 'signal set signal' , { signal : { } as unknown as AbortSignal } , { } ] ,
49
+ [ 'signal undefined' , { signal : undefined } , { } ]
45
50
] ) ( 'should redirect % to the session creation' , async ( _ , executorConfig , expectConfig ) => {
46
51
const { queryExecutor, createSession } = createExecutor ( )
47
52
@@ -208,6 +213,56 @@ describe('QueryExecutor', () => {
208
213
expect ( errorGot ) . toBe ( closeError )
209
214
}
210
215
} )
216
+
217
+ whenAbortSignalIsEventTarget ( ( ) => {
218
+ it ( 'should configure listener and remove at end' , async ( ) => {
219
+ const { queryExecutor, sessionsCreated } = createExecutor ( )
220
+ const controller = new AbortController ( )
221
+ const signal = controller . signal
222
+ // @ts -expect-error
223
+ const addListenerSpy = jest . spyOn ( signal , 'addEventListener' )
224
+ // @ts -expect-error
225
+ const removerListenerSpy = jest . spyOn ( signal , 'removeEventListener' )
226
+
227
+ const promise = queryExecutor . execute ( { ...baseConfig , signal } , 'query' )
228
+
229
+ expect ( addListenerSpy ) . toHaveBeenCalled ( )
230
+ expect ( removerListenerSpy ) . not . toHaveBeenCalled ( )
231
+
232
+ await promise
233
+
234
+ expect ( removerListenerSpy ) . toHaveBeenCalled ( )
235
+
236
+ // Default expectations
237
+ expect ( sessionsCreated . length ) . toBe ( 1 )
238
+ const [ { spyOnExecuteRead } ] = sessionsCreated
239
+ expect ( spyOnExecuteRead ) . toHaveBeenCalled ( )
240
+ } )
241
+
242
+ it ( 'should close session when abort' , async ( ) => {
243
+ const { queryExecutor, sessionsCreated } = createExecutor ( )
244
+ const controller = new AbortController ( )
245
+ const signal = controller . signal
246
+ // @ts -expect-error
247
+ const removerListenerSpy = jest . spyOn ( signal , 'removeEventListener' )
248
+
249
+ const promise = queryExecutor . execute ( { ...baseConfig , signal } , 'query' )
250
+
251
+ controller . abort ( )
252
+
253
+ // Expect to close session
254
+ expect ( sessionsCreated [ 0 ] . session . close ) . toHaveBeenCalled ( )
255
+
256
+ await promise
257
+
258
+ expect ( removerListenerSpy ) . toHaveBeenCalled ( )
259
+
260
+ // Default expectations
261
+ expect ( sessionsCreated . length ) . toBe ( 1 )
262
+ const [ { spyOnExecuteRead } ] = sessionsCreated
263
+ expect ( spyOnExecuteRead ) . toHaveBeenCalled ( )
264
+ } )
265
+ } )
211
266
} )
212
267
213
268
describe ( 'when routing="WRITE"' , ( ) => {
@@ -364,6 +419,56 @@ describe('QueryExecutor', () => {
364
419
expect ( errorGot ) . toBe ( closeError )
365
420
}
366
421
} )
422
+
423
+ whenAbortSignalIsEventTarget ( ( ) => {
424
+ it ( 'should configure listener and remove at end' , async ( ) => {
425
+ const { queryExecutor, sessionsCreated } = createExecutor ( )
426
+ const controller = new AbortController ( )
427
+ const signal = controller . signal
428
+ // @ts -expect-error
429
+ const addListenerSpy = jest . spyOn ( signal , 'addEventListener' )
430
+ // @ts -expect-error
431
+ const removerListenerSpy = jest . spyOn ( signal , 'removeEventListener' )
432
+
433
+ const promise = queryExecutor . execute ( { ...baseConfig , signal } , 'query' )
434
+
435
+ expect ( addListenerSpy ) . toHaveBeenCalled ( )
436
+ expect ( removerListenerSpy ) . not . toHaveBeenCalled ( )
437
+
438
+ await promise
439
+
440
+ expect ( removerListenerSpy ) . toHaveBeenCalled ( )
441
+
442
+ // Default expectations
443
+ expect ( sessionsCreated . length ) . toBe ( 1 )
444
+ const [ { spyOnExecuteWrite } ] = sessionsCreated
445
+ expect ( spyOnExecuteWrite ) . toHaveBeenCalled ( )
446
+ } )
447
+
448
+ it ( 'should close session when abort' , async ( ) => {
449
+ const { queryExecutor, sessionsCreated } = createExecutor ( )
450
+ const controller = new AbortController ( )
451
+ const signal = controller . signal
452
+ // @ts -expect-error
453
+ const removerListenerSpy = jest . spyOn ( signal , 'removeEventListener' )
454
+
455
+ const promise = queryExecutor . execute ( { ...baseConfig , signal } , 'query' )
456
+
457
+ controller . abort ( )
458
+
459
+ // Expect to close session
460
+ expect ( sessionsCreated [ 0 ] . session . close ) . toHaveBeenCalled ( )
461
+
462
+ await promise
463
+
464
+ expect ( removerListenerSpy ) . toHaveBeenCalled ( )
465
+
466
+ // Default expectations
467
+ expect ( sessionsCreated . length ) . toBe ( 1 )
468
+ const [ { spyOnExecuteWrite } ] = sessionsCreated
469
+ expect ( spyOnExecuteWrite ) . toHaveBeenCalled ( )
470
+ } )
471
+ } )
367
472
} )
368
473
369
474
function createExecutor ( {
@@ -455,3 +560,10 @@ describe('QueryExecutor', () => {
455
560
}
456
561
}
457
562
} )
563
+
564
+ function whenAbortSignalIsEventTarget ( fn : ( ) => unknown ) : void {
565
+ // @ts -expect-error AbortSignal doesn't implements EventTarget on this TS Config.
566
+ if ( typeof AbortSignal . prototype . addEventListener === 'function' ) {
567
+ describe ( 'when abort signal is event target' , fn )
568
+ }
569
+ }
0 commit comments