@@ -6,7 +6,7 @@ import featuresReducer from '../src/featuresReducer'
6
6
import featureStatesReducer from '../src/featureStatesReducer'
7
7
import loadFeatureMiddleware from '../src/loadFeatureMiddleware'
8
8
import { addFeature , loadFeature , setFeatureState , installFeature , loadInitialFeatures } from '../src/actions'
9
- import { expect } from 'chai'
9
+ import { expect , assert } from 'chai'
10
10
import sinon from 'sinon'
11
11
12
12
describe ( 'loadFeatureMiddleware' , ( ) => {
@@ -16,6 +16,17 @@ describe('loadFeatureMiddleware', () => {
16
16
return createStore ( reducer , initialState , applyMiddleware ( loadFeatureMiddleware ( config ) ) )
17
17
}
18
18
19
+ function createFullStore ( initialState , config ) {
20
+ return createStore (
21
+ combineReducers ( {
22
+ featureStates : featureStatesReducer ( config ) ,
23
+ features : featuresReducer ( config ) ,
24
+ } ) ,
25
+ initialState ,
26
+ applyMiddleware ( loadFeatureMiddleware ( config ) )
27
+ )
28
+ }
29
+
19
30
beforeEach ( ( ) => reducer . reset ( ) )
20
31
21
32
function tests ( createTestStore ) {
@@ -264,8 +275,100 @@ describe('loadFeatureMiddleware', () => {
264
275
} )
265
276
} )
266
277
} )
267
- it ( "returns a promise that rejects when any feature fails to load" , ( ) => {
268
-
278
+ it ( "returns a promise that rejects when any feature fails to load" , async ( ) => {
279
+ const error = new Error ( "test!" )
280
+ const store = createStore ( combineReducers ( {
281
+ featureStates : featureStatesReducer ( ) ,
282
+ features : featuresReducer ( ) ,
283
+ } ) , {
284
+ featureStates : {
285
+ f1 : 'LOADED' ,
286
+ f2 : 'LOADED' ,
287
+ f3 : 'NOT_LOADED' ,
288
+ } ,
289
+ features : {
290
+ f1 : {
291
+ load : ( ) => Promise . reject ( error )
292
+ } ,
293
+ f2 : {
294
+ load : ( ) => new Promise ( resolve => setTimeout ( ( ) => resolve ( { b : 2 } ) , 100 ) )
295
+ } ,
296
+ f3 : { } ,
297
+ }
298
+ } , applyMiddleware ( loadFeatureMiddleware ( ) ) )
299
+ try {
300
+ await store . dispatch ( loadInitialFeatures ( ) )
301
+ assert . fail ( 'loadInitialFeatures should have rejected' )
302
+ } catch ( e ) {
303
+ expect ( e ) . to . equal ( error )
304
+ }
305
+ expect ( store . getState ( ) . featureStates ) . to . deep . equal ( {
306
+ f1 : error ,
307
+ f2 : 'LOADING' ,
308
+ f3 : 'NOT_LOADED' ,
309
+ } )
310
+ } )
311
+ } )
312
+ describe ( 'on features with dependencies' , ( ) => {
313
+ it ( "loads dependencies" , async ( ) => {
314
+ const loadedDependency = { something : 'cool' }
315
+ const loadedFeature = { hello : 'world' }
316
+ const store = createFullStore ( {
317
+ featureStates : {
318
+ f1 : 'NOT_LOADED' ,
319
+ f2 : 'NOT_LOADED' ,
320
+ } ,
321
+ features : {
322
+ f1 : {
323
+ load : ( store ) => Promise . resolve ( loadedDependency )
324
+ } ,
325
+ f2 : {
326
+ dependencies : [ 'f1' ] ,
327
+ load : ( store ) => Promise . resolve ( loadedFeature )
328
+ }
329
+ }
330
+ } )
331
+ const result = await store . dispatch ( loadFeature ( 'f2' ) )
332
+ expect ( result ) . to . equal ( loadedFeature )
333
+ expect ( store . getState ( ) ) . to . deep . equal ( {
334
+ featureStates : {
335
+ f1 : 'LOADED' ,
336
+ f2 : 'LOADED' ,
337
+ } ,
338
+ features : {
339
+ f1 : loadedDependency ,
340
+ f2 : loadedFeature ,
341
+ }
342
+ } )
343
+ } )
344
+ it ( "rejects if any dependencies fail to load" , async ( ) => {
345
+ const loadedFeature = { hello : 'world' }
346
+ const error = new Error ( "test!" )
347
+ const store = createFullStore ( {
348
+ featureStates : {
349
+ f1 : 'NOT_LOADED' ,
350
+ f2 : 'NOT_LOADED' ,
351
+ } ,
352
+ features : {
353
+ f1 : {
354
+ load : ( store ) => Promise . reject ( error )
355
+ } ,
356
+ f2 : {
357
+ dependencies : [ 'f1' ] ,
358
+ load : ( store ) => Promise . resolve ( loadedFeature )
359
+ }
360
+ }
361
+ } )
362
+ try {
363
+ await store . dispatch ( loadFeature ( 'f2' ) )
364
+ assert . fail ( 'loadFeature should have rejected' )
365
+ } catch ( e ) {
366
+ expect ( e ) . to . equal ( error )
367
+ }
368
+ expect ( store . getState ( ) . featureStates ) . to . deep . equal ( {
369
+ f1 : error ,
370
+ f2 : error ,
371
+ } )
269
372
} )
270
373
} )
271
374
}
0 commit comments