@@ -33,6 +33,8 @@ describe('QueryExecutor', () => {
3333 }
3434 }
3535
36+ const aAbortController = new AbortController ( )
37+
3638 it . each ( [
3739 [ 'bookmarkManager set' , { bookmarkManager : aBookmarkManager } , { bookmarkManager : aBookmarkManager } ] ,
3840 [ 'bookmarkManager undefined' , { bookmarkManager : undefined } , { bookmarkManager : undefined } ] ,
@@ -41,7 +43,10 @@ describe('QueryExecutor', () => {
4143 [ 'impersonatedUser set' , { impersonatedUser : 'anUser' } , { impersonatedUser : 'anUser' } ] ,
4244 [ 'impersonatedUser undefined' , { impersonatedUser : undefined } , { impersonatedUser : undefined } ] ,
4345 [ '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 } , { } ]
4550 ] ) ( 'should redirect % to the session creation' , async ( _ , executorConfig , expectConfig ) => {
4651 const { queryExecutor, createSession } = createExecutor ( )
4752
@@ -208,6 +213,56 @@ describe('QueryExecutor', () => {
208213 expect ( errorGot ) . toBe ( closeError )
209214 }
210215 } )
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+ } )
211266 } )
212267
213268 describe ( 'when routing="WRITE"' , ( ) => {
@@ -364,6 +419,56 @@ describe('QueryExecutor', () => {
364419 expect ( errorGot ) . toBe ( closeError )
365420 }
366421 } )
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+ } )
367472 } )
368473
369474 function createExecutor ( {
@@ -455,3 +560,10 @@ describe('QueryExecutor', () => {
455560 }
456561 }
457562} )
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