1- import { describe , expect , test , vi } from 'vitest'
2- import { render , screen , waitFor } from '@solidjs/testing-library'
1+ import { afterEach , beforeEach , describe , expect , test , vi } from 'vitest'
2+ import { render , screen } from '@solidjs/testing-library'
33import { QueryClient , useQueries , useQuery } from '@tanstack/solid-query'
44import { persistQueryClientSave } from '@tanstack/query-persist-client-core'
55import { createEffect , createSignal , onMount } from 'solid-js'
@@ -18,8 +18,7 @@ const createMockPersister = (): Persister => {
1818 storedState = persistClient
1919 } ,
2020 async restoreClient ( ) {
21- await sleep ( 10 )
22- return storedState
21+ return sleep ( 10 ) . then ( ( ) => storedState )
2322 } ,
2423 removeClient ( ) {
2524 storedState = undefined
@@ -47,6 +46,14 @@ const createMockErrorPersister = (
4746}
4847
4948describe ( 'PersistQueryClientProvider' , ( ) => {
49+ beforeEach ( ( ) => {
50+ vi . useFakeTimers ( )
51+ } )
52+
53+ afterEach ( ( ) => {
54+ vi . useRealTimers ( )
55+ } )
56+
5057 test ( 'restores cache from persister' , async ( ) => {
5158 const key = queryKey ( )
5259 const states : Array < {
@@ -56,24 +63,23 @@ describe('PersistQueryClientProvider', () => {
5663 } > = [ ]
5764
5865 const queryClient = new QueryClient ( )
59- await queryClient . prefetchQuery ( {
66+ queryClient . prefetchQuery ( {
6067 queryKey : key ,
61- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
68+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
6269 } )
70+ await vi . advanceTimersByTimeAsync ( 10 )
6371
6472 const persister = createMockPersister ( )
6573
66- await persistQueryClientSave ( { queryClient, persister } )
74+ persistQueryClientSave ( { queryClient, persister } )
75+ await vi . advanceTimersByTimeAsync ( 0 )
6776
6877 queryClient . clear ( )
6978
7079 function Page ( ) {
7180 const state = useQuery ( ( ) => ( {
7281 queryKey : key ,
73- queryFn : async ( ) => {
74- await sleep ( 10 )
75- return 'fetched'
76- } ,
82+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
7783 } ) )
7884 createEffect ( ( ) =>
7985 states . push ( {
@@ -100,9 +106,11 @@ describe('PersistQueryClientProvider', () => {
100106 </ PersistQueryClientProvider >
101107 ) )
102108
103- await waitFor ( ( ) => screen . getByText ( 'fetchStatus: idle' ) )
104- await waitFor ( ( ) => screen . getByText ( 'hydrated' ) )
105- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
109+ expect ( screen . getByText ( 'fetchStatus: idle' ) ) . toBeInTheDocument ( )
110+ await vi . advanceTimersByTimeAsync ( 10 )
111+ expect ( screen . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
112+ await vi . advanceTimersByTimeAsync ( 10 )
113+ expect ( screen . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
106114
107115 expect ( states ) . toHaveLength ( 3 )
108116
@@ -134,14 +142,16 @@ describe('PersistQueryClientProvider', () => {
134142 } > = [ ]
135143
136144 const queryClient = new QueryClient ( )
137- await queryClient . prefetchQuery ( {
145+ queryClient . prefetchQuery ( {
138146 queryKey : key ,
139- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
147+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
140148 } )
149+ await vi . advanceTimersByTimeAsync ( 10 )
141150
142151 const persister = createMockPersister ( )
143152
144- await persistQueryClientSave ( { queryClient, persister } )
153+ persistQueryClientSave ( { queryClient, persister } )
154+ await vi . advanceTimersByTimeAsync ( 0 )
145155
146156 queryClient . clear ( )
147157
@@ -150,12 +160,9 @@ describe('PersistQueryClientProvider', () => {
150160 queries : [
151161 {
152162 queryKey : key ,
153- queryFn : async ( ) : Promise < string > => {
154- await sleep ( 10 )
155- return 'fetched'
156- } ,
163+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
157164 } ,
158- ] as const ,
165+ ] ,
159166 } ) )
160167
161168 createEffect ( ( ) =>
@@ -183,9 +190,11 @@ describe('PersistQueryClientProvider', () => {
183190 </ PersistQueryClientProvider >
184191 ) )
185192
186- await waitFor ( ( ) => screen . getByText ( 'fetchStatus: idle' ) )
187- await waitFor ( ( ) => screen . getByText ( 'hydrated' ) )
188- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
193+ expect ( screen . getByText ( 'fetchStatus: idle' ) ) . toBeInTheDocument ( )
194+ await vi . advanceTimersByTimeAsync ( 10 )
195+ expect ( screen . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
196+ await vi . advanceTimersByTimeAsync ( 10 )
197+ expect ( screen . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
189198
190199 expect ( states ) . toHaveLength ( 3 )
191200
@@ -217,24 +226,23 @@ describe('PersistQueryClientProvider', () => {
217226 } > = [ ]
218227
219228 const queryClient = new QueryClient ( )
220- await queryClient . prefetchQuery ( {
229+ queryClient . prefetchQuery ( {
221230 queryKey : key ,
222- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
231+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
223232 } )
233+ await vi . advanceTimersByTimeAsync ( 10 )
224234
225235 const persister = createMockPersister ( )
226236
227- await persistQueryClientSave ( { queryClient, persister } )
237+ persistQueryClientSave ( { queryClient, persister } )
238+ await vi . advanceTimersByTimeAsync ( 0 )
228239
229240 queryClient . clear ( )
230241
231242 function Page ( ) {
232243 const state = useQuery ( ( ) => ( {
233244 queryKey : key ,
234- queryFn : async ( ) => {
235- await sleep ( 10 )
236- return 'fetched'
237- } ,
245+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
238246 initialData : 'initial' ,
239247 // make sure that initial data is older than the hydration data
240248 // otherwise initialData would be newer and takes precedence
@@ -266,9 +274,11 @@ describe('PersistQueryClientProvider', () => {
266274 </ PersistQueryClientProvider >
267275 ) )
268276
269- await waitFor ( ( ) => screen . getByText ( 'initial' ) )
270- await waitFor ( ( ) => screen . getByText ( 'hydrated' ) )
271- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
277+ expect ( screen . getByText ( 'initial' ) ) . toBeInTheDocument ( )
278+ await vi . advanceTimersByTimeAsync ( 10 )
279+ expect ( screen . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
280+ await vi . advanceTimersByTimeAsync ( 10 )
281+ expect ( screen . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
272282
273283 expect ( states ) . toHaveLength ( 3 )
274284
@@ -300,14 +310,16 @@ describe('PersistQueryClientProvider', () => {
300310 } > = [ ]
301311
302312 const queryClient = new QueryClient ( )
303- await queryClient . prefetchQuery ( {
313+ queryClient . prefetchQuery ( {
304314 queryKey : key ,
305- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
315+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
306316 } )
317+ await vi . advanceTimersByTimeAsync ( 10 )
307318
308319 const persister = createMockPersister ( )
309320
310- await persistQueryClientSave ( { queryClient, persister } )
321+ persistQueryClientSave ( { queryClient, persister } )
322+ await vi . advanceTimersByTimeAsync ( 0 )
311323
312324 queryClient . clear ( )
313325
@@ -316,11 +328,11 @@ describe('PersistQueryClientProvider', () => {
316328 function Page ( ) {
317329 const state = useQuery ( ( ) => ( {
318330 queryKey : key ,
319- queryFn : async ( ) => {
320- fetched = true
321- await sleep ( 10 )
322- return 'fetched'
323- } ,
331+ queryFn : ( ) =>
332+ sleep ( 10 ) . then ( ( ) => {
333+ fetched = true
334+ return 'fetched'
335+ } ) ,
324336 staleTime : Infinity ,
325337 } ) )
326338
@@ -349,13 +361,16 @@ describe('PersistQueryClientProvider', () => {
349361 </ PersistQueryClientProvider >
350362 ) )
351363
352- await waitFor ( ( ) => screen . getByText ( 'data: null' ) )
353- await waitFor ( ( ) => screen . getByText ( 'data: hydrated' ) )
354-
355- expect ( states ) . toHaveLength ( 2 )
364+ expect ( screen . getByText ( 'data: null' ) ) . toBeInTheDocument ( )
365+ await vi . advanceTimersByTimeAsync ( 10 )
366+ expect ( screen . getByText ( 'data: hydrated' ) ) . toBeInTheDocument ( )
367+ await vi . advanceTimersByTimeAsync ( 10 )
368+ expect ( screen . getByText ( 'data: hydrated' ) ) . toBeInTheDocument ( )
356369
357370 expect ( fetched ) . toBe ( false )
358371
372+ expect ( states ) . toHaveLength ( 2 )
373+
359374 expect ( states [ 0 ] ) . toMatchObject ( {
360375 status : 'pending' ,
361376 fetchStatus : 'idle' ,
@@ -373,24 +388,23 @@ describe('PersistQueryClientProvider', () => {
373388 const key = queryKey ( )
374389
375390 const queryClient = new QueryClient ( )
376- await queryClient . prefetchQuery ( {
391+ queryClient . prefetchQuery ( {
377392 queryKey : key ,
378- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
393+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
379394 } )
395+ await vi . advanceTimersByTimeAsync ( 10 )
380396
381397 const persister = createMockPersister ( )
382398
383- await persistQueryClientSave ( { queryClient, persister } )
399+ persistQueryClientSave ( { queryClient, persister } )
400+ await vi . advanceTimersByTimeAsync ( 0 )
384401
385402 queryClient . clear ( )
386403
387404 function Page ( ) {
388405 const state = useQuery ( ( ) => ( {
389406 queryKey : key ,
390- queryFn : async ( ) => {
391- await sleep ( 10 )
392- return 'fetched'
393- } ,
407+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
394408 } ) )
395409
396410 return (
@@ -412,11 +426,13 @@ describe('PersistQueryClientProvider', () => {
412426 < Page />
413427 </ PersistQueryClientProvider >
414428 ) )
415- expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
416429
417- await waitFor ( ( ) => screen . getByText ( 'hydrated' ) )
430+ expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
431+ await vi . advanceTimersByTimeAsync ( 10 )
432+ expect ( screen . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
418433 expect ( onSuccess ) . toHaveBeenCalledTimes ( 1 )
419- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
434+ await vi . advanceTimersByTimeAsync ( 10 )
435+ expect ( screen . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
420436 } )
421437
422438 test ( 'should remove cache after non-successful restoring' , async ( ) => {
@@ -435,10 +451,7 @@ describe('PersistQueryClientProvider', () => {
435451 function Page ( ) {
436452 const state = useQuery ( ( ) => ( {
437453 queryKey : key ,
438- queryFn : async ( ) => {
439- await sleep ( 10 )
440- return 'fetched'
441- } ,
454+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
442455 } ) )
443456
444457 return (
@@ -460,10 +473,12 @@ describe('PersistQueryClientProvider', () => {
460473 </ PersistQueryClientProvider >
461474 ) )
462475
463- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
476+ await vi . advanceTimersByTimeAsync ( 10 )
464477 expect ( removeClient ) . toHaveBeenCalledTimes ( 1 )
465478 expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
466479 expect ( onError ) . toHaveBeenCalledTimes ( 1 )
480+ await vi . advanceTimersByTimeAsync ( 10 )
481+ expect ( screen . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
467482
468483 expect ( onErrorMock ) . toHaveBeenCalledTimes ( 1 )
469484 expect ( onErrorMock ) . toHaveBeenNthCalledWith ( 1 , error )
@@ -479,27 +494,27 @@ describe('PersistQueryClientProvider', () => {
479494 } > = [ ]
480495
481496 const queryClient = new QueryClient ( )
482- await queryClient . prefetchQuery ( {
497+ queryClient . prefetchQuery ( {
483498 queryKey : key ,
484- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
499+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
485500 } )
501+ await vi . advanceTimersByTimeAsync ( 10 )
486502
487503 const persister = createMockPersister ( )
488504
489- await persistQueryClientSave ( { queryClient, persister } )
505+ persistQueryClientSave ( { queryClient, persister } )
506+ await vi . advanceTimersByTimeAsync ( 0 )
490507
491508 queryClient . clear ( )
492509
493510 const onSuccess = vi . fn ( )
494511
495- const queryFn1 = vi . fn ( ) . mockImplementation ( async ( ) => {
496- await sleep ( 10 )
497- return 'queryFn1'
498- } )
499- const queryFn2 = vi . fn ( ) . mockImplementation ( async ( ) => {
500- await sleep ( 10 )
501- return 'queryFn2'
502- } )
512+ const queryFn1 = vi
513+ . fn ( )
514+ . mockImplementation ( ( ) => sleep ( 10 ) . then ( ( ) => 'queryFn1' ) )
515+ const queryFn2 = vi
516+ . fn ( )
517+ . mockImplementation ( ( ) => sleep ( 10 ) . then ( ( ) => 'queryFn2' ) )
503518
504519 function App ( ) {
505520 const [ client , setClient ] = createSignal (
@@ -556,8 +571,8 @@ describe('PersistQueryClientProvider', () => {
556571
557572 render ( ( ) => < App /> )
558573
559- await waitFor ( ( ) => screen . getByText ( 'hydrated' ) )
560- await waitFor ( ( ) => screen . getByText ( 'queryFn2' ) )
574+ await vi . advanceTimersByTimeAsync ( 10 )
575+ expect ( screen . getByText ( 'queryFn2' ) ) . toBeInTheDocument ( )
561576
562577 expect ( queryFn1 ) . toHaveBeenCalledTimes ( 0 )
563578 expect ( queryFn2 ) . toHaveBeenCalledTimes ( 1 )
0 commit comments