1- import { describe , expect , test , vi } from 'vitest'
1+ import { afterEach , beforeEach , describe , expect , test , vi } from 'vitest'
22import {
33 QueryClient ,
44 injectQuery ,
@@ -10,14 +10,22 @@ import {
1010 effect ,
1111 provideZonelessChangeDetection ,
1212} from '@angular/core'
13- import { render , screen , waitFor } from '@testing-library/angular'
13+ import { render } from '@testing-library/angular'
1414import { queryKey , sleep } from '@tanstack/query-test-utils'
1515import { withPersistQueryClient } from '../with-persist-query-client'
1616import type {
1717 PersistedClient ,
1818 Persister ,
1919} from '@tanstack/query-persist-client-core'
2020
21+ beforeEach ( ( ) => {
22+ vi . useFakeTimers ( )
23+ } )
24+
25+ afterEach ( ( ) => {
26+ vi . useRealTimers ( )
27+ } )
28+
2129const createMockPersister = ( ) : Persister => {
2230 let storedState : PersistedClient | undefined
2331
@@ -26,8 +34,7 @@ const createMockPersister = (): Persister => {
2634 storedState = persistClient
2735 } ,
2836 async restoreClient ( ) {
29- await sleep ( 10 )
30- return storedState
37+ return sleep ( 10 ) . then ( ( ) => storedState )
3138 } ,
3239 removeClient ( ) {
3340 storedState = undefined
@@ -64,14 +71,16 @@ describe('withPersistQueryClient', () => {
6471 } > = [ ]
6572
6673 const queryClient = new QueryClient ( )
67- await queryClient . prefetchQuery ( {
74+ queryClient . prefetchQuery ( {
6875 queryKey : key ,
69- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
76+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
7077 } )
78+ await vi . advanceTimersByTimeAsync ( 10 )
7179
7280 const persister = createMockPersister ( )
7381
74- await persistQueryClientSave ( { queryClient, persister } )
82+ persistQueryClientSave ( { queryClient, persister } )
83+ await vi . advanceTimersByTimeAsync ( 0 )
7584
7685 queryClient . clear ( )
7786
@@ -86,10 +95,7 @@ describe('withPersistQueryClient', () => {
8695 class Page {
8796 state = injectQuery ( ( ) => ( {
8897 queryKey : key ,
89- queryFn : async ( ) => {
90- await sleep ( 10 )
91- return 'fetched'
92- } ,
98+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
9399 } ) )
94100 _ = effect ( ( ) => {
95101 states . push ( {
@@ -100,7 +106,7 @@ describe('withPersistQueryClient', () => {
100106 } )
101107 }
102108
103- render ( Page , {
109+ const rendered = await render ( Page , {
104110 providers : [
105111 provideZonelessChangeDetection ( ) ,
106112 provideTanStackQuery (
@@ -110,9 +116,14 @@ describe('withPersistQueryClient', () => {
110116 ] ,
111117 } )
112118
113- await waitFor ( ( ) => screen . getByText ( 'fetchStatus: idle' ) )
114- await waitFor ( ( ) => screen . getByText ( 'hydrated' ) )
115- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
119+ expect ( rendered . getByText ( 'fetchStatus: idle' ) ) . toBeInTheDocument ( )
120+ await vi . advanceTimersByTimeAsync ( 10 )
121+ rendered . fixture . detectChanges ( )
122+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
123+
124+ await vi . advanceTimersByTimeAsync ( 11 )
125+ rendered . fixture . detectChanges ( )
126+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
116127
117128 expect ( states ) . toHaveLength ( 3 )
118129
@@ -148,14 +159,16 @@ describe('withPersistQueryClient', () => {
148159 } > = [ ]
149160
150161 const queryClient = new QueryClient ( )
151- await queryClient . prefetchQuery ( {
162+ queryClient . prefetchQuery ( {
152163 queryKey : key ,
153- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
164+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
154165 } )
166+ await vi . advanceTimersByTimeAsync ( 10 )
155167
156168 const persister = createMockPersister ( )
157169
158- await persistQueryClientSave ( { queryClient, persister } )
170+ persistQueryClientSave ( { queryClient, persister } )
171+ await vi . advanceTimersByTimeAsync ( 0 )
159172
160173 queryClient . clear ( )
161174
@@ -170,10 +183,7 @@ describe('withPersistQueryClient', () => {
170183 class Page {
171184 state = injectQuery ( ( ) => ( {
172185 queryKey : key ,
173- queryFn : async ( ) => {
174- await sleep ( 10 )
175- return 'fetched'
176- } ,
186+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
177187 initialData : 'initial' ,
178188 // make sure that initial data is older than the hydration data
179189 // otherwise initialData would be newer and takes precedence
@@ -188,7 +198,7 @@ describe('withPersistQueryClient', () => {
188198 } )
189199 }
190200
191- render ( Page , {
201+ const rendered = await render ( Page , {
192202 providers : [
193203 provideZonelessChangeDetection ( ) ,
194204 provideTanStackQuery (
@@ -198,7 +208,14 @@ describe('withPersistQueryClient', () => {
198208 ] ,
199209 } )
200210
201- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
211+ expect ( rendered . getByText ( 'initial' ) ) . toBeInTheDocument ( )
212+ await vi . advanceTimersByTimeAsync ( 10 )
213+ rendered . fixture . detectChanges ( )
214+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
215+
216+ await vi . advanceTimersByTimeAsync ( 11 )
217+ rendered . fixture . detectChanges ( )
218+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
202219
203220 expect ( states ) . toHaveLength ( 3 )
204221
@@ -230,14 +247,16 @@ describe('withPersistQueryClient', () => {
230247 } > = [ ]
231248
232249 const queryClient = new QueryClient ( )
233- await queryClient . prefetchQuery ( {
250+ queryClient . prefetchQuery ( {
234251 queryKey : key ,
235- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
252+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
236253 } )
254+ await vi . advanceTimersByTimeAsync ( 10 )
237255
238256 const persister = createMockPersister ( )
239257
240- await persistQueryClientSave ( { queryClient, persister } )
258+ persistQueryClientSave ( { queryClient, persister } )
259+ await vi . advanceTimersByTimeAsync ( 0 )
241260
242261 queryClient . clear ( )
243262
@@ -255,8 +274,8 @@ describe('withPersistQueryClient', () => {
255274 state = injectQuery ( ( ) => ( {
256275 queryKey : key ,
257276 queryFn : async ( ) => {
258- fetched = true
259277 await sleep ( 10 )
278+ fetched = true
260279 return 'fetched'
261280 } ,
262281 staleTime : Infinity ,
@@ -270,7 +289,7 @@ describe('withPersistQueryClient', () => {
270289 } )
271290 }
272291
273- render ( Page , {
292+ const rendered = await render ( Page , {
274293 providers : [
275294 provideZonelessChangeDetection ( ) ,
276295 provideTanStackQuery (
@@ -280,8 +299,10 @@ describe('withPersistQueryClient', () => {
280299 ] ,
281300 } )
282301
283- await waitFor ( ( ) => screen . getByText ( 'data: null' ) )
284- await waitFor ( ( ) => screen . getByText ( 'data: hydrated' ) )
302+ expect ( rendered . getByText ( 'data: null' ) ) . toBeInTheDocument ( )
303+ await vi . advanceTimersByTimeAsync ( 10 )
304+ rendered . fixture . detectChanges ( )
305+ expect ( rendered . getByText ( 'data: hydrated' ) ) . toBeInTheDocument ( )
285306
286307 expect ( states ) . toHaveLength ( 2 )
287308
@@ -303,13 +324,15 @@ describe('withPersistQueryClient', () => {
303324 test ( 'should call onSuccess after successful restoring' , async ( ) => {
304325 const key = queryKey ( )
305326 const queryClient = new QueryClient ( )
306- await queryClient . prefetchQuery ( {
327+ queryClient . prefetchQuery ( {
307328 queryKey : key ,
308- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
329+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
309330 } )
331+ await vi . advanceTimersByTimeAsync ( 10 )
310332
311333 const persister = createMockPersister ( )
312- await persistQueryClientSave ( { queryClient, persister } )
334+ persistQueryClientSave ( { queryClient, persister } )
335+ await vi . advanceTimersByTimeAsync ( 0 )
313336
314337 queryClient . clear ( )
315338
@@ -324,16 +347,13 @@ describe('withPersistQueryClient', () => {
324347 class Page {
325348 state = injectQuery ( ( ) => ( {
326349 queryKey : key ,
327- queryFn : async ( ) => {
328- await sleep ( 10 )
329- return 'fetched'
330- } ,
350+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
331351 } ) )
332352 }
333353
334354 const onSuccess = vi . fn ( )
335355
336- render ( Page , {
356+ const rendered = await render ( Page , {
337357 providers : [
338358 provideZonelessChangeDetection ( ) ,
339359 provideTanStackQuery (
@@ -347,8 +367,14 @@ describe('withPersistQueryClient', () => {
347367 } )
348368
349369 expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
350- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
370+ await vi . advanceTimersByTimeAsync ( 10 )
371+ rendered . fixture . detectChanges ( )
372+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
351373 expect ( onSuccess ) . toHaveBeenCalledTimes ( 1 )
374+
375+ await vi . advanceTimersByTimeAsync ( 11 )
376+ rendered . fixture . detectChanges ( )
377+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
352378 } )
353379
354380 test ( 'should remove cache after non-successful restoring' , async ( ) => {
@@ -373,14 +399,11 @@ describe('withPersistQueryClient', () => {
373399 class Page {
374400 state = injectQuery ( ( ) => ( {
375401 queryKey : key ,
376- queryFn : async ( ) => {
377- await sleep ( 10 )
378- return 'fetched'
379- } ,
402+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
380403 } ) )
381404 }
382405
383- render ( Page , {
406+ const rendered = await render ( Page , {
384407 providers : [
385408 provideZonelessChangeDetection ( ) ,
386409 provideTanStackQuery (
@@ -394,11 +417,16 @@ describe('withPersistQueryClient', () => {
394417 ] ,
395418 } )
396419
397- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
420+ await vi . advanceTimersByTimeAsync ( 10 )
421+ rendered . fixture . detectChanges ( )
398422 expect ( removeClient ) . toHaveBeenCalledTimes ( 1 )
399423 expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
400424 expect ( onError ) . toHaveBeenCalledTimes ( 1 )
401425
426+ await vi . advanceTimersByTimeAsync ( 11 )
427+ rendered . fixture . detectChanges ( )
428+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
429+
402430 expect ( onErrorMock ) . toHaveBeenCalledTimes ( 1 )
403431 expect ( onErrorMock ) . toHaveBeenNthCalledWith ( 1 , error )
404432 onErrorMock . mockRestore ( )
0 commit comments