Skip to content

Commit b162492

Browse files
committed
Add test
1 parent 1c03ac8 commit b162492

File tree

1 file changed

+67
-1
lines changed

1 file changed

+67
-1
lines changed

packages/toolkit/src/query/tests/buildCreateApi.test.tsx

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ import { server } from './mocks/server'
3535
import type { UnknownAction } from 'redux'
3636
import type { SubscriptionOptions } from '@reduxjs/toolkit/dist/query/core/apiState'
3737
import type { SerializedError } from '@reduxjs/toolkit'
38-
import { createListenerMiddleware, configureStore } from '@reduxjs/toolkit'
38+
import {
39+
createListenerMiddleware,
40+
configureStore,
41+
lruMemoize,
42+
createSelectorCreator,
43+
} from '@reduxjs/toolkit'
3944
import { delay } from '../../utils'
4045

4146
const MyContext = React.createContext<ReactReduxContextValue>(null as any)
@@ -123,4 +128,65 @@ describe('buildCreateApi', () => {
123128
`"When using custom hooks for context, all 3 hooks need to be provided: useDispatch, useSelector, useStore.\nHook useStore was either not provided or not a function."`
124129
)
125130
})
131+
test('allows passing createSelector instance', async () => {
132+
const memoize = vi.fn(lruMemoize)
133+
const createSelector = createSelectorCreator(memoize)
134+
const createApi = buildCreateApi(
135+
coreModule({ createSelector }),
136+
reactHooksModule({ createSelector })
137+
)
138+
const api = createApi({
139+
baseQuery: async (arg: any) => {
140+
await waitMs()
141+
142+
return {
143+
data: arg?.body ? { ...arg.body } : {},
144+
}
145+
},
146+
endpoints: (build) => ({
147+
getUser: build.query<{ name: string }, number>({
148+
query: () => ({
149+
body: { name: 'Timmy' },
150+
}),
151+
}),
152+
}),
153+
})
154+
155+
const storeRef = setupApiStore(api, {}, { withoutTestLifecycles: true })
156+
157+
await storeRef.store.dispatch(api.endpoints.getUser.initiate(1))
158+
159+
const selectUser = api.endpoints.getUser.select(1)
160+
161+
expect(selectUser(storeRef.store.getState()).data).toEqual({
162+
name: 'Timmy',
163+
})
164+
165+
expect(memoize).toHaveBeenCalledTimes(4)
166+
167+
memoize.mockClear()
168+
169+
function User() {
170+
const { isFetching } = api.endpoints.getUser.useQuery(1)
171+
172+
return (
173+
<div>
174+
<div data-testid="isFetching">{String(isFetching)}</div>
175+
</div>
176+
)
177+
}
178+
179+
function Wrapper({ children }: any) {
180+
return <Provider store={storeRef.store}>{children}</Provider>
181+
}
182+
183+
render(<User />, { wrapper: Wrapper })
184+
185+
await waitFor(() =>
186+
expect(screen.getByTestId('isFetching').textContent).toBe('false')
187+
)
188+
189+
// select() + selectFromResult
190+
expect(memoize).toHaveBeenCalledTimes(8)
191+
})
126192
})

0 commit comments

Comments
 (0)