@@ -35,7 +35,12 @@ import { server } from './mocks/server'
35
35
import type { UnknownAction } from 'redux'
36
36
import type { SubscriptionOptions } from '@reduxjs/toolkit/dist/query/core/apiState'
37
37
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'
39
44
import { delay } from '../../utils'
40
45
41
46
const MyContext = React . createContext < ReactReduxContextValue > ( null as any )
@@ -123,4 +128,65 @@ describe('buildCreateApi', () => {
123
128
`"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."`
124
129
)
125
130
} )
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
+ } )
126
192
} )
0 commit comments