From f626b6620021a6f3417692412abea32776e17ce3 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 23 Feb 2026 01:50:48 +0900 Subject: [PATCH 1/2] test(solid-query/useQuery): add test for string 'reconcile' option maintaining referential equality --- .../src/__tests__/useQuery.test.tsx | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/packages/solid-query/src/__tests__/useQuery.test.tsx b/packages/solid-query/src/__tests__/useQuery.test.tsx index 745621d1715..b7ec3d06e20 100644 --- a/packages/solid-query/src/__tests__/useQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useQuery.test.tsx @@ -1048,6 +1048,61 @@ describe('useQuery', () => { expect(states[1]).toMatchObject({ data: 'test' }) }) + it('should maintain referential equality when reconcile option is a string key', async () => { + const key = queryKey() + const states: Array> = [] + + let count = 0 + + function Page() { + const state = useQuery(() => ({ + queryKey: key, + queryFn: async () => { + await sleep(10) + count++ + return [ + { id: '1', done: false }, + { id: '2', done: count > 1 }, + ] + }, + reconcile: 'id', + })) + + createEffect(() => { + if (state.data) { + states.push(state.data) + } + }) + + const { refetch } = state + + return ( +
+ +

Data: {JSON.stringify(state.data)}

+
+ ) + } + + const rendered = render(() => ( + + + + )) + + await vi.advanceTimersByTimeAsync(10) + expect(rendered.getByText('Data: [{"id":"1","done":false},{"id":"2","done":false}]')).toBeInTheDocument() + expect(states).toHaveLength(1) + + fireEvent.click(rendered.getByRole('button', { name: /refetch/i })) + await vi.advanceTimersByTimeAsync(10) + expect(rendered.getByText('Data: [{"id":"1","done":false},{"id":"2","done":true}]')).toBeInTheDocument() + + // reconcile by 'id' updates in-place, so the array reference stays the same + // and the effect is not triggered again + expect(states).toHaveLength(1) + }) + it('should share equal data structures between query results', async () => { const key = queryKey() const result1 = [ From 0b0f835a926e400c44de9623650aae0c7a40192b Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 22 Feb 2026 16:52:36 +0000 Subject: [PATCH 2/2] ci: apply automated fixes --- packages/solid-query/src/__tests__/useQuery.test.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/solid-query/src/__tests__/useQuery.test.tsx b/packages/solid-query/src/__tests__/useQuery.test.tsx index b7ec3d06e20..00be7926241 100644 --- a/packages/solid-query/src/__tests__/useQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useQuery.test.tsx @@ -1091,12 +1091,20 @@ describe('useQuery', () => { )) await vi.advanceTimersByTimeAsync(10) - expect(rendered.getByText('Data: [{"id":"1","done":false},{"id":"2","done":false}]')).toBeInTheDocument() + expect( + rendered.getByText( + 'Data: [{"id":"1","done":false},{"id":"2","done":false}]', + ), + ).toBeInTheDocument() expect(states).toHaveLength(1) fireEvent.click(rendered.getByRole('button', { name: /refetch/i })) await vi.advanceTimersByTimeAsync(10) - expect(rendered.getByText('Data: [{"id":"1","done":false},{"id":"2","done":true}]')).toBeInTheDocument() + expect( + rendered.getByText( + 'Data: [{"id":"1","done":false},{"id":"2","done":true}]', + ), + ).toBeInTheDocument() // reconcile by 'id' updates in-place, so the array reference stays the same // and the effect is not triggered again