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,17 +220,29 @@ 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+
238+ queryClient . setQueryDefaults ( [ 'test' ] , {
239+ queryFn : ( ) =>
240+ sleep ( 10 ) . then ( ( ) => {
241+ fetched = true
242+ return 'fetched'
243+ } ) ,
244+ } )
245+
214246 const rendered = render ( FreshData , {
215247 props : {
216248 queryClient,
@@ -219,16 +251,16 @@ describe('PersistQueryClientProvider', () => {
219251 } ,
220252 } )
221253
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 ( )
254+ expect ( rendered . getByText ( 'data: null' ) ) . toBeInTheDocument ( )
255+ await vi . advanceTimersByTimeAsync ( 10 )
256+ expect ( rendered . getByText ( 'data: hydrated' ) ) . toBeInTheDocument ( )
257+ await vi . advanceTimersByTimeAsync ( 10 )
258+ expect ( rendered . getByText ( 'data: hydrated' ) ) . toBeInTheDocument ( )
229259
230260 expect ( states . current ) . toHaveLength ( 2 )
231261
262+ expect ( fetched ) . toBe ( false )
263+
232264 expect ( states . current [ 0 ] ) . toMatchObject ( {
233265 status : 'pending' ,
234266 fetchStatus : 'idle' ,
@@ -244,14 +276,16 @@ describe('PersistQueryClientProvider', () => {
244276
245277 test ( 'should call onSuccess after successful restoring' , async ( ) => {
246278 const queryClient = new QueryClient ( )
247- await queryClient . prefetchQuery ( {
279+ queryClient . prefetchQuery ( {
248280 queryKey : [ 'test' ] ,
249- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
281+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
250282 } )
283+ await vi . advanceTimersByTimeAsync ( 10 )
251284
252285 const persister = createMockPersister ( )
253286
254- await persistQueryClientSave ( { queryClient, persister } )
287+ persistQueryClientSave ( { queryClient, persister } )
288+ await vi . advanceTimersByTimeAsync ( 0 )
255289
256290 queryClient . clear ( )
257291
@@ -266,21 +300,25 @@ describe('PersistQueryClientProvider', () => {
266300 } )
267301
268302 expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
269- await waitFor ( ( ) => rendered . getByText ( 'hydrated' ) )
303+ await vi . advanceTimersByTimeAsync ( 10 )
304+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
270305 expect ( onSuccess ) . toHaveBeenCalledTimes ( 1 )
271- await waitFor ( ( ) => rendered . getByText ( 'fetched' ) )
306+ await vi . advanceTimersByTimeAsync ( 10 )
307+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
272308 } )
273309
274310 test ( 'should await onSuccess after successful restoring' , async ( ) => {
275311 const queryClient = new QueryClient ( )
276- await queryClient . prefetchQuery ( {
312+ queryClient . prefetchQuery ( {
277313 queryKey : [ 'test' ] ,
278- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
314+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
279315 } )
316+ await vi . advanceTimersByTimeAsync ( 10 )
280317
281318 const persister = createMockPersister ( )
282319
283- await persistQueryClientSave ( { queryClient, persister } )
320+ persistQueryClientSave ( { queryClient, persister } )
321+ await vi . advanceTimersByTimeAsync ( 0 )
284322
285323 queryClient . clear ( )
286324
@@ -299,8 +337,10 @@ describe('PersistQueryClientProvider', () => {
299337 } ,
300338 } )
301339
302- await waitFor ( ( ) => rendered . getByText ( 'hydrated' ) )
303- await waitFor ( ( ) => rendered . getByText ( 'fetched' ) )
340+ await vi . advanceTimersByTimeAsync ( 15 )
341+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
342+ await vi . advanceTimersByTimeAsync ( 10 )
343+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
304344
305345 expect ( states . current ) . toEqual ( [
306346 'onSuccess' ,
@@ -329,7 +369,9 @@ describe('PersistQueryClientProvider', () => {
329369 props : { queryClient, persistOptions : { persister } , onError, onSuccess } ,
330370 } )
331371
332- await waitFor ( ( ) => rendered . getByText ( 'fetched' ) )
372+ await vi . advanceTimersByTimeAsync ( 10 )
373+ await vi . advanceTimersByTimeAsync ( 10 )
374+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
333375 expect ( removeClient ) . toHaveBeenCalledTimes ( 1 )
334376 expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
335377 expect ( onError ) . toHaveBeenCalledTimes ( 1 )
0 commit comments