1 | import { AnyAction, Middleware } from 'redux'
|
2 | import { getDefaultMiddleware, MiddlewareArray, configureStore } from '.'
|
3 | import thunk, { ThunkAction } from 'redux-thunk'
|
4 |
|
5 | describe('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 |
|
119 | describe('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 |
|
129 | expect(prepended).toEqual([middleware1, ...defaultMiddleware])
|
130 |
|
131 | expect(prepended).toBeInstanceOf(MiddlewareArray)
|
132 |
|
133 | expect(prepended).not.toEqual(defaultMiddleware)
|
134 |
|
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 |
|
142 | expect(prepended).toEqual([middleware1, middleware2, ...defaultMiddleware])
|
143 |
|
144 | expect(prepended).toBeInstanceOf(MiddlewareArray)
|
145 |
|
146 | expect(prepended).not.toEqual(defaultMiddleware)
|
147 |
|
148 | expect(defaultMiddleware).toEqual(originalDefaultMiddleware)
|
149 | })
|
150 |
|
151 | test('allows to prepend multiple values (rest)', () => {
|
152 | const prepended = defaultMiddleware.prepend(middleware1, middleware2)
|
153 |
|
154 |
|
155 | expect(prepended).toEqual([middleware1, middleware2, ...defaultMiddleware])
|
156 |
|
157 | expect(prepended).toBeInstanceOf(MiddlewareArray)
|
158 |
|
159 | expect(prepended).not.toEqual(defaultMiddleware)
|
160 |
|
161 | expect(defaultMiddleware).toEqual(originalDefaultMiddleware)
|
162 | })
|
163 |
|
164 | test('allows to concat a single value', () => {
|
165 | const concatenated = defaultMiddleware.concat(middleware1)
|
166 |
|
167 |
|
168 | expect(concatenated).toEqual([...defaultMiddleware, middleware1])
|
169 |
|
170 | expect(concatenated).toBeInstanceOf(MiddlewareArray)
|
171 |
|
172 | expect(concatenated).not.toEqual(defaultMiddleware)
|
173 |
|
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 |
|
181 | expect(concatenated).toEqual([
|
182 | ...defaultMiddleware,
|
183 | middleware1,
|
184 | middleware2
|
185 | ])
|
186 |
|
187 | expect(concatenated).toBeInstanceOf(MiddlewareArray)
|
188 |
|
189 | expect(concatenated).not.toEqual(defaultMiddleware)
|
190 |
|
191 | expect(defaultMiddleware).toEqual(originalDefaultMiddleware)
|
192 | })
|
193 |
|
194 | test('allows to concat multiple values (rest)', () => {
|
195 | const concatenated = defaultMiddleware.concat(middleware1, middleware2)
|
196 |
|
197 |
|
198 | expect(concatenated).toEqual([
|
199 | ...defaultMiddleware,
|
200 | middleware1,
|
201 | middleware2
|
202 | ])
|
203 |
|
204 | expect(concatenated).toBeInstanceOf(MiddlewareArray)
|
205 |
|
206 | expect(concatenated).not.toEqual(defaultMiddleware)
|
207 |
|
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 | })
|