diff --git a/packages/solid-query/src/__tests__/useQuery.test.tsx b/packages/solid-query/src/__tests__/useQuery.test.tsx index 745621d171..00be792624 100644 --- a/packages/solid-query/src/__tests__/useQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useQuery.test.tsx @@ -1048,6 +1048,69 @@ 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 = [