Skip to content

Commit 43001f5

Browse files
author
Aryan Deora
committed
feat(solid-query): Add reconcile callback test
1 parent dc81d2a commit 43001f5

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

packages/solid-query/src/__tests__/createQuery.test.tsx

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import {
3535
} from './utils'
3636
import { vi } from 'vitest'
3737
import type { Mock } from 'vitest'
38+
import { reconcile } from 'solid-js/store'
3839

3940
describe('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: /forceUpdate/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

Comments
 (0)