Skip to content

Commit e236194

Browse files
test(react-query/useQuery.promise): improve stability by isolating 'queryClient' per test and switching 'queryFn' to real 'sleep' (TanStack#10562)
* test(react-query/useQuery.promise): improve stability by isolating 'queryClient' per test and switching 'queryFn' to real 'sleep' * ci: apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent b1538fc commit e236194

1 file changed

Lines changed: 55 additions & 111 deletions

File tree

packages/react-query/src/__tests__/useQuery.promise.test.tsx

Lines changed: 55 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'
1+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
22
import * as React from 'react'
33
import { ErrorBoundary } from 'react-error-boundary'
44
import {
55
createRenderStream,
66
useTrackRenders,
77
} from '@testing-library/react-render-stream'
8-
import { queryKey } from '@tanstack/query-test-utils'
9-
import { waitFor } from '@testing-library/react'
8+
import { queryKey, sleep } from '@tanstack/query-test-utils'
109
import {
1110
QueryClient,
1211
QueryClientProvider,
@@ -18,26 +17,26 @@ import {
1817
import { QueryCache } from '../index'
1918

2019
describe('useQuery().promise', { timeout: 10_000 }, () => {
21-
const queryCache = new QueryCache()
22-
const queryClient = new QueryClient({
23-
queryCache,
24-
})
20+
let queryCache: QueryCache
21+
let queryClient: QueryClient
2522

26-
beforeAll(() => {
23+
beforeEach(() => {
2724
vi.useFakeTimers({
2825
shouldAdvanceTime: true,
2926
toFake: ['setTimeout', 'clearTimeout', 'setInterval', 'clearInterval'],
3027
})
31-
queryClient.setDefaultOptions({
32-
queries: { experimental_prefetchInRender: true },
28+
queryCache = new QueryCache()
29+
queryClient = new QueryClient({
30+
queryCache,
31+
defaultOptions: {
32+
queries: { experimental_prefetchInRender: true },
33+
},
3334
})
3435
})
3536

36-
afterAll(() => {
37+
afterEach(() => {
3738
vi.useRealTimers()
38-
queryClient.setDefaultOptions({
39-
queries: { experimental_prefetchInRender: false },
40-
})
39+
queryClient.clear()
4140
})
4241

4342
it('should work with a basic test', async () => {
@@ -60,10 +59,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
6059
useTrackRenders()
6160
const query = useQuery({
6261
queryKey: key,
63-
queryFn: async () => {
64-
await vi.advanceTimersByTimeAsync(1)
65-
return 'test'
66-
},
62+
queryFn: () => sleep(10).then(() => 'test'),
6763
})
6864

6965
return (
@@ -107,7 +103,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
107103
queryKey: key,
108104
queryFn: async () => {
109105
callCount++
110-
await vi.advanceTimersByTimeAsync(1)
106+
await sleep(10)
111107
return 'test'
112108
},
113109
staleTime: 1000,
@@ -161,7 +157,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
161157
queryKey: key,
162158
queryFn: async () => {
163159
callCount++
164-
await vi.advanceTimersByTimeAsync(1)
160+
await sleep(10)
165161
return 'test'
166162
},
167163
staleTime: 1000,
@@ -238,10 +234,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
238234
useTrackRenders()
239235
const query = useQuery({
240236
queryKey: key,
241-
queryFn: async () => {
242-
await vi.advanceTimersByTimeAsync(1)
243-
return 'test'
244-
},
237+
queryFn: () => sleep(10).then(() => 'test'),
245238
initialData: 'initial',
246239
})
247240

@@ -274,10 +267,9 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
274267
it('should not fetch with initial data and staleTime', async () => {
275268
const key = queryKey()
276269
const renderStream = createRenderStream({ snapshotDOM: true })
277-
const queryFn = vi.fn().mockImplementation(async () => {
278-
await vi.advanceTimersByTimeAsync(1)
279-
return 'test'
280-
})
270+
const queryFn = vi
271+
.fn()
272+
.mockImplementation(() => sleep(10).then(() => 'test'))
281273

282274
function MyComponent(props: { promise: Promise<string> }) {
283275
useTrackRenders()
@@ -339,10 +331,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
339331
function Page() {
340332
const query = useQuery({
341333
queryKey: key,
342-
queryFn: async () => {
343-
await vi.advanceTimersByTimeAsync(1)
344-
return 'test'
345-
},
334+
queryFn: () => sleep(10).then(() => 'test'),
346335
placeholderData: 'placeholder',
347336
})
348337
useTrackRenders()
@@ -392,10 +381,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
392381
const [count, setCount] = React.useState(0)
393382
const query = useQuery({
394383
queryKey: [...key, count],
395-
queryFn: async () => {
396-
await vi.advanceTimersByTimeAsync(1)
397-
return 'test-' + count
398-
},
384+
queryFn: () => sleep(10).then(() => 'test-' + count),
399385
placeholderData: keepPreviousData,
400386
})
401387

@@ -461,10 +447,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
461447
function Page() {
462448
const query = useQuery({
463449
queryKey: key,
464-
queryFn: async () => {
465-
await vi.advanceTimersByTimeAsync(1)
466-
return { name: 'test' }
467-
},
450+
queryFn: () => sleep(10).then(() => ({ name: 'test' })),
468451
select: (data) => data.name,
469452
})
470453

@@ -517,7 +500,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
517500
const query = useQuery({
518501
queryKey: key,
519502
queryFn: async () => {
520-
await vi.advanceTimersByTimeAsync(1)
503+
await sleep(10)
521504
if (++queryCount > 1) {
522505
// second time this query mounts, it should not throw
523506
return 'data'
@@ -598,10 +581,8 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
598581
function MyComponent() {
599582
const query = useQuery({
600583
queryKey: key,
601-
queryFn: async () => {
602-
await vi.advanceTimersByTimeAsync(1)
603-
throw new Error('Error test')
604-
},
584+
queryFn: () =>
585+
sleep(10).then(() => Promise.reject(new Error('Error test'))),
605586
retry: false,
606587
})
607588
const data = React.use(query.promise)
@@ -656,10 +637,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
656637
function Page() {
657638
const query = useQuery({
658639
queryKey: key,
659-
queryFn: async () => {
660-
await vi.advanceTimersByTimeAsync(1)
661-
return 'test1'
662-
},
640+
queryFn: () => sleep(10).then(() => 'test1'),
663641
})
664642

665643
useTrackRenders()
@@ -700,10 +678,9 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
700678
it('should dedupe when re-fetched with queryClient.fetchQuery while suspending', async () => {
701679
const key = queryKey()
702680
const renderStream = createRenderStream({ snapshotDOM: true })
703-
const queryFn = vi.fn().mockImplementation(async () => {
704-
await vi.advanceTimersByTimeAsync(10)
705-
return 'test'
706-
})
681+
const queryFn = vi
682+
.fn()
683+
.mockImplementation(() => sleep(10).then(() => 'test'))
707684

708685
const options = {
709686
queryKey: key,
@@ -757,10 +734,9 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
757734
const key = queryKey()
758735
let count = 0
759736
const renderStream = createRenderStream({ snapshotDOM: true })
760-
const queryFn = vi.fn().mockImplementation(async () => {
761-
await vi.advanceTimersByTimeAsync(10)
762-
return 'test' + count++
763-
})
737+
const queryFn = vi
738+
.fn()
739+
.mockImplementation(() => sleep(10).then(() => 'test' + count++))
764740

765741
const options = {
766742
queryKey: key,
@@ -817,7 +793,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
817793
const key = queryKey()
818794
let count = 0
819795
const queryFn = vi.fn().mockImplementation(async () => {
820-
await vi.advanceTimersByTimeAsync(10)
796+
await sleep(10)
821797
return 'test' + count++
822798
})
823799

@@ -891,10 +867,9 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
891867
it('should resolve to previous data when canceled with cancelQueries while suspending', async () => {
892868
const renderStream = createRenderStream({ snapshotDOM: true })
893869
const key = queryKey()
894-
const queryFn = vi.fn().mockImplementation(async () => {
895-
await vi.advanceTimersByTimeAsync(10)
896-
return 'test'
897-
})
870+
const queryFn = vi
871+
.fn()
872+
.mockImplementation(() => sleep(10).then(() => 'test'))
898873

899874
const options = {
900875
queryKey: key,
@@ -954,10 +929,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
954929

955930
const options = (count: number) => ({
956931
queryKey: [...key, count],
957-
queryFn: async () => {
958-
await vi.advanceTimersByTimeAsync(10)
959-
return 'test' + count
960-
},
932+
queryFn: () => sleep(10).then(() => 'test' + count),
961933
})
962934

963935
function MyComponent(props: { promise: Promise<string> }) {
@@ -1010,10 +982,9 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
1010982
const renderStream = createRenderStream({ snapshotDOM: true })
1011983
queryClient.setQueryData(key, 'initial')
1012984

1013-
const queryFn = vi.fn().mockImplementation(async () => {
1014-
await vi.advanceTimersByTimeAsync(1)
1015-
return 'test'
1016-
})
985+
const queryFn = vi
986+
.fn()
987+
.mockImplementation(() => sleep(10).then(() => 'test'))
1017988

1018989
function MyComponent(props: { promise: Promise<string> }) {
1019990
const data = React.use(props.promise)
@@ -1072,10 +1043,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
10721043
const [count, setCount] = React.useState(0)
10731044
const query = useQuery({
10741045
queryKey: [key, count],
1075-
queryFn: async () => {
1076-
await vi.advanceTimersByTimeAsync(10)
1077-
return 'test' + count
1078-
},
1046+
queryFn: () => sleep(10).then(() => 'test' + count),
10791047
staleTime: Infinity,
10801048
})
10811049

@@ -1152,10 +1120,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
11521120
const [count, setCount] = React.useState(0)
11531121
const query = useQuery({
11541122
queryKey: [key, count],
1155-
queryFn: async () => {
1156-
await vi.advanceTimersByTimeAsync(10)
1157-
return 'test' + count
1158-
},
1123+
queryFn: () => sleep(10).then(() => 'test' + count),
11591124
staleTime: Infinity,
11601125
})
11611126

@@ -1228,10 +1193,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
12281193
const [count, setCount] = React.useState(0)
12291194
const query = useQuery({
12301195
queryKey: [key, count],
1231-
queryFn: async () => {
1232-
await vi.advanceTimersByTimeAsync(10)
1233-
return 'test' + count + modifier
1234-
},
1196+
queryFn: () => sleep(10).then(() => 'test' + count + modifier),
12351197
})
12361198

12371199
return (
@@ -1291,24 +1253,16 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
12911253
modifier = 'new'
12921254

12931255
rendered.getByText('dec').click()
1294-
{
1295-
const { snapshot } = await renderStream.takeRender()
1296-
expect(snapshot).toMatchObject({ data: 'test3' })
1297-
}
1256+
await vi.advanceTimersByTimeAsync(11)
1257+
expect(rendered.getByText('test2new')).toBeInTheDocument()
12981258

12991259
rendered.getByText('dec').click()
1300-
{
1301-
const { snapshot } = await renderStream.takeRender()
1302-
expect(snapshot).toMatchObject({ data: 'test3' })
1303-
}
1260+
await vi.advanceTimersByTimeAsync(11)
1261+
expect(rendered.getByText('test1new')).toBeInTheDocument()
13041262

13051263
rendered.getByText('dec').click()
1306-
{
1307-
const { snapshot } = await renderStream.takeRender()
1308-
expect(snapshot).toMatchObject({ data: 'test0' })
1309-
}
1310-
1311-
await waitFor(() => rendered.getByText('test0new'))
1264+
await vi.advanceTimersByTimeAsync(11)
1265+
expect(rendered.getByText('test0new')).toBeInTheDocument()
13121266
})
13131267

13141268
it('should not suspend indefinitely with multiple, nested observers)', async () => {
@@ -1326,10 +1280,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
13261280
return useQuery({
13271281
staleTime: Infinity,
13281282
queryKey: [key, input],
1329-
queryFn: async () => {
1330-
await vi.advanceTimersByTimeAsync(1)
1331-
return input + ' response'
1332-
},
1283+
queryFn: () => sleep(10).then(() => input + ' response'),
13331284
})
13341285
}
13351286

@@ -1400,10 +1351,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
14001351
useTrackRenders()
14011352
const query = useInfiniteQuery({
14021353
queryKey: key,
1403-
queryFn: async () => {
1404-
await vi.advanceTimersByTimeAsync(1)
1405-
return { nextCursor: 1, data: 'test' }
1406-
},
1354+
queryFn: () => sleep(10).then(() => ({ nextCursor: 1, data: 'test' })),
14071355
initialPageParam: 0,
14081356
getNextPageParam: (lastPage) => lastPage.nextCursor,
14091357
})
@@ -1446,7 +1394,7 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
14461394
const query = useInfiniteQuery({
14471395
queryKey: key,
14481396
queryFn: async ({ pageParam = 0 }) => {
1449-
await vi.advanceTimersByTimeAsync(1)
1397+
await sleep(10)
14501398
if (pageParam === 0) {
14511399
return { nextCursor: 1, data: 'page-1' }
14521400
}
@@ -1494,13 +1442,9 @@ describe('useQuery().promise', { timeout: 10_000 }, () => {
14941442
}
14951443

14961444
rendered.getByText('fetchNext').click()
1497-
await vi.advanceTimersByTimeAsync(1)
1445+
await vi.advanceTimersByTimeAsync(11)
14981446

1499-
await waitFor(() => {
1500-
expect(
1501-
rendered.getByText('isFetchNextPageError:true'),
1502-
).toBeInTheDocument()
1503-
})
1447+
expect(rendered.getByText('isFetchNextPageError:true')).toBeInTheDocument()
15041448

15051449
expect(rendered.queryByText('error boundary')).toBeNull()
15061450
})

0 commit comments

Comments
 (0)