UNPKG

7.38 kBPlain TextView Raw
1import { AnyAction, Middleware } from 'redux'
2import { getDefaultMiddleware, MiddlewareArray, configureStore } from '.'
3import thunk, { ThunkAction } from 'redux-thunk'
4
5describe('getDefaultMiddleware', () => {
6 const ORIGINAL_NODE_ENV = process.env.NODE_ENV
7
8 afterEach(() => {
9 process.env.NODE_ENV = ORIGINAL_NODE_ENV
10 })
11
12 it('returns an array with only redux-thunk in production', () => {
13 process.env.NODE_ENV = 'production'
14
15 expect(getDefaultMiddleware()).toEqual([thunk])
16 })
17
18 it('returns an array with additional middleware in development', () => {
19 const middleware = getDefaultMiddleware()
20 expect(middleware).toContain(thunk)
21 expect(middleware.length).toBeGreaterThan(1)
22 })
23
24 it('removes the thunk middleware if disabled', () => {
25 const middleware = getDefaultMiddleware({ thunk: false })
26 expect(middleware.includes(thunk)).toBe(false)
27 expect(middleware.length).toBe(2)
28 })
29
30 it('removes the immutable middleware if disabled', () => {
31 const defaultMiddleware = getDefaultMiddleware()
32 const middleware = getDefaultMiddleware({ immutableCheck: false })
33 expect(middleware.length).toBe(defaultMiddleware.length - 1)
34 })
35
36 it('removes the serializable middleware if disabled', () => {
37 const defaultMiddleware = getDefaultMiddleware()
38 const middleware = getDefaultMiddleware({ serializableCheck: false })
39 expect(middleware.length).toBe(defaultMiddleware.length - 1)
40 })
41
42 it('allows passing options to thunk', () => {
43 const extraArgument = 42
44 const middleware = getDefaultMiddleware({
45 thunk: { extraArgument },
46 immutableCheck: false,
47 serializableCheck: false
48 })
49
50 const testThunk: ThunkAction<void, {}, number, AnyAction> = (
51 dispatch,
52 getState,
53 extraArg
54 ) => {
55 expect(extraArg).toBe(extraArgument)
56 }
57
58 const reducer = () => ({})
59
60 const store = configureStore({
61 reducer,
62 middleware
63 })
64
65 store.dispatch(testThunk)
66 })
67
68 it('allows passing options to immutableCheck', () => {
69 let immutableCheckWasCalled = false
70
71 const middleware = getDefaultMiddleware({
72 thunk: false,
73 immutableCheck: {
74 isImmutable: () => {
75 immutableCheckWasCalled = true
76 return true
77 }
78 },
79 serializableCheck: false
80 })
81
82 const reducer = () => ({})
83
84 const store = configureStore({
85 reducer,
86 middleware
87 })
88
89 expect(immutableCheckWasCalled).toBe(true)
90 })
91
92 it('allows passing options to serializableCheck', () => {
93 let serializableCheckWasCalled = false
94
95 const middleware = getDefaultMiddleware({
96 thunk: false,
97 immutableCheck: false,
98 serializableCheck: {
99 isSerializable: () => {
100 serializableCheckWasCalled = true
101 return true
102 }
103 }
104 })
105
106 const reducer = () => ({})
107
108 const store = configureStore({
109 reducer,
110 middleware
111 })
112
113 store.dispatch({ type: 'TEST_ACTION' })
114
115 expect(serializableCheckWasCalled).toBe(true)
116 })
117})
118
119describe('MiddlewareArray functionality', () => {
120 const middleware1: Middleware = () => next => action => next(action)
121 const middleware2: Middleware = () => next => action => next(action)
122 const defaultMiddleware = getDefaultMiddleware()
123 const originalDefaultMiddleware = [...defaultMiddleware]
124
125 test('allows to prepend a single value', () => {
126 const prepended = defaultMiddleware.prepend(middleware1)
127
128 // value is prepended
129 expect(prepended).toEqual([middleware1, ...defaultMiddleware])
130 // returned value is of correct type
131 expect(prepended).toBeInstanceOf(MiddlewareArray)
132 // prepended is a new array
133 expect(prepended).not.toEqual(defaultMiddleware)
134 // defaultMiddleware is not modified
135 expect(defaultMiddleware).toEqual(originalDefaultMiddleware)
136 })
137
138 test('allows to prepend multiple values (array as first argument)', () => {
139 const prepended = defaultMiddleware.prepend([middleware1, middleware2])
140
141 // value is prepended
142 expect(prepended).toEqual([middleware1, middleware2, ...defaultMiddleware])
143 // returned value is of correct type
144 expect(prepended).toBeInstanceOf(MiddlewareArray)
145 // prepended is a new array
146 expect(prepended).not.toEqual(defaultMiddleware)
147 // defaultMiddleware is not modified
148 expect(defaultMiddleware).toEqual(originalDefaultMiddleware)
149 })
150
151 test('allows to prepend multiple values (rest)', () => {
152 const prepended = defaultMiddleware.prepend(middleware1, middleware2)
153
154 // value is prepended
155 expect(prepended).toEqual([middleware1, middleware2, ...defaultMiddleware])
156 // returned value is of correct type
157 expect(prepended).toBeInstanceOf(MiddlewareArray)
158 // prepended is a new array
159 expect(prepended).not.toEqual(defaultMiddleware)
160 // defaultMiddleware is not modified
161 expect(defaultMiddleware).toEqual(originalDefaultMiddleware)
162 })
163
164 test('allows to concat a single value', () => {
165 const concatenated = defaultMiddleware.concat(middleware1)
166
167 // value is concatenated
168 expect(concatenated).toEqual([...defaultMiddleware, middleware1])
169 // returned value is of correct type
170 expect(concatenated).toBeInstanceOf(MiddlewareArray)
171 // concatenated is a new array
172 expect(concatenated).not.toEqual(defaultMiddleware)
173 // defaultMiddleware is not modified
174 expect(defaultMiddleware).toEqual(originalDefaultMiddleware)
175 })
176
177 test('allows to concat multiple values (array as first argument)', () => {
178 const concatenated = defaultMiddleware.concat([middleware1, middleware2])
179
180 // value is concatenated
181 expect(concatenated).toEqual([
182 ...defaultMiddleware,
183 middleware1,
184 middleware2
185 ])
186 // returned value is of correct type
187 expect(concatenated).toBeInstanceOf(MiddlewareArray)
188 // concatenated is a new array
189 expect(concatenated).not.toEqual(defaultMiddleware)
190 // defaultMiddleware is not modified
191 expect(defaultMiddleware).toEqual(originalDefaultMiddleware)
192 })
193
194 test('allows to concat multiple values (rest)', () => {
195 const concatenated = defaultMiddleware.concat(middleware1, middleware2)
196
197 // value is concatenated
198 expect(concatenated).toEqual([
199 ...defaultMiddleware,
200 middleware1,
201 middleware2
202 ])
203 // returned value is of correct type
204 expect(concatenated).toBeInstanceOf(MiddlewareArray)
205 // concatenated is a new array
206 expect(concatenated).not.toEqual(defaultMiddleware)
207 // defaultMiddleware is not modified
208 expect(defaultMiddleware).toEqual(originalDefaultMiddleware)
209 })
210
211 test('allows to concat and then prepend', () => {
212 const concatenated = defaultMiddleware
213 .concat(middleware1)
214 .prepend(middleware2)
215
216 expect(concatenated).toEqual([
217 middleware2,
218 ...defaultMiddleware,
219 middleware1
220 ])
221 })
222
223 test('allows to prepend and then concat', () => {
224 const concatenated = defaultMiddleware
225 .prepend(middleware2)
226 .concat(middleware1)
227
228 expect(concatenated).toEqual([
229 middleware2,
230 ...defaultMiddleware,
231 middleware1
232 ])
233 })
234})