diff --git a/packages/react-query/src/__tests__/useQueries.test.tsx b/packages/react-query/src/__tests__/useQueries.test.tsx index a8d3787ea4..068b22494c 100644 --- a/packages/react-query/src/__tests__/useQueries.test.tsx +++ b/packages/react-query/src/__tests__/useQueries.test.tsx @@ -12,6 +12,7 @@ import * as React from 'react' import { ErrorBoundary } from 'react-error-boundary' import { queryKey, sleep } from '@tanstack/query-test-utils' import { + IsRestoringProvider, QueryCache, QueryClient, queryOptions, @@ -1863,4 +1864,127 @@ describe('useQueries', () => { expect(result.length).toBe(result.n) }) }) + + it('should not fetch for the duration of the restoring period when isRestoring is true', async () => { + const key1 = queryKey() + const key2 = queryKey() + const queryFn1 = vi.fn(() => sleep(10).then(() => 'data1')) + const queryFn2 = vi.fn(() => sleep(10).then(() => 'data2')) + + function Page() { + const results = useQueries({ + queries: [ + { queryKey: key1, queryFn: queryFn1 }, + { queryKey: key2, queryFn: queryFn2 }, + ], + }) + + return ( +
+
{results[0]?.status}
+
{results[1]?.status}
+
{results[0]?.fetchStatus}
+
{results[1]?.fetchStatus}
+
{results[0]?.data ?? 'undefined'}
+
{results[1]?.data ?? 'undefined'}
+
+ ) + } + + const rendered = renderWithClient( + queryClient, + + + , + ) + + await vi.advanceTimersByTimeAsync(0) + + expect(rendered.getByTestId('status1')).toHaveTextContent('pending') + expect(rendered.getByTestId('status2')).toHaveTextContent('pending') + expect(rendered.getByTestId('fetchStatus1')).toHaveTextContent('idle') + expect(rendered.getByTestId('fetchStatus2')).toHaveTextContent('idle') + expect(rendered.getByTestId('data1')).toHaveTextContent('undefined') + expect(rendered.getByTestId('data2')).toHaveTextContent('undefined') + expect(queryFn1).toHaveBeenCalledTimes(0) + expect(queryFn2).toHaveBeenCalledTimes(0) + + await vi.advanceTimersByTimeAsync(11) + + expect(rendered.getByTestId('status1')).toHaveTextContent('pending') + expect(rendered.getByTestId('status2')).toHaveTextContent('pending') + expect(rendered.getByTestId('fetchStatus1')).toHaveTextContent('idle') + expect(rendered.getByTestId('fetchStatus2')).toHaveTextContent('idle') + expect(rendered.getByTestId('data1')).toHaveTextContent('undefined') + expect(rendered.getByTestId('data2')).toHaveTextContent('undefined') + expect(queryFn1).toHaveBeenCalledTimes(0) + expect(queryFn2).toHaveBeenCalledTimes(0) + }) + + it('should not fetch queries with different durations for the duration of the restoring period when isRestoring is true', async () => { + const key1 = queryKey() + const key2 = queryKey() + const queryFn1 = vi.fn(() => sleep(10).then(() => 'data1')) + const queryFn2 = vi.fn(() => sleep(20).then(() => 'data2')) + + function Page() { + const results = useQueries({ + queries: [ + { queryKey: key1, queryFn: queryFn1 }, + { queryKey: key2, queryFn: queryFn2 }, + ], + }) + + return ( +
+
{results[0]?.status}
+
{results[1]?.status}
+
{results[0]?.fetchStatus}
+
{results[1]?.fetchStatus}
+
{results[0]?.data ?? 'undefined'}
+
{results[1]?.data ?? 'undefined'}
+
+ ) + } + + const rendered = renderWithClient( + queryClient, + + + , + ) + + await vi.advanceTimersByTimeAsync(0) + + expect(rendered.getByTestId('status1')).toHaveTextContent('pending') + expect(rendered.getByTestId('status2')).toHaveTextContent('pending') + expect(rendered.getByTestId('fetchStatus1')).toHaveTextContent('idle') + expect(rendered.getByTestId('fetchStatus2')).toHaveTextContent('idle') + expect(rendered.getByTestId('data1')).toHaveTextContent('undefined') + expect(rendered.getByTestId('data2')).toHaveTextContent('undefined') + expect(queryFn1).toHaveBeenCalledTimes(0) + expect(queryFn2).toHaveBeenCalledTimes(0) + + await vi.advanceTimersByTimeAsync(11) + + expect(rendered.getByTestId('status1')).toHaveTextContent('pending') + expect(rendered.getByTestId('status2')).toHaveTextContent('pending') + expect(rendered.getByTestId('fetchStatus1')).toHaveTextContent('idle') + expect(rendered.getByTestId('fetchStatus2')).toHaveTextContent('idle') + expect(rendered.getByTestId('data1')).toHaveTextContent('undefined') + expect(rendered.getByTestId('data2')).toHaveTextContent('undefined') + expect(queryFn1).toHaveBeenCalledTimes(0) + expect(queryFn2).toHaveBeenCalledTimes(0) + + await vi.advanceTimersByTimeAsync(10) + + expect(rendered.getByTestId('status1')).toHaveTextContent('pending') + expect(rendered.getByTestId('status2')).toHaveTextContent('pending') + expect(rendered.getByTestId('fetchStatus1')).toHaveTextContent('idle') + expect(rendered.getByTestId('fetchStatus2')).toHaveTextContent('idle') + expect(rendered.getByTestId('data1')).toHaveTextContent('undefined') + expect(rendered.getByTestId('data2')).toHaveTextContent('undefined') + expect(queryFn1).toHaveBeenCalledTimes(0) + expect(queryFn2).toHaveBeenCalledTimes(0) + }) })