1- import { render , waitFor } from '@testing-library/svelte'
2- import { describe , expect , test , vi } from 'vitest'
1+ import { render } from '@testing-library/svelte'
2+ import { afterEach , beforeEach , describe , expect , test , vi } from 'vitest'
33import { QueryClient } from '@tanstack/svelte-query'
44import { persistQueryClientSave } from '@tanstack/query-persist-client-core'
55import { sleep } from '@tanstack/query-test-utils'
@@ -17,6 +17,14 @@ import type {
1717} from '@tanstack/query-persist-client-core'
1818import type { StatusResult } from './utils.svelte.js'
1919
20+ beforeEach ( ( ) => {
21+ vi . useFakeTimers ( )
22+ } )
23+
24+ afterEach ( ( ) => {
25+ vi . useRealTimers ( )
26+ } )
27+
2028const createMockPersister = ( ) : Persister => {
2129 let storedState : PersistedClient | undefined
2230
@@ -25,7 +33,7 @@ const createMockPersister = (): Persister => {
2533 storedState = persistClient
2634 } ,
2735 async restoreClient ( ) {
28- return Promise . resolve ( storedState )
36+ return sleep ( 10 ) . then ( ( ) => storedState )
2937 } ,
3038 removeClient ( ) {
3139 storedState = undefined
@@ -44,7 +52,7 @@ const createMockErrorPersister = (
4452 // noop
4553 } ,
4654 async restoreClient ( ) {
47- return Promise . reject ( error )
55+ return sleep ( 10 ) . then ( ( ) => Promise . reject ( error ) )
4856 } ,
4957 removeClient,
5058 } ,
@@ -56,14 +64,16 @@ describe('PersistQueryClientProvider', () => {
5664 const states = new StatelessRef < Array < StatusResult < string > > > ( [ ] )
5765
5866 const queryClient = new QueryClient ( )
59- await queryClient . prefetchQuery ( {
67+ queryClient . prefetchQuery ( {
6068 queryKey : [ 'test' ] ,
61- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
69+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
6270 } )
71+ await vi . advanceTimersByTimeAsync ( 10 )
6372
6473 const persister = createMockPersister ( )
6574
66- await persistQueryClientSave ( { queryClient, persister } )
75+ persistQueryClientSave ( { queryClient, persister } )
76+ await vi . advanceTimersByTimeAsync ( 0 )
6777
6878 queryClient . clear ( )
6979
@@ -75,9 +85,11 @@ describe('PersistQueryClientProvider', () => {
7585 } ,
7686 } )
7787
78- await waitFor ( ( ) => rendered . getByText ( 'fetchStatus: idle' ) )
79- await waitFor ( ( ) => rendered . getByText ( 'hydrated' ) )
80- await waitFor ( ( ) => rendered . getByText ( 'fetched' ) )
88+ expect ( rendered . getByText ( 'fetchStatus: idle' ) ) . toBeInTheDocument ( )
89+ await vi . advanceTimersByTimeAsync ( 10 )
90+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
91+ await vi . advanceTimersByTimeAsync ( 10 )
92+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
8193
8294 expect ( states . current ) . toHaveLength ( 3 )
8395
@@ -104,14 +116,16 @@ describe('PersistQueryClientProvider', () => {
104116 const states = new StatelessRef < Array < StatusResult < string > > > ( [ ] )
105117
106118 const queryClient = new QueryClient ( )
107- await queryClient . prefetchQuery ( {
119+ queryClient . prefetchQuery ( {
108120 queryKey : [ 'test' ] ,
109- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
121+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
110122 } )
123+ await vi . advanceTimersByTimeAsync ( 10 )
111124
112125 const persister = createMockPersister ( )
113126
114- await persistQueryClientSave ( { queryClient, persister } )
127+ persistQueryClientSave ( { queryClient, persister } )
128+ await vi . advanceTimersByTimeAsync ( 0 )
115129
116130 queryClient . clear ( )
117131
@@ -123,9 +137,11 @@ describe('PersistQueryClientProvider', () => {
123137 } ,
124138 } )
125139
126- await waitFor ( ( ) => rendered . getByText ( 'fetchStatus: idle' ) )
127- await waitFor ( ( ) => rendered . getByText ( 'hydrated' ) )
128- await waitFor ( ( ) => rendered . getByText ( 'fetched' ) )
140+ expect ( rendered . getByText ( 'fetchStatus: idle' ) ) . toBeInTheDocument ( )
141+ await vi . advanceTimersByTimeAsync ( 10 )
142+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
143+ await vi . advanceTimersByTimeAsync ( 10 )
144+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
129145
130146 expect ( states . current ) . toHaveLength ( 3 )
131147
@@ -152,14 +168,16 @@ describe('PersistQueryClientProvider', () => {
152168 const states = new StatelessRef < Array < StatusResult < string > > > ( [ ] )
153169
154170 const queryClient = new QueryClient ( )
155- await queryClient . prefetchQuery ( {
171+ queryClient . prefetchQuery ( {
156172 queryKey : [ 'test' ] ,
157- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
173+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
158174 } )
175+ await vi . advanceTimersByTimeAsync ( 10 )
159176
160177 const persister = createMockPersister ( )
161178
162- await persistQueryClientSave ( { queryClient, persister } )
179+ persistQueryClientSave ( { queryClient, persister } )
180+ await vi . advanceTimersByTimeAsync ( 0 )
163181
164182 queryClient . clear ( )
165183
@@ -171,9 +189,11 @@ describe('PersistQueryClientProvider', () => {
171189 } ,
172190 } )
173191
174- await waitFor ( ( ) => rendered . getByText ( 'initial' ) )
175- await waitFor ( ( ) => rendered . getByText ( 'hydrated' ) )
176- await waitFor ( ( ) => rendered . getByText ( 'fetched' ) )
192+ expect ( rendered . getByText ( 'initial' ) ) . toBeInTheDocument ( )
193+ await vi . advanceTimersByTimeAsync ( 10 )
194+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
195+ await vi . advanceTimersByTimeAsync ( 10 )
196+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
177197
178198 expect ( states . current ) . toHaveLength ( 3 )
179199
@@ -200,35 +220,42 @@ describe('PersistQueryClientProvider', () => {
200220 const states = new StatelessRef < Array < StatusResult < string > > > ( [ ] )
201221
202222 const queryClient = new QueryClient ( )
203- await queryClient . prefetchQuery ( {
223+ queryClient . prefetchQuery ( {
204224 queryKey : [ 'test' ] ,
205- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
225+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
206226 } )
227+ await vi . advanceTimersByTimeAsync ( 10 )
207228
208229 const persister = createMockPersister ( )
209230
210- await persistQueryClientSave ( { queryClient, persister } )
231+ persistQueryClientSave ( { queryClient, persister } )
232+ await vi . advanceTimersByTimeAsync ( 0 )
211233
212234 queryClient . clear ( )
213235
236+ let fetched = false
237+
214238 const rendered = render ( FreshData , {
215239 props : {
216240 queryClient,
217241 persistOptions : { persister } ,
218242 states,
243+ onFetch : ( ) => {
244+ fetched = true
245+ } ,
219246 } ,
220247 } )
221248
222- await waitFor ( ( ) => rendered . getByText ( 'data: undefined' ) )
223- await waitFor ( ( ) => rendered . getByText ( 'data: hydrated' ) )
224- await expect (
225- waitFor ( ( ) => rendered . getByText ( 'data: fetched' ) , {
226- timeout : 100 ,
227- } ) ,
228- ) . rejects . toThrowError ( )
249+ expect ( rendered . getByText ( 'data: null' ) ) . toBeInTheDocument ( )
250+ await vi . advanceTimersByTimeAsync ( 10 )
251+ expect ( rendered . getByText ( 'data: hydrated' ) ) . toBeInTheDocument ( )
252+ await vi . advanceTimersByTimeAsync ( 10 )
253+ expect ( rendered . getByText ( 'data: hydrated' ) ) . toBeInTheDocument ( )
229254
230255 expect ( states . current ) . toHaveLength ( 2 )
231256
257+ expect ( fetched ) . toBe ( false )
258+
232259 expect ( states . current [ 0 ] ) . toMatchObject ( {
233260 status : 'pending' ,
234261 fetchStatus : 'idle' ,
@@ -244,14 +271,16 @@ describe('PersistQueryClientProvider', () => {
244271
245272 test ( 'should call onSuccess after successful restoring' , async ( ) => {
246273 const queryClient = new QueryClient ( )
247- await queryClient . prefetchQuery ( {
274+ queryClient . prefetchQuery ( {
248275 queryKey : [ 'test' ] ,
249- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
276+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
250277 } )
278+ await vi . advanceTimersByTimeAsync ( 10 )
251279
252280 const persister = createMockPersister ( )
253281
254- await persistQueryClientSave ( { queryClient, persister } )
282+ persistQueryClientSave ( { queryClient, persister } )
283+ await vi . advanceTimersByTimeAsync ( 0 )
255284
256285 queryClient . clear ( )
257286
@@ -266,21 +295,25 @@ describe('PersistQueryClientProvider', () => {
266295 } )
267296
268297 expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
269- await waitFor ( ( ) => rendered . getByText ( 'hydrated' ) )
298+ await vi . advanceTimersByTimeAsync ( 10 )
299+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
270300 expect ( onSuccess ) . toHaveBeenCalledTimes ( 1 )
271- await waitFor ( ( ) => rendered . getByText ( 'fetched' ) )
301+ await vi . advanceTimersByTimeAsync ( 10 )
302+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
272303 } )
273304
274305 test ( 'should await onSuccess after successful restoring' , async ( ) => {
275306 const queryClient = new QueryClient ( )
276- await queryClient . prefetchQuery ( {
307+ queryClient . prefetchQuery ( {
277308 queryKey : [ 'test' ] ,
278- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
309+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
279310 } )
311+ await vi . advanceTimersByTimeAsync ( 10 )
280312
281313 const persister = createMockPersister ( )
282314
283- await persistQueryClientSave ( { queryClient, persister } )
315+ persistQueryClientSave ( { queryClient, persister } )
316+ await vi . advanceTimersByTimeAsync ( 0 )
284317
285318 queryClient . clear ( )
286319
@@ -299,8 +332,10 @@ describe('PersistQueryClientProvider', () => {
299332 } ,
300333 } )
301334
302- await waitFor ( ( ) => rendered . getByText ( 'hydrated' ) )
303- await waitFor ( ( ) => rendered . getByText ( 'fetched' ) )
335+ await vi . advanceTimersByTimeAsync ( 15 )
336+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
337+ await vi . advanceTimersByTimeAsync ( 10 )
338+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
304339
305340 expect ( states . current ) . toEqual ( [
306341 'onSuccess' ,
@@ -329,7 +364,9 @@ describe('PersistQueryClientProvider', () => {
329364 props : { queryClient, persistOptions : { persister } , onError, onSuccess } ,
330365 } )
331366
332- await waitFor ( ( ) => rendered . getByText ( 'fetched' ) )
367+ await vi . advanceTimersByTimeAsync ( 10 )
368+ await vi . advanceTimersByTimeAsync ( 10 )
369+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
333370 expect ( removeClient ) . toHaveBeenCalledTimes ( 1 )
334371 expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
335372 expect ( onError ) . toHaveBeenCalledTimes ( 1 )
0 commit comments