@@ -6,7 +6,7 @@ import { NgRedux } from '../../components/ng-redux';
6
6
import { select } from '../../decorators/select' ;
7
7
import * as sinon from 'sinon' ;
8
8
import * as sinonChai from 'sinon-chai' ;
9
-
9
+ import 'rxjs/add/operator/filter' ;
10
10
use ( sinonChai ) ;
11
11
12
12
function returnPojo ( ) {
@@ -304,3 +304,180 @@ describe('NgRedux Observable Store', () => {
304
304
) ;
305
305
} ) ;
306
306
} ) ;
307
+
308
+ describe ( 'Chained actions in subscriptions' , ( ) => {
309
+ interface IAppState {
310
+ keyword : string ;
311
+ keywordLength : number ;
312
+ } ;
313
+
314
+ let defaultState : IAppState ;
315
+ let rootReducer ;
316
+ let ngRedux ;
317
+ let doSearch = ( word ) => {
318
+ ngRedux . dispatch ( { type : 'SEARCH' , payload : word } ) ;
319
+ } ;
320
+ let doFetch = ( word ) => {
321
+ ngRedux . dispatch ( { type : 'SEARCH_RESULT' , payload : word . length } ) ;
322
+ } ;
323
+
324
+ beforeEach ( ( ) => {
325
+ defaultState = {
326
+ keyword : '' ,
327
+ keywordLength : - 1
328
+
329
+ } ;
330
+
331
+ rootReducer = ( state = defaultState , action ) => {
332
+ switch ( action . type ) {
333
+ case 'SEARCH' :
334
+ return Object . assign ( { } , state , { keyword : action . payload } ) ;
335
+ case 'SEARCH_RESULT' :
336
+ return Object . assign ( { } , state , { keywordLength : action . payload } ) ;
337
+ default :
338
+ return state ;
339
+ }
340
+ } ;
341
+
342
+ ngRedux = new NgRedux < IAppState > ( ) ;
343
+ ngRedux . configureStore ( rootReducer , defaultState ) ;
344
+ } ) ;
345
+
346
+
347
+ describe ( 'dispatching an action in a keyword$ before length$ happens' , ( ) => {
348
+ it ( `length sub should be called twice` , ( ) => {
349
+
350
+ let keyword$ = ngRedux . select ( n => n . keyword ) ;
351
+ let keyword = '' ;
352
+ let length ;
353
+ let length$ = ngRedux . select ( n => n . keywordLength ) ;
354
+ let lengthSpy = sinon . spy ( ( n ) => length = n ) ;
355
+ let lenSub ;
356
+ let keywordSub ;
357
+ keywordSub = keyword$ .
358
+ filter ( n => n !== '' )
359
+ . subscribe ( n => {
360
+ keyword = n ;
361
+ doFetch ( n ) ;
362
+ } ) ;
363
+
364
+ lenSub = length$ . subscribe ( lengthSpy ) ;
365
+
366
+ expect ( keyword ) . to . equal ( '' ) ;
367
+ expect ( length ) . to . equal ( - 1 ) ;
368
+
369
+ expect ( lengthSpy . calledOnce ) . to . be . equal ( true ) ;
370
+
371
+ doSearch ( 'test' ) ;
372
+
373
+ expect ( lengthSpy . calledTwice ) . to . be . equal ( true ) ;
374
+
375
+ expect ( keyword ) . to . equal ( 'test' ) ;
376
+ expect ( length ) . to . equal ( 4 ) ;
377
+ keywordSub . unsubscribe ( ) ;
378
+ lenSub . sunsubscribe ( ) ;
379
+ } ) ;
380
+
381
+ it ( `second sub should get most current state value` , ( ) => {
382
+
383
+ let keyword$ = ngRedux . select ( n => n . keyword ) ;
384
+ let keyword = '' ;
385
+ let length ;
386
+ let length$ = ngRedux . select ( n => n . keywordLength ) ;
387
+ let lengthSpy = sinon . spy ( ( n ) => length = n ) ;
388
+ let lenSub ;
389
+ let keywordSub ;
390
+ keywordSub = keyword$ .
391
+ filter ( n => n !== '' )
392
+ . subscribe ( n => {
393
+ keyword = n ;
394
+ doFetch ( n ) ;
395
+ } ) ;
396
+
397
+ lenSub = length$ . subscribe ( lengthSpy ) ;
398
+
399
+ expect ( keyword ) . to . equal ( '' ) ;
400
+ expect ( length ) . to . equal ( - 1 ) ;
401
+
402
+ expect ( lengthSpy . calledOnce ) . to . be . equal ( true ) ;
403
+
404
+ doSearch ( 'test' ) ;
405
+
406
+ expect ( keyword ) . to . equal ( 'test' ) ;
407
+ expect ( length ) . to . equal ( 4 ) ;
408
+ keywordSub . unsubscribe ( ) ;
409
+ lenSub . sunsubscribe ( ) ;
410
+ } ) ;
411
+ } ) ;
412
+
413
+ describe ( 'dispatching an action in a keyword$ after length$ happens' , ( ) => {
414
+ it ( `length sub should be called twice` , ( ) => {
415
+
416
+ let keyword$ = ngRedux . select ( n => n . keyword ) ;
417
+ let keyword = '' ;
418
+ let length ;
419
+ let length$ = ngRedux . select ( n => n . keywordLength ) ;
420
+ let lengthSpy = sinon . spy ( ( n ) => length = n ) ;
421
+ let lenSub ;
422
+ let keywordSub ;
423
+
424
+ lenSub = length$ . subscribe ( lengthSpy ) ;
425
+ keywordSub = keyword$ .
426
+ filter ( n => n !== '' )
427
+ . subscribe ( n => {
428
+ keyword = n ;
429
+ doFetch ( n ) ;
430
+ } ) ;
431
+
432
+
433
+
434
+ expect ( keyword ) . to . equal ( '' ) ;
435
+ expect ( length ) . to . equal ( - 1 ) ;
436
+
437
+ expect ( lengthSpy . calledOnce ) . to . be . equal ( true ) ;
438
+
439
+ doSearch ( 'test' ) ;
440
+
441
+ expect ( lengthSpy . calledTwice ) . to . be . equal ( true ) ;
442
+
443
+ expect ( keyword ) . to . equal ( 'test' ) ;
444
+ expect ( length ) . to . equal ( 4 ) ;
445
+ keywordSub . unsubscribe ( ) ;
446
+ lenSub . unsubscribe ( ) ;
447
+ } ) ;
448
+
449
+ it ( `first sub should get most current state value` , ( ) => {
450
+
451
+ let keyword$ = ngRedux . select ( n => n . keyword ) ;
452
+ let keyword = '' ;
453
+ let length ;
454
+ let length$ = ngRedux . select ( n => n . keywordLength ) ;
455
+ let lengthSpy = sinon . spy ( ( n ) => length = n ) ;
456
+ let lenSub ;
457
+ let keywordSub ;
458
+ lenSub = length$ . subscribe ( lengthSpy ) ;
459
+ keywordSub = keyword$ .
460
+ filter ( n => n !== '' )
461
+ . subscribe ( n => {
462
+ keyword = n ;
463
+ doFetch ( n ) ;
464
+ } ) ;
465
+
466
+
467
+
468
+ expect ( keyword ) . to . equal ( '' ) ;
469
+ expect ( length ) . to . equal ( - 1 ) ;
470
+
471
+ expect ( lengthSpy . calledOnce ) . to . be . equal ( true ) ;
472
+
473
+ doSearch ( 'test' ) ;
474
+
475
+ expect ( keyword ) . to . equal ( 'test' ) ;
476
+ expect ( length ) . to . equal ( 4 ) ;
477
+ keywordSub . unsubscribe ( ) ;
478
+ lenSub . unsubscribe ( ) ;
479
+ } ) ;
480
+ } ) ;
481
+
482
+
483
+ } ) ;
0 commit comments