1- import { afterAll , beforeAll , describe , expect , it , vi } from 'vitest'
1+ import { afterEach , beforeEach , describe , expect , it , vi } from 'vitest'
22import * as React from 'react'
33import { ErrorBoundary } from 'react-error-boundary'
44import {
55 createRenderStream ,
66 useTrackRenders ,
77} from '@testing-library/react-render-stream'
8- import { queryKey } from '@tanstack/query-test-utils'
9- import { waitFor } from '@testing-library/react'
8+ import { queryKey , sleep } from '@tanstack/query-test-utils'
109import {
1110 QueryClient ,
1211 QueryClientProvider ,
@@ -18,26 +17,26 @@ import {
1817import { QueryCache } from '../index'
1918
2019describe ( 'useQuery().promise' , { timeout : 10_000 } , ( ) => {
21- const queryCache = new QueryCache ( )
22- const queryClient = new QueryClient ( {
23- queryCache,
24- } )
20+ let queryCache : QueryCache
21+ let queryClient : QueryClient
2522
26- beforeAll ( ( ) => {
23+ beforeEach ( ( ) => {
2724 vi . useFakeTimers ( {
2825 shouldAdvanceTime : true ,
2926 toFake : [ 'setTimeout' , 'clearTimeout' , 'setInterval' , 'clearInterval' ] ,
3027 } )
31- queryClient . setDefaultOptions ( {
32- queries : { experimental_prefetchInRender : true } ,
28+ queryCache = new QueryCache ( )
29+ queryClient = new QueryClient ( {
30+ queryCache,
31+ defaultOptions : {
32+ queries : { experimental_prefetchInRender : true } ,
33+ } ,
3334 } )
3435 } )
3536
36- afterAll ( ( ) => {
37+ afterEach ( ( ) => {
3738 vi . useRealTimers ( )
38- queryClient . setDefaultOptions ( {
39- queries : { experimental_prefetchInRender : false } ,
40- } )
39+ queryClient . clear ( )
4140 } )
4241
4342 it ( 'should work with a basic test' , async ( ) => {
@@ -60,10 +59,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
6059 useTrackRenders ( )
6160 const query = useQuery ( {
6261 queryKey : key ,
63- queryFn : async ( ) => {
64- await vi . advanceTimersByTimeAsync ( 1 )
65- return 'test'
66- } ,
62+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'test' ) ,
6763 } )
6864
6965 return (
@@ -107,7 +103,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
107103 queryKey : key ,
108104 queryFn : async ( ) => {
109105 callCount ++
110- await vi . advanceTimersByTimeAsync ( 1 )
106+ await sleep ( 10 )
111107 return 'test'
112108 } ,
113109 staleTime : 1000 ,
@@ -161,7 +157,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
161157 queryKey : key ,
162158 queryFn : async ( ) => {
163159 callCount ++
164- await vi . advanceTimersByTimeAsync ( 1 )
160+ await sleep ( 10 )
165161 return 'test'
166162 } ,
167163 staleTime : 1000 ,
@@ -238,10 +234,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
238234 useTrackRenders ( )
239235 const query = useQuery ( {
240236 queryKey : key ,
241- queryFn : async ( ) => {
242- await vi . advanceTimersByTimeAsync ( 1 )
243- return 'test'
244- } ,
237+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'test' ) ,
245238 initialData : 'initial' ,
246239 } )
247240
@@ -274,10 +267,9 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
274267 it ( 'should not fetch with initial data and staleTime' , async ( ) => {
275268 const key = queryKey ( )
276269 const renderStream = createRenderStream ( { snapshotDOM : true } )
277- const queryFn = vi . fn ( ) . mockImplementation ( async ( ) => {
278- await vi . advanceTimersByTimeAsync ( 1 )
279- return 'test'
280- } )
270+ const queryFn = vi
271+ . fn ( )
272+ . mockImplementation ( ( ) => sleep ( 10 ) . then ( ( ) => 'test' ) )
281273
282274 function MyComponent ( props : { promise : Promise < string > } ) {
283275 useTrackRenders ( )
@@ -339,10 +331,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
339331 function Page ( ) {
340332 const query = useQuery ( {
341333 queryKey : key ,
342- queryFn : async ( ) => {
343- await vi . advanceTimersByTimeAsync ( 1 )
344- return 'test'
345- } ,
334+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'test' ) ,
346335 placeholderData : 'placeholder' ,
347336 } )
348337 useTrackRenders ( )
@@ -392,10 +381,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
392381 const [ count , setCount ] = React . useState ( 0 )
393382 const query = useQuery ( {
394383 queryKey : [ ...key , count ] ,
395- queryFn : async ( ) => {
396- await vi . advanceTimersByTimeAsync ( 1 )
397- return 'test-' + count
398- } ,
384+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'test-' + count ) ,
399385 placeholderData : keepPreviousData ,
400386 } )
401387
@@ -461,10 +447,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
461447 function Page ( ) {
462448 const query = useQuery ( {
463449 queryKey : key ,
464- queryFn : async ( ) => {
465- await vi . advanceTimersByTimeAsync ( 1 )
466- return { name : 'test' }
467- } ,
450+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => ( { name : 'test' } ) ) ,
468451 select : ( data ) => data . name ,
469452 } )
470453
@@ -517,7 +500,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
517500 const query = useQuery ( {
518501 queryKey : key ,
519502 queryFn : async ( ) => {
520- await vi . advanceTimersByTimeAsync ( 1 )
503+ await sleep ( 10 )
521504 if ( ++ queryCount > 1 ) {
522505 // second time this query mounts, it should not throw
523506 return 'data'
@@ -598,10 +581,8 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
598581 function MyComponent ( ) {
599582 const query = useQuery ( {
600583 queryKey : key ,
601- queryFn : async ( ) => {
602- await vi . advanceTimersByTimeAsync ( 1 )
603- throw new Error ( 'Error test' )
604- } ,
584+ queryFn : ( ) =>
585+ sleep ( 10 ) . then ( ( ) => Promise . reject ( new Error ( 'Error test' ) ) ) ,
605586 retry : false ,
606587 } )
607588 const data = React . use ( query . promise )
@@ -656,10 +637,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
656637 function Page ( ) {
657638 const query = useQuery ( {
658639 queryKey : key ,
659- queryFn : async ( ) => {
660- await vi . advanceTimersByTimeAsync ( 1 )
661- return 'test1'
662- } ,
640+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'test1' ) ,
663641 } )
664642
665643 useTrackRenders ( )
@@ -700,10 +678,9 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
700678 it ( 'should dedupe when re-fetched with queryClient.fetchQuery while suspending' , async ( ) => {
701679 const key = queryKey ( )
702680 const renderStream = createRenderStream ( { snapshotDOM : true } )
703- const queryFn = vi . fn ( ) . mockImplementation ( async ( ) => {
704- await vi . advanceTimersByTimeAsync ( 10 )
705- return 'test'
706- } )
681+ const queryFn = vi
682+ . fn ( )
683+ . mockImplementation ( ( ) => sleep ( 10 ) . then ( ( ) => 'test' ) )
707684
708685 const options = {
709686 queryKey : key ,
@@ -757,10 +734,9 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
757734 const key = queryKey ( )
758735 let count = 0
759736 const renderStream = createRenderStream ( { snapshotDOM : true } )
760- const queryFn = vi . fn ( ) . mockImplementation ( async ( ) => {
761- await vi . advanceTimersByTimeAsync ( 10 )
762- return 'test' + count ++
763- } )
737+ const queryFn = vi
738+ . fn ( )
739+ . mockImplementation ( ( ) => sleep ( 10 ) . then ( ( ) => 'test' + count ++ ) )
764740
765741 const options = {
766742 queryKey : key ,
@@ -817,7 +793,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
817793 const key = queryKey ( )
818794 let count = 0
819795 const queryFn = vi . fn ( ) . mockImplementation ( async ( ) => {
820- await vi . advanceTimersByTimeAsync ( 10 )
796+ await sleep ( 10 )
821797 return 'test' + count ++
822798 } )
823799
@@ -891,10 +867,9 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
891867 it ( 'should resolve to previous data when canceled with cancelQueries while suspending' , async ( ) => {
892868 const renderStream = createRenderStream ( { snapshotDOM : true } )
893869 const key = queryKey ( )
894- const queryFn = vi . fn ( ) . mockImplementation ( async ( ) => {
895- await vi . advanceTimersByTimeAsync ( 10 )
896- return 'test'
897- } )
870+ const queryFn = vi
871+ . fn ( )
872+ . mockImplementation ( ( ) => sleep ( 10 ) . then ( ( ) => 'test' ) )
898873
899874 const options = {
900875 queryKey : key ,
@@ -954,10 +929,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
954929
955930 const options = ( count : number ) => ( {
956931 queryKey : [ ...key , count ] ,
957- queryFn : async ( ) => {
958- await vi . advanceTimersByTimeAsync ( 10 )
959- return 'test' + count
960- } ,
932+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'test' + count ) ,
961933 } )
962934
963935 function MyComponent ( props : { promise : Promise < string > } ) {
@@ -1010,10 +982,9 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
1010982 const renderStream = createRenderStream ( { snapshotDOM : true } )
1011983 queryClient . setQueryData ( key , 'initial' )
1012984
1013- const queryFn = vi . fn ( ) . mockImplementation ( async ( ) => {
1014- await vi . advanceTimersByTimeAsync ( 1 )
1015- return 'test'
1016- } )
985+ const queryFn = vi
986+ . fn ( )
987+ . mockImplementation ( ( ) => sleep ( 10 ) . then ( ( ) => 'test' ) )
1017988
1018989 function MyComponent ( props : { promise : Promise < string > } ) {
1019990 const data = React . use ( props . promise )
@@ -1072,10 +1043,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
10721043 const [ count , setCount ] = React . useState ( 0 )
10731044 const query = useQuery ( {
10741045 queryKey : [ key , count ] ,
1075- queryFn : async ( ) => {
1076- await vi . advanceTimersByTimeAsync ( 10 )
1077- return 'test' + count
1078- } ,
1046+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'test' + count ) ,
10791047 staleTime : Infinity ,
10801048 } )
10811049
@@ -1152,10 +1120,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
11521120 const [ count , setCount ] = React . useState ( 0 )
11531121 const query = useQuery ( {
11541122 queryKey : [ key , count ] ,
1155- queryFn : async ( ) => {
1156- await vi . advanceTimersByTimeAsync ( 10 )
1157- return 'test' + count
1158- } ,
1123+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'test' + count ) ,
11591124 staleTime : Infinity ,
11601125 } )
11611126
@@ -1228,10 +1193,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
12281193 const [ count , setCount ] = React . useState ( 0 )
12291194 const query = useQuery ( {
12301195 queryKey : [ key , count ] ,
1231- queryFn : async ( ) => {
1232- await vi . advanceTimersByTimeAsync ( 10 )
1233- return 'test' + count + modifier
1234- } ,
1196+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'test' + count + modifier ) ,
12351197 } )
12361198
12371199 return (
@@ -1291,24 +1253,16 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
12911253 modifier = 'new'
12921254
12931255 rendered . getByText ( 'dec' ) . click ( )
1294- {
1295- const { snapshot } = await renderStream . takeRender ( )
1296- expect ( snapshot ) . toMatchObject ( { data : 'test3' } )
1297- }
1256+ await vi . advanceTimersByTimeAsync ( 11 )
1257+ expect ( rendered . getByText ( 'test2new' ) ) . toBeInTheDocument ( )
12981258
12991259 rendered . getByText ( 'dec' ) . click ( )
1300- {
1301- const { snapshot } = await renderStream . takeRender ( )
1302- expect ( snapshot ) . toMatchObject ( { data : 'test3' } )
1303- }
1260+ await vi . advanceTimersByTimeAsync ( 11 )
1261+ expect ( rendered . getByText ( 'test1new' ) ) . toBeInTheDocument ( )
13041262
13051263 rendered . getByText ( 'dec' ) . click ( )
1306- {
1307- const { snapshot } = await renderStream . takeRender ( )
1308- expect ( snapshot ) . toMatchObject ( { data : 'test0' } )
1309- }
1310-
1311- await waitFor ( ( ) => rendered . getByText ( 'test0new' ) )
1264+ await vi . advanceTimersByTimeAsync ( 11 )
1265+ expect ( rendered . getByText ( 'test0new' ) ) . toBeInTheDocument ( )
13121266 } )
13131267
13141268 it ( 'should not suspend indefinitely with multiple, nested observers)' , async ( ) => {
@@ -1326,10 +1280,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
13261280 return useQuery ( {
13271281 staleTime : Infinity ,
13281282 queryKey : [ key , input ] ,
1329- queryFn : async ( ) => {
1330- await vi . advanceTimersByTimeAsync ( 1 )
1331- return input + ' response'
1332- } ,
1283+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => input + ' response' ) ,
13331284 } )
13341285 }
13351286
@@ -1400,10 +1351,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
14001351 useTrackRenders ( )
14011352 const query = useInfiniteQuery ( {
14021353 queryKey : key ,
1403- queryFn : async ( ) => {
1404- await vi . advanceTimersByTimeAsync ( 1 )
1405- return { nextCursor : 1 , data : 'test' }
1406- } ,
1354+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => ( { nextCursor : 1 , data : 'test' } ) ) ,
14071355 initialPageParam : 0 ,
14081356 getNextPageParam : ( lastPage ) => lastPage . nextCursor ,
14091357 } )
@@ -1446,7 +1394,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
14461394 const query = useInfiniteQuery ( {
14471395 queryKey : key ,
14481396 queryFn : async ( { pageParam = 0 } ) => {
1449- await vi . advanceTimersByTimeAsync ( 1 )
1397+ await sleep ( 10 )
14501398 if ( pageParam === 0 ) {
14511399 return { nextCursor : 1 , data : 'page-1' }
14521400 }
@@ -1494,13 +1442,9 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
14941442 }
14951443
14961444 rendered . getByText ( 'fetchNext' ) . click ( )
1497- await vi . advanceTimersByTimeAsync ( 1 )
1445+ await vi . advanceTimersByTimeAsync ( 11 )
14981446
1499- await waitFor ( ( ) => {
1500- expect (
1501- rendered . getByText ( 'isFetchNextPageError:true' ) ,
1502- ) . toBeInTheDocument ( )
1503- } )
1447+ expect ( rendered . getByText ( 'isFetchNextPageError:true' ) ) . toBeInTheDocument ( )
15041448
15051449 expect ( rendered . queryByText ( 'error boundary' ) ) . toBeNull ( )
15061450 } )
0 commit comments