Skip to content

Commit c8747fa

Browse files
author
Evan Schultz
committed
Unit tests for issue angular-redux#149
1 parent 3816ca7 commit c8747fa

File tree

1 file changed

+178
-1
lines changed

1 file changed

+178
-1
lines changed

src/___tests___/components/ng-redux.spec.ts

Lines changed: 178 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { NgRedux } from '../../components/ng-redux';
66
import { select } from '../../decorators/select';
77
import * as sinon from 'sinon';
88
import * as sinonChai from 'sinon-chai';
9-
9+
import 'rxjs/add/operator/filter';
1010
use(sinonChai);
1111

1212
function returnPojo() {
@@ -304,3 +304,180 @@ describe('NgRedux Observable Store', () => {
304304
);
305305
});
306306
});
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

Comments
 (0)