11import { createSlice } from '@reduxjs/toolkit'
22import { createApi , fetchBaseQuery } from '@reduxjs/toolkit/query'
3- import { setupApiStore } from './helpers'
3+ import { setupApiStore , waitMs } from './helpers'
44import { server } from './mocks/server'
55// @ts -ignore
66import nodeFetch from 'node-fetch'
@@ -76,8 +76,12 @@ type RootState = ReturnType<typeof storeRef.store.getState>
7676
7777let commonBaseQueryApi : BaseQueryApi = { } as any
7878beforeEach ( ( ) => {
79+ let abortController = new AbortController ( )
7980 commonBaseQueryApi = {
80- signal : new AbortController ( ) . signal ,
81+ signal : abortController . signal ,
82+ abort : ( reason ) =>
83+ // @ts -ignore
84+ abortController . abort ( reason ) ,
8185 dispatch : storeRef . store . dispatch ,
8286 getState : storeRef . store . getState ,
8387 extra : undefined ,
@@ -513,11 +517,15 @@ describe('fetchBaseQuery', () => {
513517 test ( 'prepareHeaders is able to select from a state' , async ( ) => {
514518 let request : any
515519
516- const doRequest = async ( ) =>
517- baseQuery (
520+ const doRequest = async ( ) => {
521+ const abortController = new AbortController ( )
522+ return baseQuery (
518523 { url : '/echo' } ,
519524 {
520- signal : new AbortController ( ) . signal ,
525+ signal : abortController . signal ,
526+ abort : ( reason ) =>
527+ // @ts -ignore
528+ abortController . abort ( reason ) ,
521529 dispatch : storeRef . store . dispatch ,
522530 getState : storeRef . store . getState ,
523531 extra : undefined ,
@@ -526,6 +534,7 @@ describe('fetchBaseQuery', () => {
526534 } ,
527535 { }
528536 )
537+ }
529538
530539 ; ( { data : request } = await doRequest ( ) )
531540
@@ -563,11 +572,15 @@ describe('fetchBaseQuery', () => {
563572 getTokenSilently : async ( ) => 'fakeToken' ,
564573 }
565574
566- const doRequest = async ( ) =>
567- baseQuery (
575+ const doRequest = async ( ) => {
576+ const abortController = new AbortController ( )
577+ return baseQuery (
568578 { url : '/echo' } ,
569579 {
570- signal : new AbortController ( ) . signal ,
580+ signal : abortController . signal ,
581+ abort : ( reason ) =>
582+ // @ts -ignore
583+ abortController . abort ( reason ) ,
571584 dispatch : storeRef . store . dispatch ,
572585 getState : storeRef . store . getState ,
573586 extra : fakeAuth0Client ,
@@ -577,6 +590,7 @@ describe('fetchBaseQuery', () => {
577590 } ,
578591 { }
579592 )
593+ }
580594
581595 await doRequest ( )
582596
@@ -709,4 +723,29 @@ describe('still throws on completely unexpected errors', () => {
709723 expect ( req ) . toBeInstanceOf ( Promise )
710724 await expect ( req ) . rejects . toBe ( error )
711725 } )
726+
727+ test ( 'timeout behaviour' , async ( ) => {
728+ jest . useFakeTimers ( )
729+ let result : any
730+ server . use (
731+ rest . get ( 'https://example.com/empty' , ( req , res , ctx ) =>
732+ res . once (
733+ ctx . delay ( 3000 ) ,
734+ ctx . json ( { ...req , headers : req . headers . all ( ) } )
735+ )
736+ )
737+ )
738+ Promise . resolve (
739+ baseQuery ( { url : '/empty' , timeout : 2000 } , commonBaseQueryApi , { } )
740+ ) . then ( ( r ) => {
741+ result = r
742+ } )
743+ await waitMs ( )
744+ jest . runAllTimers ( )
745+ await waitMs ( )
746+ expect ( result ?. error ) . toEqual ( {
747+ status : 'TIMEOUT_ERROR' ,
748+ error : 'AbortError: The user aborted a request.' ,
749+ } )
750+ } )
712751} )
0 commit comments