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
@@ -317,8 +329,8 @@ describe('PersistQueryClientProvider', () => {
317329 const state = useQuery ( ( ) => ( {
318330 queryKey : key ,
319331 queryFn : async ( ) => {
320- fetched = true
321332 await sleep ( 10 )
333+ fetched = true
322334 return 'fetched'
323335 } ,
324336 staleTime : Infinity ,
@@ -349,13 +361,15 @@ describe('PersistQueryClientProvider', () => {
349361 </ PersistQueryClientProvider >
350362 ) )
351363
352- await waitFor ( ( ) => screen . getByText ( 'data: null' ) )
353- await waitFor ( ( ) => screen . getByText ( 'data: hydrated' ) )
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 ( )
369+ expect ( fetched ) . toBe ( false )
354370
355371 expect ( states ) . toHaveLength ( 2 )
356372
357- expect ( fetched ) . toBe ( false )
358-
359373 expect ( states [ 0 ] ) . toMatchObject ( {
360374 status : 'pending' ,
361375 fetchStatus : 'idle' ,
@@ -373,24 +387,23 @@ describe('PersistQueryClientProvider', () => {
373387 const key = queryKey ( )
374388
375389 const queryClient = new QueryClient ( )
376- await queryClient . prefetchQuery ( {
390+ queryClient . prefetchQuery ( {
377391 queryKey : key ,
378- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
392+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
379393 } )
394+ await vi . advanceTimersByTimeAsync ( 10 )
380395
381396 const persister = createMockPersister ( )
382397
383- await persistQueryClientSave ( { queryClient, persister } )
398+ persistQueryClientSave ( { queryClient, persister } )
399+ await vi . advanceTimersByTimeAsync ( 0 )
384400
385401 queryClient . clear ( )
386402
387403 function Page ( ) {
388404 const state = useQuery ( ( ) => ( {
389405 queryKey : key ,
390- queryFn : async ( ) => {
391- await sleep ( 10 )
392- return 'fetched'
393- } ,
406+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
394407 } ) )
395408
396409 return (
@@ -412,11 +425,13 @@ describe('PersistQueryClientProvider', () => {
412425 < Page />
413426 </ PersistQueryClientProvider >
414427 ) )
415- expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
416428
417- await waitFor ( ( ) => screen . getByText ( 'hydrated' ) )
429+ expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
430+ await vi . advanceTimersByTimeAsync ( 10 )
431+ expect ( screen . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
418432 expect ( onSuccess ) . toHaveBeenCalledTimes ( 1 )
419- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
433+ await vi . advanceTimersByTimeAsync ( 10 )
434+ expect ( screen . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
420435 } )
421436
422437 test ( 'should remove cache after non-successful restoring' , async ( ) => {
@@ -435,10 +450,7 @@ describe('PersistQueryClientProvider', () => {
435450 function Page ( ) {
436451 const state = useQuery ( ( ) => ( {
437452 queryKey : key ,
438- queryFn : async ( ) => {
439- await sleep ( 10 )
440- return 'fetched'
441- } ,
453+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
442454 } ) )
443455
444456 return (
@@ -460,10 +472,12 @@ describe('PersistQueryClientProvider', () => {
460472 </ PersistQueryClientProvider >
461473 ) )
462474
463- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
475+ await vi . advanceTimersByTimeAsync ( 10 )
464476 expect ( removeClient ) . toHaveBeenCalledTimes ( 1 )
465477 expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
466478 expect ( onError ) . toHaveBeenCalledTimes ( 1 )
479+ await vi . advanceTimersByTimeAsync ( 10 )
480+ expect ( screen . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
467481
468482 expect ( onErrorMock ) . toHaveBeenCalledTimes ( 1 )
469483 expect ( onErrorMock ) . toHaveBeenNthCalledWith ( 1 , error )
@@ -479,27 +493,27 @@ describe('PersistQueryClientProvider', () => {
479493 } > = [ ]
480494
481495 const queryClient = new QueryClient ( )
482- await queryClient . prefetchQuery ( {
496+ queryClient . prefetchQuery ( {
483497 queryKey : key ,
484- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
498+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
485499 } )
500+ await vi . advanceTimersByTimeAsync ( 10 )
486501
487502 const persister = createMockPersister ( )
488503
489- await persistQueryClientSave ( { queryClient, persister } )
504+ persistQueryClientSave ( { queryClient, persister } )
505+ await vi . advanceTimersByTimeAsync ( 0 )
490506
491507 queryClient . clear ( )
492508
493509 const onSuccess = vi . fn ( )
494510
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- } )
511+ const queryFn1 = vi
512+ . fn ( )
513+ . mockImplementation ( ( ) => sleep ( 10 ) . then ( ( ) => 'queryFn1' ) )
514+ const queryFn2 = vi
515+ . fn ( )
516+ . mockImplementation ( ( ) => sleep ( 10 ) . then ( ( ) => 'queryFn2' ) )
503517
504518 function App ( ) {
505519 const [ client , setClient ] = createSignal (
@@ -556,8 +570,8 @@ describe('PersistQueryClientProvider', () => {
556570
557571 render ( ( ) => < App /> )
558572
559- await waitFor ( ( ) => screen . getByText ( 'hydrated' ) )
560- await waitFor ( ( ) => screen . getByText ( 'queryFn2' ) )
573+ await vi . advanceTimersByTimeAsync ( 10 )
574+ expect ( screen . getByText ( 'queryFn2' ) ) . toBeInTheDocument ( )
561575
562576 expect ( queryFn1 ) . toHaveBeenCalledTimes ( 0 )
563577 expect ( queryFn2 ) . toHaveBeenCalledTimes ( 1 )
0 commit comments