Skip to content

Commit 9b92bc7

Browse files
committed
test(angular-query-persist-client/withPersistQueryClient): switch to fake timers, replace 'waitFor' with 'advanceTimersByTimeAsync', use 'sleep().then()' pattern, replace 'toBeTruthy' with 'toBeInTheDocument', and add '@testing-library/jest-dom/vitest'
1 parent c9bc600 commit 9b92bc7

File tree

2 files changed

+74
-44
lines changed

2 files changed

+74
-44
lines changed

packages/angular-query-persist-client/src/__tests__/with-persist-query-client.test.ts

Lines changed: 73 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { describe, expect, test, vi } from 'vitest'
1+
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'
22
import {
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'
1414
import { queryKey, sleep } from '@tanstack/query-test-utils'
1515
import { withPersistQueryClient } from '../with-persist-query-client'
1616
import 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+
2129
const 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()

packages/angular-query-persist-client/test-setup.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import '@testing-library/jest-dom/vitest'
12
import { getTestBed } from '@angular/core/testing'
23
import {
34
BrowserTestingModule,

0 commit comments

Comments
 (0)