diff --git a/packages/preact-query/src/__tests__/useSuspenseQueries.test.tsx b/packages/preact-query/src/__tests__/useSuspenseQueries.test.tsx
index 5445fa95b0..8fa4072c69 100644
--- a/packages/preact-query/src/__tests__/useSuspenseQueries.test.tsx
+++ b/packages/preact-query/src/__tests__/useSuspenseQueries.test.tsx
@@ -1078,6 +1078,74 @@ describe('useSuspenseQueries 2', () => {
expect(queryFn1).toHaveBeenCalledTimes(0)
})
+ it('should not suspend and only refetch the stale query when one query has stale and the other has fresh cached data', async () => {
+ const key1 = queryKey()
+ const key2 = queryKey()
+
+ queryClient.setQueryData(key1, 'cached1')
+ queryClient.setQueryData(key2, 'cached2')
+
+ // Advance past staleTime (min 1000ms in suspense) so key1 becomes stale before mount
+ vi.advanceTimersByTime(1000)
+
+ // Make key2 fresh again by resetting its data
+ queryClient.setQueryData(key2, 'cached2')
+
+ const queryFn2 = vi.fn(() => sleep(20).then(() => 'data2'))
+
+ function Page() {
+ const [result1, result2] = useSuspenseQueries({
+ queries: [
+ {
+ queryKey: key1,
+ queryFn: () => sleep(10).then(() => 'data1'),
+ },
+ {
+ queryKey: key2,
+ queryFn: queryFn2,
+ },
+ ],
+ })
+
+ return (
+
+
data1: {result1.data}
+
data2: {result2.data}
+
+ )
+ }
+
+ const rendered = renderWithClient(
+ queryClient,
+ loading}>
+
+ ,
+ )
+
+ // No suspend, cached data shown immediately
+ expect(rendered.getByText('data1: cached1')).toBeInTheDocument()
+ expect(rendered.getByText('data2: cached2')).toBeInTheDocument()
+
+ // key2 is fresh, no refetch
+ expect(queryFn2).toHaveBeenCalledTimes(0)
+
+ // key1 background refetch completes
+ await vi.advanceTimersByTimeAsync(11)
+
+ expect(rendered.getByText('data1: data1')).toBeInTheDocument()
+ expect(rendered.getByText('data2: cached2')).toBeInTheDocument()
+
+ // key2 is still fresh, no refetch triggered
+ expect(queryFn2).toHaveBeenCalledTimes(0)
+
+ // after key1 refetch completes, key2 is still fresh with no refetch triggered
+ await vi.advanceTimersByTimeAsync(10)
+
+ expect(rendered.getByText('data1: data1')).toBeInTheDocument()
+ expect(rendered.getByText('data2: cached2')).toBeInTheDocument()
+ expect(queryFn2).toHaveBeenCalledTimes(0)
+ })
+
it('should not suspend but refetch when all queries have stale cached data', async () => {
const key1 = queryKey()
const key2 = queryKey()
diff --git a/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx b/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx
index 9f114cd94f..adb1f1c02b 100644
--- a/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx
+++ b/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx
@@ -1056,6 +1056,74 @@ describe('useSuspenseQueries 2', () => {
expect(queryFn1).toHaveBeenCalledTimes(0)
})
+ it('should not suspend and only refetch the stale query when one query has stale and the other has fresh cached data', async () => {
+ const key1 = queryKey()
+ const key2 = queryKey()
+
+ queryClient.setQueryData(key1, 'cached1')
+ queryClient.setQueryData(key2, 'cached2')
+
+ // Advance past staleTime (min 1000ms in suspense) so key1 becomes stale before mount
+ vi.advanceTimersByTime(1000)
+
+ // Make key2 fresh again by resetting its data
+ queryClient.setQueryData(key2, 'cached2')
+
+ const queryFn2 = vi.fn(() => sleep(20).then(() => 'data2'))
+
+ function Page() {
+ const [result1, result2] = useSuspenseQueries({
+ queries: [
+ {
+ queryKey: key1,
+ queryFn: () => sleep(10).then(() => 'data1'),
+ },
+ {
+ queryKey: key2,
+ queryFn: queryFn2,
+ },
+ ],
+ })
+
+ return (
+
+
data1: {result1.data}
+
data2: {result2.data}
+
+ )
+ }
+
+ const rendered = renderWithClient(
+ queryClient,
+ loading}>
+
+ ,
+ )
+
+ // No suspend, cached data shown immediately
+ expect(rendered.getByText('data1: cached1')).toBeInTheDocument()
+ expect(rendered.getByText('data2: cached2')).toBeInTheDocument()
+
+ // key2 is fresh, no refetch
+ expect(queryFn2).toHaveBeenCalledTimes(0)
+
+ // key1 background refetch completes
+ await act(() => vi.advanceTimersByTimeAsync(11))
+
+ expect(rendered.getByText('data1: data1')).toBeInTheDocument()
+ expect(rendered.getByText('data2: cached2')).toBeInTheDocument()
+
+ // key2 is still fresh, no refetch triggered
+ expect(queryFn2).toHaveBeenCalledTimes(0)
+
+ // after key1 refetch completes, key2 is still fresh with no refetch triggered
+ await act(() => vi.advanceTimersByTimeAsync(10))
+
+ expect(rendered.getByText('data1: data1')).toBeInTheDocument()
+ expect(rendered.getByText('data2: cached2')).toBeInTheDocument()
+ expect(queryFn2).toHaveBeenCalledTimes(0)
+ })
+
it('should not suspend but refetch when all queries have stale cached data', async () => {
const key1 = queryKey()
const key2 = queryKey()