From 6f9a8fae1539a8b674acc03f0cf33c0f333951b1 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Fri, 13 Feb 2026 10:59:11 +0900 Subject: [PATCH 1/3] test(react-query/useSuspenseQueries): add test for suspending only pending queries when some already have cached data --- .../src/__tests__/useSuspenseQueries.test.tsx | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx b/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx index 7b523aea990..c454fae423f 100644 --- a/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx +++ b/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx @@ -833,4 +833,41 @@ describe('useSuspenseQueries 2', () => { consoleErrorSpy.mockRestore() process.env.NODE_ENV = envCopy }) + + it('should only suspend queries that are pending when some queries already have data', async () => { + const key1 = queryKey() + const key2 = queryKey() + + queryClient.setQueryData(key1, 'cached') + + function Page() { + const [result1, result2] = useSuspenseQueries({ + queries: [ + { queryKey: key1, queryFn: () => sleep(QUERY_DURATION).then(() => 'data1') }, + { queryKey: key2, queryFn: () => sleep(QUERY_DURATION).then(() => 'data2') }, + ], + }) + + return ( +
+
data1: {result1.data}
+
data2: {result2.data}
+
+ ) + } + + const rendered = renderWithClient( + queryClient, + loading}> + + , + ) + + expect(rendered.getByText('loading')).toBeInTheDocument() + + await act(resolveQueries) + + expect(rendered.getByText('data1: cached')).toBeInTheDocument() + expect(rendered.getByText('data2: data2')).toBeInTheDocument() + }) }) From a089053834ad7cd99c08354eda328c8988f06eb9 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 13 Feb 2026 02:00:55 +0000 Subject: [PATCH 2/3] ci: apply automated fixes --- .../src/__tests__/useSuspenseQueries.test.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx b/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx index c454fae423f..652755319bb 100644 --- a/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx +++ b/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx @@ -843,8 +843,14 @@ describe('useSuspenseQueries 2', () => { function Page() { const [result1, result2] = useSuspenseQueries({ queries: [ - { queryKey: key1, queryFn: () => sleep(QUERY_DURATION).then(() => 'data1') }, - { queryKey: key2, queryFn: () => sleep(QUERY_DURATION).then(() => 'data2') }, + { + queryKey: key1, + queryFn: () => sleep(QUERY_DURATION).then(() => 'data1'), + }, + { + queryKey: key2, + queryFn: () => sleep(QUERY_DURATION).then(() => 'data2'), + }, ], }) From 22e7972842592bd53244217fd120d4cae96457e0 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Thu, 26 Feb 2026 09:57:53 +0900 Subject: [PATCH 3/3] test(react-query/useSuspenseQueries): use different 'sleep' times and verify background refetch settles with fresh data --- .../src/__tests__/useSuspenseQueries.test.tsx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx b/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx index 652755319bb..2b91af8b892 100644 --- a/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx +++ b/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx @@ -845,11 +845,11 @@ describe('useSuspenseQueries 2', () => { queries: [ { queryKey: key1, - queryFn: () => sleep(QUERY_DURATION).then(() => 'data1'), + queryFn: () => sleep(2000).then(() => 'data1'), }, { queryKey: key2, - queryFn: () => sleep(QUERY_DURATION).then(() => 'data2'), + queryFn: () => sleep(1000).then(() => 'data2'), }, ], }) @@ -871,9 +871,19 @@ describe('useSuspenseQueries 2', () => { expect(rendered.getByText('loading')).toBeInTheDocument() - await act(resolveQueries) + // key2 resolves: suspend lifts, key1 shows cached data, key2 shows fresh data + await act(() => vi.advanceTimersByTimeAsync(1000)) expect(rendered.getByText('data1: cached')).toBeInTheDocument() expect(rendered.getByText('data2: data2')).toBeInTheDocument() + + // key1 stale timer fires, triggering background refetch + await act(() => vi.advanceTimersByTimeAsync(1000)) + + // key1 background refetch completes: key1 updates to fresh data + await act(() => vi.advanceTimersByTimeAsync(2000)) + + expect(rendered.getByText('data1: data1')).toBeInTheDocument() + expect(rendered.getByText('data2: data2')).toBeInTheDocument() }) })