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
@@ -64,14 +72,16 @@ describe('withPersistQueryClient', () => {
6472 } > = [ ]
6573
6674 const queryClient = new QueryClient ( )
67- await queryClient . prefetchQuery ( {
75+ queryClient . prefetchQuery ( {
6876 queryKey : key ,
69- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
77+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
7078 } )
79+ await vi . advanceTimersByTimeAsync ( 10 )
7180
7281 const persister = createMockPersister ( )
7382
74- await persistQueryClientSave ( { queryClient, persister } )
83+ persistQueryClientSave ( { queryClient, persister } )
84+ await vi . advanceTimersByTimeAsync ( 0 )
7585
7686 queryClient . clear ( )
7787
@@ -86,10 +96,7 @@ describe('withPersistQueryClient', () => {
8696 class Page {
8797 state = injectQuery ( ( ) => ( {
8898 queryKey : key ,
89- queryFn : async ( ) => {
90- await sleep ( 10 )
91- return 'fetched'
92- } ,
99+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
93100 } ) )
94101 _ = effect ( ( ) => {
95102 states . push ( {
@@ -100,7 +107,7 @@ describe('withPersistQueryClient', () => {
100107 } )
101108 }
102109
103- render ( Page , {
110+ const rendered = await render ( Page , {
104111 providers : [
105112 provideZonelessChangeDetection ( ) ,
106113 provideTanStackQuery (
@@ -110,9 +117,14 @@ describe('withPersistQueryClient', () => {
110117 ] ,
111118 } )
112119
113- await waitFor ( ( ) => screen . getByText ( 'fetchStatus: idle' ) )
114- await waitFor ( ( ) => screen . getByText ( 'hydrated' ) )
115- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
120+ expect ( rendered . getByText ( 'fetchStatus: idle' ) ) . toBeInTheDocument ( )
121+ await vi . advanceTimersByTimeAsync ( 10 )
122+ rendered . fixture . detectChanges ( )
123+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
124+
125+ await vi . advanceTimersByTimeAsync ( 11 )
126+ rendered . fixture . detectChanges ( )
127+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
116128
117129 expect ( states ) . toHaveLength ( 3 )
118130
@@ -148,14 +160,16 @@ describe('withPersistQueryClient', () => {
148160 } > = [ ]
149161
150162 const queryClient = new QueryClient ( )
151- await queryClient . prefetchQuery ( {
163+ queryClient . prefetchQuery ( {
152164 queryKey : key ,
153- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
165+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
154166 } )
167+ await vi . advanceTimersByTimeAsync ( 10 )
155168
156169 const persister = createMockPersister ( )
157170
158- await persistQueryClientSave ( { queryClient, persister } )
171+ persistQueryClientSave ( { queryClient, persister } )
172+ await vi . advanceTimersByTimeAsync ( 0 )
159173
160174 queryClient . clear ( )
161175
@@ -170,10 +184,7 @@ describe('withPersistQueryClient', () => {
170184 class Page {
171185 state = injectQuery ( ( ) => ( {
172186 queryKey : key ,
173- queryFn : async ( ) => {
174- await sleep ( 10 )
175- return 'fetched'
176- } ,
187+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
177188 initialData : 'initial' ,
178189 // make sure that initial data is older than the hydration data
179190 // otherwise initialData would be newer and takes precedence
@@ -188,7 +199,7 @@ describe('withPersistQueryClient', () => {
188199 } )
189200 }
190201
191- render ( Page , {
202+ const rendered = await render ( Page , {
192203 providers : [
193204 provideZonelessChangeDetection ( ) ,
194205 provideTanStackQuery (
@@ -198,7 +209,14 @@ describe('withPersistQueryClient', () => {
198209 ] ,
199210 } )
200211
201- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
212+ expect ( rendered . getByText ( 'initial' ) ) . toBeInTheDocument ( )
213+ await vi . advanceTimersByTimeAsync ( 10 )
214+ rendered . fixture . detectChanges ( )
215+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
216+
217+ await vi . advanceTimersByTimeAsync ( 11 )
218+ rendered . fixture . detectChanges ( )
219+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
202220
203221 expect ( states ) . toHaveLength ( 3 )
204222
@@ -230,14 +248,16 @@ describe('withPersistQueryClient', () => {
230248 } > = [ ]
231249
232250 const queryClient = new QueryClient ( )
233- await queryClient . prefetchQuery ( {
251+ queryClient . prefetchQuery ( {
234252 queryKey : key ,
235- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
253+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
236254 } )
255+ await vi . advanceTimersByTimeAsync ( 10 )
237256
238257 const persister = createMockPersister ( )
239258
240- await persistQueryClientSave ( { queryClient, persister } )
259+ persistQueryClientSave ( { queryClient, persister } )
260+ await vi . advanceTimersByTimeAsync ( 0 )
241261
242262 queryClient . clear ( )
243263
@@ -255,8 +275,8 @@ describe('withPersistQueryClient', () => {
255275 state = injectQuery ( ( ) => ( {
256276 queryKey : key ,
257277 queryFn : async ( ) => {
258- fetched = true
259278 await sleep ( 10 )
279+ fetched = true
260280 return 'fetched'
261281 } ,
262282 staleTime : Infinity ,
@@ -270,7 +290,7 @@ describe('withPersistQueryClient', () => {
270290 } )
271291 }
272292
273- render ( Page , {
293+ const rendered = await render ( Page , {
274294 providers : [
275295 provideZonelessChangeDetection ( ) ,
276296 provideTanStackQuery (
@@ -280,8 +300,10 @@ describe('withPersistQueryClient', () => {
280300 ] ,
281301 } )
282302
283- await waitFor ( ( ) => screen . getByText ( 'data: null' ) )
284- await waitFor ( ( ) => screen . getByText ( 'data: hydrated' ) )
303+ expect ( rendered . getByText ( 'data: null' ) ) . toBeInTheDocument ( )
304+ await vi . advanceTimersByTimeAsync ( 10 )
305+ rendered . fixture . detectChanges ( )
306+ expect ( rendered . getByText ( 'data: hydrated' ) ) . toBeInTheDocument ( )
285307
286308 expect ( states ) . toHaveLength ( 2 )
287309
@@ -303,13 +325,15 @@ describe('withPersistQueryClient', () => {
303325 test ( 'should call onSuccess after successful restoring' , async ( ) => {
304326 const key = queryKey ( )
305327 const queryClient = new QueryClient ( )
306- await queryClient . prefetchQuery ( {
328+ queryClient . prefetchQuery ( {
307329 queryKey : key ,
308- queryFn : ( ) => Promise . resolve ( 'hydrated' ) ,
330+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'hydrated' ) ,
309331 } )
332+ await vi . advanceTimersByTimeAsync ( 10 )
310333
311334 const persister = createMockPersister ( )
312- await persistQueryClientSave ( { queryClient, persister } )
335+ persistQueryClientSave ( { queryClient, persister } )
336+ await vi . advanceTimersByTimeAsync ( 0 )
313337
314338 queryClient . clear ( )
315339
@@ -324,16 +348,13 @@ describe('withPersistQueryClient', () => {
324348 class Page {
325349 state = injectQuery ( ( ) => ( {
326350 queryKey : key ,
327- queryFn : async ( ) => {
328- await sleep ( 10 )
329- return 'fetched'
330- } ,
351+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
331352 } ) )
332353 }
333354
334355 const onSuccess = vi . fn ( )
335356
336- render ( Page , {
357+ const rendered = await render ( Page , {
337358 providers : [
338359 provideZonelessChangeDetection ( ) ,
339360 provideTanStackQuery (
@@ -347,8 +368,14 @@ describe('withPersistQueryClient', () => {
347368 } )
348369
349370 expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
350- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
371+ await vi . advanceTimersByTimeAsync ( 10 )
372+ rendered . fixture . detectChanges ( )
373+ expect ( rendered . getByText ( 'hydrated' ) ) . toBeInTheDocument ( )
351374 expect ( onSuccess ) . toHaveBeenCalledTimes ( 1 )
375+
376+ await vi . advanceTimersByTimeAsync ( 11 )
377+ rendered . fixture . detectChanges ( )
378+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
352379 } )
353380
354381 test ( 'should remove cache after non-successful restoring' , async ( ) => {
@@ -373,14 +400,11 @@ describe('withPersistQueryClient', () => {
373400 class Page {
374401 state = injectQuery ( ( ) => ( {
375402 queryKey : key ,
376- queryFn : async ( ) => {
377- await sleep ( 10 )
378- return 'fetched'
379- } ,
403+ queryFn : ( ) => sleep ( 10 ) . then ( ( ) => 'fetched' ) ,
380404 } ) )
381405 }
382406
383- render ( Page , {
407+ const rendered = await render ( Page , {
384408 providers : [
385409 provideZonelessChangeDetection ( ) ,
386410 provideTanStackQuery (
@@ -394,11 +418,16 @@ describe('withPersistQueryClient', () => {
394418 ] ,
395419 } )
396420
397- await waitFor ( ( ) => screen . getByText ( 'fetched' ) )
421+ await vi . advanceTimersByTimeAsync ( 10 )
422+ rendered . fixture . detectChanges ( )
398423 expect ( removeClient ) . toHaveBeenCalledTimes ( 1 )
399424 expect ( onSuccess ) . toHaveBeenCalledTimes ( 0 )
400425 expect ( onError ) . toHaveBeenCalledTimes ( 1 )
401426
427+ await vi . advanceTimersByTimeAsync ( 11 )
428+ rendered . fixture . detectChanges ( )
429+ expect ( rendered . getByText ( 'fetched' ) ) . toBeInTheDocument ( )
430+
402431 expect ( onErrorMock ) . toHaveBeenCalledTimes ( 1 )
403432 expect ( onErrorMock ) . toHaveBeenNthCalledWith ( 1 , error )
404433 onErrorMock . mockRestore ( )
0 commit comments