@@ -35,7 +35,12 @@ import { server } from './mocks/server'
3535import type { UnknownAction } from 'redux'
3636import type { SubscriptionOptions } from '@reduxjs/toolkit/dist/query/core/apiState'
3737import 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'
3944import { delay } from '../../utils'
4045
4146const 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