@@ -35,6 +35,7 @@ import {
3535} from './utils'
3636import { vi } from 'vitest'
3737import type { Mock } from 'vitest'
38+ import { reconcile } from 'solid-js/store'
3839
3940describe ( 'createQuery' , ( ) => {
4041 const queryCache = new QueryCache ( )
@@ -4609,6 +4610,61 @@ describe('createQuery', () => {
46094610 expect ( states ) . toHaveLength ( 1 )
46104611 } )
46114612
4613+ it ( 'The reconcile fn callback should correctly maintain referential equality' , async ( ) => {
4614+ const key1 = queryKey ( )
4615+ const states : Array < Array < number > > = [ ]
4616+
4617+ function Page ( ) {
4618+ const [ forceValue , setForceValue ] = createSignal ( 1 )
4619+
4620+ const state = createQuery ( ( ) => ( {
4621+ queryKey : key1 ,
4622+ queryFn : async ( ) => {
4623+ await sleep ( 10 )
4624+ return [ 1 , 2 ]
4625+ } ,
4626+ select : ( res ) => res . map ( ( x ) => x + 1 ) ,
4627+ reconcile ( oldData , newData ) {
4628+ return reconcile ( newData ) ( oldData )
4629+ } ,
4630+ } ) )
4631+
4632+ createEffect ( ( ) => {
4633+ if ( state . data ) {
4634+ states . push ( state . data )
4635+ }
4636+ } )
4637+
4638+ const forceUpdate = ( ) => {
4639+ setForceValue ( ( prev ) => prev + 1 )
4640+ }
4641+
4642+ return (
4643+ < div >
4644+ < h2 > Data: { JSON . stringify ( state . data ) } </ h2 >
4645+ < h2 > forceValue: { forceValue } </ h2 >
4646+ < button onClick = { forceUpdate } > forceUpdate</ button >
4647+ </ div >
4648+ )
4649+ }
4650+
4651+ render ( ( ) => (
4652+ < QueryClientProvider client = { queryClient } >
4653+ < Page />
4654+ </ QueryClientProvider >
4655+ ) )
4656+ await waitFor ( ( ) => screen . getByText ( 'Data: [2,3]' ) )
4657+ expect ( states ) . toHaveLength ( 1 )
4658+
4659+ fireEvent . click ( screen . getByRole ( 'button' , { name : / f o r c e U p d a t e / i } ) )
4660+
4661+ await waitFor ( ( ) => screen . getByText ( 'forceValue: 2' ) )
4662+ await waitFor ( ( ) => screen . getByText ( 'Data: [2,3]' ) )
4663+
4664+ // effect should not be triggered again due to structural sharing
4665+ expect ( states ) . toHaveLength ( 1 )
4666+ } )
4667+
46124668 it ( 'should cancel the query function when there are no more subscriptions' , async ( ) => {
46134669 const key = queryKey ( )
46144670 let cancelFn : Mock = vi . fn ( )
0 commit comments