From 856f83503a5fde660275aca302bcae67ca3fae64 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Wed, 25 Feb 2026 21:05:21 +0900 Subject: [PATCH 1/2] test(query-core/queriesObserver): add test for 'trackResult' property tracking synchronization across all observers --- .../src/__tests__/queriesObserver.test.tsx | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/packages/query-core/src/__tests__/queriesObserver.test.tsx b/packages/query-core/src/__tests__/queriesObserver.test.tsx index 24b80aaf810..1747450613a 100644 --- a/packages/query-core/src/__tests__/queriesObserver.test.tsx +++ b/packages/query-core/src/__tests__/queriesObserver.test.tsx @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' import { queryKey, sleep } from '@tanstack/query-test-utils' -import { QueriesObserver, QueryClient } from '..' +import { QueriesObserver, QueryClient, QueryObserver } from '..' import type { QueryObserverResult } from '..' describe('queriesObserver', () => { @@ -510,4 +510,41 @@ describe('queriesObserver', () => { expect(newCombined.keys).toEqual(['pending']) }) + + test('should track properties on all observers when trackResult is called', () => { + const key1 = queryKey() + const key2 = queryKey() + const queryFn1 = () => 'data1' + const queryFn2 = () => 'data2' + + const observer = new QueriesObserver(queryClient, [ + { queryKey: key1, queryFn: queryFn1 }, + { queryKey: key2, queryFn: queryFn2 }, + ]) + + const trackPropSpy = vi.spyOn(QueryObserver.prototype, 'trackProp') + + const [, getCombinedResult, trackResult] = observer.getOptimisticResult( + [ + { queryKey: key1, queryFn: queryFn1 }, + { queryKey: key2, queryFn: queryFn2 }, + ], + undefined, + ) + + const trackedResults = trackResult() + const combinedResult = getCombinedResult(trackedResults) + + expect(combinedResult).toHaveLength(2) + + // Accessing a property on the first result should trigger trackProp on all observers + void trackedResults[0]!.status + + // 1 direct call from the accessed observer's proxy + + // 2 synchronized calls from onPropTracked callback (one per observer) + expect(trackPropSpy).toHaveBeenCalledWith('status') + expect(trackPropSpy).toHaveBeenCalledTimes(3) + + trackPropSpy.mockRestore() + }) }) From 9a7d894c4a5f15872062dedba05bd0ac981531b9 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Wed, 25 Feb 2026 21:28:15 +0900 Subject: [PATCH 2/2] test(query-core/queriesObserver): remove unnecessary 'getCombinedResult' call in 'trackResult' test --- packages/query-core/src/__tests__/queriesObserver.test.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/query-core/src/__tests__/queriesObserver.test.tsx b/packages/query-core/src/__tests__/queriesObserver.test.tsx index 1747450613a..2f7080ec60c 100644 --- a/packages/query-core/src/__tests__/queriesObserver.test.tsx +++ b/packages/query-core/src/__tests__/queriesObserver.test.tsx @@ -524,7 +524,7 @@ describe('queriesObserver', () => { const trackPropSpy = vi.spyOn(QueryObserver.prototype, 'trackProp') - const [, getCombinedResult, trackResult] = observer.getOptimisticResult( + const [, , trackResult] = observer.getOptimisticResult( [ { queryKey: key1, queryFn: queryFn1 }, { queryKey: key2, queryFn: queryFn2 }, @@ -533,9 +533,8 @@ describe('queriesObserver', () => { ) const trackedResults = trackResult() - const combinedResult = getCombinedResult(trackedResults) - expect(combinedResult).toHaveLength(2) + expect(trackedResults).toHaveLength(2) // Accessing a property on the first result should trigger trackProp on all observers void trackedResults[0]!.status