@@ -44,9 +44,7 @@ const api = createApi({
44
44
}
45
45
46
46
return {
47
- data : arg ?. body
48
- ? { ...arg . body , ...( amount ? { amount } : { } ) }
49
- : undefined ,
47
+ data : arg ?. body ? { ...arg . body , ...( amount ? { amount } : { } ) } : { } ,
50
48
}
51
49
} ,
52
50
endpoints : ( build ) => ( {
@@ -146,16 +144,20 @@ describe('hooks tests', () => {
146
144
} )
147
145
148
146
test ( 'useQuery hook sets isLoading=true only on initial request' , async ( ) => {
149
- let refetch : any , isLoading : boolean
147
+ let refetch : any , isLoading : boolean , isFetching : boolean
150
148
function User ( ) {
151
149
const [ value , setValue ] = React . useState ( 0 )
152
150
153
- ; ( { isLoading, refetch } = api . endpoints . getUser . useQuery ( 2 , {
154
- skip : value < 1 ,
155
- } ) )
151
+ ; ( { isLoading, isFetching, refetch } = api . endpoints . getUser . useQuery (
152
+ 2 ,
153
+ {
154
+ skip : value < 1 ,
155
+ }
156
+ ) )
156
157
return (
157
158
< div >
158
159
< div data-testid = "isLoading" > { String ( isLoading ) } </ div >
160
+ < div data-testid = "isFetching" > { String ( isFetching ) } </ div >
159
161
< button onClick = { ( ) => setValue ( ( val ) => val + 1 ) } >
160
162
Increment value
161
163
</ button >
@@ -182,14 +184,12 @@ describe('hooks tests', () => {
182
184
await waitFor ( ( ) =>
183
185
expect ( screen . getByTestId ( 'isLoading' ) . textContent ) . toBe ( 'false' )
184
186
)
185
- // We call a refetch, should set to true
187
+ // We call a refetch, should still be `false`
186
188
act ( ( ) => refetch ( ) )
187
189
await waitFor ( ( ) =>
188
- expect ( screen . getByTestId ( 'isLoading' ) . textContent ) . toBe ( 'true' )
189
- )
190
- await waitFor ( ( ) =>
191
- expect ( screen . getByTestId ( 'isLoading' ) . textContent ) . toBe ( 'false' )
190
+ expect ( screen . getByTestId ( 'isFetching' ) . textContent ) . toBe ( 'true' )
192
191
)
192
+ expect ( screen . getByTestId ( 'isLoading' ) . textContent ) . toBe ( 'false' )
193
193
} )
194
194
195
195
test ( 'useQuery hook sets isLoading and isFetching to the correct states' , async ( ) => {
@@ -240,10 +240,10 @@ describe('hooks tests', () => {
240
240
} )
241
241
expect ( getRenderCount ( ) ) . toBe ( 5 )
242
242
243
- // We call a refetch, should set both to true, then false when complete/errored
243
+ // We call a refetch, should set `isFetching` to true, then false when complete/errored
244
244
act ( ( ) => refetchMe ( ) )
245
245
await waitFor ( ( ) => {
246
- expect ( screen . getByTestId ( 'isLoading' ) . textContent ) . toBe ( 'true ' )
246
+ expect ( screen . getByTestId ( 'isLoading' ) . textContent ) . toBe ( 'false ' )
247
247
expect ( screen . getByTestId ( 'isFetching' ) . textContent ) . toBe ( 'true' )
248
248
} )
249
249
await waitFor ( ( ) => {
@@ -253,6 +253,42 @@ describe('hooks tests', () => {
253
253
expect ( getRenderCount ( ) ) . toBe ( 7 )
254
254
} )
255
255
256
+ test ( '`isLoading` does not jump back to true, while `isFetching` does' , async ( ) => {
257
+ const loadingHist : boolean [ ] = [ ] ,
258
+ fetchingHist : boolean [ ] = [ ]
259
+
260
+ function User ( { id } : { id : number } ) {
261
+ const { isLoading, isFetching, status } =
262
+ api . endpoints . getUser . useQuery ( id )
263
+
264
+ React . useEffect ( ( ) => {
265
+ loadingHist . push ( isLoading )
266
+ } , [ isLoading ] )
267
+ React . useEffect ( ( ) => {
268
+ fetchingHist . push ( isFetching )
269
+ } , [ isFetching ] )
270
+ return (
271
+ < div data-testid = "status" >
272
+ { status === QueryStatus . fulfilled && id }
273
+ </ div >
274
+ )
275
+ }
276
+
277
+ let { rerender } = render ( < User id = { 1 } /> , { wrapper : storeRef . wrapper } )
278
+
279
+ await waitFor ( ( ) =>
280
+ expect ( screen . getByTestId ( 'status' ) . textContent ) . toBe ( '1' )
281
+ )
282
+ rerender ( < User id = { 2 } /> )
283
+
284
+ await waitFor ( ( ) =>
285
+ expect ( screen . getByTestId ( 'status' ) . textContent ) . toBe ( '2' )
286
+ )
287
+
288
+ expect ( loadingHist ) . toEqual ( [ true , false ] )
289
+ expect ( fetchingHist ) . toEqual ( [ true , false , true , false ] )
290
+ } )
291
+
256
292
test ( 'useQuery hook respects refetchOnMountOrArgChange: true' , async ( ) => {
257
293
let data , isLoading , isFetching
258
294
function User ( ) {
@@ -903,7 +939,7 @@ describe('hooks tests', () => {
903
939
expect (
904
940
api . endpoints . getUser . select ( USER_ID ) ( storeRef . store . getState ( ) as any )
905
941
) . toEqual ( {
906
- data : undefined ,
942
+ data : { } ,
907
943
endpointName : 'getUser' ,
908
944
error : undefined ,
909
945
fulfilledTimeStamp : expect . any ( Number ) ,
@@ -924,7 +960,7 @@ describe('hooks tests', () => {
924
960
expect (
925
961
api . endpoints . getUser . select ( USER_ID ) ( storeRef . store . getState ( ) as any )
926
962
) . toEqual ( {
927
- data : undefined ,
963
+ data : { } ,
928
964
endpointName : 'getUser' ,
929
965
fulfilledTimeStamp : expect . any ( Number ) ,
930
966
isError : false ,
@@ -972,7 +1008,7 @@ describe('hooks tests', () => {
972
1008
expect (
973
1009
api . endpoints . getUser . select ( USER_ID ) ( storeRef . store . getState ( ) as any )
974
1010
) . toEqual ( {
975
- data : undefined ,
1011
+ data : { } ,
976
1012
endpointName : 'getUser' ,
977
1013
fulfilledTimeStamp : expect . any ( Number ) ,
978
1014
isError : false ,
@@ -990,7 +1026,7 @@ describe('hooks tests', () => {
990
1026
expect (
991
1027
api . endpoints . getUser . select ( USER_ID ) ( storeRef . store . getState ( ) as any )
992
1028
) . toEqual ( {
993
- data : undefined ,
1029
+ data : { } ,
994
1030
endpointName : 'getUser' ,
995
1031
fulfilledTimeStamp : expect . any ( Number ) ,
996
1032
isError : false ,
@@ -1040,7 +1076,7 @@ describe('hooks tests', () => {
1040
1076
expect (
1041
1077
api . endpoints . getUser . select ( USER_ID ) ( storeRef . store . getState ( ) as any )
1042
1078
) . toEqual ( {
1043
- data : undefined ,
1079
+ data : { } ,
1044
1080
endpointName : 'getUser' ,
1045
1081
fulfilledTimeStamp : expect . any ( Number ) ,
1046
1082
isError : false ,
@@ -1060,7 +1096,7 @@ describe('hooks tests', () => {
1060
1096
expect (
1061
1097
api . endpoints . getUser . select ( USER_ID ) ( storeRef . store . getState ( ) as any )
1062
1098
) . toEqual ( {
1063
- data : undefined ,
1099
+ data : { } ,
1064
1100
endpointName : 'getUser' ,
1065
1101
fulfilledTimeStamp : expect . any ( Number ) ,
1066
1102
isError : false ,
0 commit comments