Skip to content

Commit 914e012

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

File tree

2 files changed

+75
-46
lines changed

2 files changed

+75
-46
lines changed

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

Lines changed: 74 additions & 46 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

@@ -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()

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)