Skip to content

Commit 44bfedb

Browse files
committed
test(react-query): add test for stable combine optimization on unrelated re-renders
1 parent 6a20d93 commit 44bfedb

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

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

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1658,4 +1658,87 @@ describe('useQueries', () => {
16581658
),
16591659
).toBeInTheDocument()
16601660
})
1661+
1662+
it('should not re-run stable combine on unrelated re-render', async () => {
1663+
const key1 = queryKey()
1664+
const key2 = queryKey()
1665+
1666+
const client = new QueryClient()
1667+
1668+
const spy = vi.fn()
1669+
1670+
function Page() {
1671+
const [unrelatedState, setUnrelatedState] = React.useState(0)
1672+
1673+
const queries = useQueries(
1674+
{
1675+
queries: [
1676+
{
1677+
queryKey: key1,
1678+
queryFn: async () => {
1679+
await sleep(10)
1680+
return 'first result'
1681+
},
1682+
},
1683+
{
1684+
queryKey: key2,
1685+
queryFn: async () => {
1686+
await sleep(20)
1687+
return 'second result'
1688+
},
1689+
},
1690+
],
1691+
combine: React.useCallback((results: Array<QueryObserverResult>) => {
1692+
const result = {
1693+
combined: true,
1694+
res: results.map((res) => res.data).join(','),
1695+
}
1696+
spy(result)
1697+
return result
1698+
}, []),
1699+
},
1700+
client,
1701+
)
1702+
1703+
return (
1704+
<div>
1705+
<div>
1706+
data: {String(queries.combined)} {queries.res}
1707+
</div>
1708+
<div>unrelated: {unrelatedState}</div>
1709+
<button onClick={() => setUnrelatedState((s) => s + 1)}>
1710+
increment
1711+
</button>
1712+
</div>
1713+
)
1714+
}
1715+
1716+
const rendered = render(<Page />)
1717+
1718+
await vi.advanceTimersByTimeAsync(21)
1719+
expect(
1720+
rendered.getByText('data: true first result,second result'),
1721+
).toBeInTheDocument()
1722+
1723+
// initial renders: both pending, one pending, both resolved
1724+
expect(spy).toHaveBeenCalledTimes(3)
1725+
1726+
fireEvent.click(rendered.getByRole('button', { name: /increment/i }))
1727+
1728+
await vi.advanceTimersByTimeAsync(0)
1729+
1730+
expect(rendered.getByText('unrelated: 1')).toBeInTheDocument()
1731+
1732+
// combine should NOT re-run for unrelated re-render with stable reference
1733+
expect(spy).toHaveBeenCalledTimes(3)
1734+
1735+
fireEvent.click(rendered.getByRole('button', { name: /increment/i }))
1736+
1737+
await vi.advanceTimersByTimeAsync(0)
1738+
1739+
expect(rendered.getByText('unrelated: 2')).toBeInTheDocument()
1740+
1741+
// still no extra calls to combine
1742+
expect(spy).toHaveBeenCalledTimes(3)
1743+
})
16611744
})

0 commit comments

Comments
 (0)