Skip to content

Commit 1fe9356

Browse files
authored
test: stabilize flaky tests (#4397)
* test: stabilize a flaky test for notifyOnChangeProps * test: stabilize a flaky test for cacheTime 0 and rerendering * test: add sleep to make sure no additional renders are happening after data is successfully fetched for the second time * test: stabilize test for switching to a disabled query * test: small improvements to a test for disabled query * test: stabilize test for "previous data on disabled query when keepPreviousData is set" * test: run prettier
1 parent 7f7e759 commit 1fe9356

1 file changed

Lines changed: 93 additions & 41 deletions

File tree

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

Lines changed: 93 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -873,20 +873,35 @@ describe('useQuery', () => {
873873

874874
states.push(state)
875875

876-
const { remove } = state
877-
878-
React.useEffect(() => {
879-
setActTimeout(() => {
880-
remove()
881-
rerender({})
882-
}, 20)
883-
}, [remove])
876+
return (
877+
<>
878+
<div>{state.data}</div>
884879

885-
return null
880+
<button
881+
onClick={() => {
882+
state.remove()
883+
rerender({})
884+
}}
885+
>
886+
remove
887+
</button>
888+
</>
889+
)
886890
}
887891

888-
renderWithClient(queryClient, <Page />)
892+
const rendered = renderWithClient(queryClient, <Page />)
893+
894+
await waitFor(() => {
895+
rendered.getByText('data')
896+
})
889897

898+
fireEvent.click(rendered.getByRole('button', { name: 'remove' }))
899+
900+
await waitFor(() => {
901+
rendered.getByText('data')
902+
})
903+
904+
// required to make sure no additional renders are happening after data is successfully fetched for the second time
890905
await sleep(100)
891906

892907
expect(states.length).toBe(5)
@@ -1518,17 +1533,27 @@ describe('useQuery', () => {
15181533

15191534
states.push(state)
15201535

1521-
React.useEffect(() => {
1522-
setActTimeout(() => {
1523-
setCount(1)
1524-
}, 10)
1525-
}, [])
1526-
1527-
return null
1536+
return (
1537+
<div>
1538+
<button onClick={() => setCount(1)}>increment</button>
1539+
<div>data: {state.data ?? 'undefined'}</div>
1540+
<div>count: {count}</div>
1541+
</div>
1542+
)
15281543
}
15291544

1530-
renderWithClient(queryClient, <Page />)
1545+
const rendered = renderWithClient(queryClient, <Page />)
1546+
1547+
await waitFor(() => rendered.getByText('data: 0'))
15311548

1549+
fireEvent.click(rendered.getByRole('button', { name: /increment/i }))
1550+
1551+
await waitFor(() => {
1552+
rendered.getByText('count: 1')
1553+
rendered.getByText('data: undefined')
1554+
})
1555+
1556+
// making sure no additional fetches are triggered
15321557
await sleep(50)
15331558

15341559
expect(states.length).toBe(3)
@@ -1812,26 +1837,41 @@ describe('useQuery', () => {
18121837

18131838
states.push(state)
18141839

1815-
const { refetch } = state
1840+
return (
1841+
<div>
1842+
<button onClick={() => state.refetch()}>refetch</button>
1843+
<button onClick={() => setCount(1)}>setCount</button>
1844+
<div>data: {state.data ?? 'undefined'}</div>
1845+
</div>
1846+
)
1847+
}
18161848

1817-
React.useEffect(() => {
1818-
refetch()
1849+
const rendered = renderWithClient(queryClient, <Page />)
18191850

1820-
setActTimeout(() => {
1821-
setCount(1)
1822-
}, 20)
1851+
await waitFor(() => {
1852+
rendered.getByText('data: undefined')
1853+
})
18231854

1824-
setActTimeout(() => {
1825-
refetch()
1826-
}, 30)
1827-
}, [refetch])
1855+
fireEvent.click(rendered.getByRole('button', { name: 'refetch' }))
18281856

1829-
return null
1830-
}
1857+
await waitFor(() => {
1858+
rendered.getByText('data: 0')
1859+
})
18311860

1832-
renderWithClient(queryClient, <Page />)
1861+
fireEvent.click(rendered.getByRole('button', { name: 'setCount' }))
18331862

1834-
await sleep(100)
1863+
await waitFor(() => {
1864+
rendered.getByText('data: 0')
1865+
})
1866+
1867+
fireEvent.click(rendered.getByRole('button', { name: 'refetch' }))
1868+
1869+
await waitFor(() => {
1870+
rendered.getByText('data: 1')
1871+
})
1872+
1873+
// making sure no additional renders are triggered
1874+
await sleep(20)
18351875

18361876
expect(states.length).toBe(6)
18371877

@@ -2194,19 +2234,31 @@ describe('useQuery', () => {
21942234

21952235
states.push(state)
21962236

2197-
const { refetch } = state
2237+
return (
2238+
<>
2239+
<button
2240+
onClick={async () => {
2241+
await state.refetch()
2242+
}}
2243+
>
2244+
refetch
2245+
</button>
21982246

2199-
React.useEffect(() => {
2200-
setActTimeout(() => {
2201-
refetch()
2202-
}, 10)
2203-
}, [refetch])
2204-
return null
2247+
<div>{state.data}</div>
2248+
</>
2249+
)
22052250
}
22062251

2207-
renderWithClient(queryClient, <Page />)
2252+
const rendered = renderWithClient(queryClient, <Page />)
22082253

2209-
await sleep(30)
2254+
await waitFor(() => {
2255+
rendered.getByText('test')
2256+
})
2257+
2258+
fireEvent.click(rendered.getByRole('button', { name: 'refetch' }))
2259+
2260+
// sleep is required to make sure no additional renders happen after click
2261+
await sleep(20)
22102262

22112263
expect(states.length).toBe(2)
22122264
expect(states[0]).toMatchObject({

0 commit comments

Comments
 (0)