add tests for completion and fix
This commit is contained in:
		
							parent
							
								
									567b696cec
								
							
						
					
					
						commit
						40cc5b9175
					
				
					 3 changed files with 126 additions and 2 deletions
				
			
		| 
						 | 
					@ -24,7 +24,10 @@ const nextSelection = (state) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const prevSelection = (state) => {
 | 
					const prevSelection = (state) => {
 | 
				
			||||||
  if (state.groupSelection < 0) {
 | 
					  if (state.groupSelection < 0) {
 | 
				
			||||||
    return [0, 0];
 | 
					    return [
 | 
				
			||||||
 | 
					      state.groups.length - 1,
 | 
				
			||||||
 | 
					      state.groups[state.groups.length - 1].items.length - 1
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (state.groupSelection === 0 && state.itemSelection === 0) {
 | 
					  if (state.groupSelection === 0 && state.itemSelection === 0) {
 | 
				
			||||||
    return [-1, -1];
 | 
					    return [-1, -1];
 | 
				
			||||||
| 
						 | 
					@ -41,7 +44,9 @@ export default function reducer(state = defaultState, action = {}) {
 | 
				
			||||||
  switch (action.type) {
 | 
					  switch (action.type) {
 | 
				
			||||||
  case actions.COMPLETION_SET_ITEMS:
 | 
					  case actions.COMPLETION_SET_ITEMS:
 | 
				
			||||||
    return Object.assign({}, state, {
 | 
					    return Object.assign({}, state, {
 | 
				
			||||||
      groups: action.groups
 | 
					      groups: action.groups,
 | 
				
			||||||
 | 
					      groupSelection: -1,
 | 
				
			||||||
 | 
					      itemSelection: -1,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  case actions.COMPLETION_SELECT_NEXT: {
 | 
					  case actions.COMPLETION_SELECT_NEXT: {
 | 
				
			||||||
    let next = nextSelection(state);
 | 
					    let next = nextSelection(state);
 | 
				
			||||||
| 
						 | 
					@ -57,5 +62,7 @@ export default function reducer(state = defaultState, action = {}) {
 | 
				
			||||||
      itemSelection: next[1],
 | 
					      itemSelection: next[1],
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  default:
 | 
				
			||||||
 | 
					    return defaultState;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										27
									
								
								test/actions/completion.test.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								test/actions/completion.test.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					import { expect } from "chai";
 | 
				
			||||||
 | 
					import actions from '../../src/actions';
 | 
				
			||||||
 | 
					import * as completionActions from '../../src/actions/completion';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe("completion actions", () => {
 | 
				
			||||||
 | 
					  describe('setItems', () => {
 | 
				
			||||||
 | 
					    it('create COMPLETION_SET_ITEMS action', () => {
 | 
				
			||||||
 | 
					      let action = completionActions.setItems([1, 2, 3]);
 | 
				
			||||||
 | 
					      expect(action.type).to.equal(actions.COMPLETION_SET_ITEMS);
 | 
				
			||||||
 | 
					      expect(action.groups).to.deep.equal([1, 2, 3]);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('selectNext', () => {
 | 
				
			||||||
 | 
					    it('create COMPLETION_SELECT_NEXT action', () => {
 | 
				
			||||||
 | 
					      let action = completionActions.selectNext();
 | 
				
			||||||
 | 
					      expect(action.type).to.equal(actions.COMPLETION_SELECT_NEXT);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('selectPrev', () => {
 | 
				
			||||||
 | 
					    it('create COMPLETION_SELECT_PREV action', () => {
 | 
				
			||||||
 | 
					      let action = completionActions.selectPrev();
 | 
				
			||||||
 | 
					      expect(action.type).to.equal(actions.COMPLETION_SELECT_PREV);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										90
									
								
								test/reducers/completion.test.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								test/reducers/completion.test.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,90 @@
 | 
				
			||||||
 | 
					import { expect } from "chai";
 | 
				
			||||||
 | 
					import actions from '../../src/actions';
 | 
				
			||||||
 | 
					import completionReducer from '../../src/reducers/completion';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe("completion reducer", () => {
 | 
				
			||||||
 | 
					  it ('return the initial state', () => {
 | 
				
			||||||
 | 
					    let state = completionReducer(undefined, {});
 | 
				
			||||||
 | 
					    expect(state).to.have.property('groupSelection', -1);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('itemSelection', -1);
 | 
				
			||||||
 | 
					    expect(state).to.have.deep.property('groups', []);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it ('return next state for COMPLETION_SET_ITEMS', () => {
 | 
				
			||||||
 | 
					    let state = {
 | 
				
			||||||
 | 
					      groupSelection: 0,
 | 
				
			||||||
 | 
					      itemSelection: 0,
 | 
				
			||||||
 | 
					      groups: [],
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    let action = {
 | 
				
			||||||
 | 
					      type: actions.COMPLETION_SET_ITEMS,
 | 
				
			||||||
 | 
					      groups: [{
 | 
				
			||||||
 | 
					        name: 'Apple',
 | 
				
			||||||
 | 
					        items: [1, 2, 3]
 | 
				
			||||||
 | 
					      }, {
 | 
				
			||||||
 | 
					        name: 'Banana',
 | 
				
			||||||
 | 
					        items: [4, 5, 6]
 | 
				
			||||||
 | 
					      }]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    state = completionReducer(state, action);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('groups', action.groups);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('groupSelection', -1);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('itemSelection', -1);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it ('return next state for COMPLETION_SELECT_NEXT', () => {
 | 
				
			||||||
 | 
					    let action = { type: actions.COMPLETION_SELECT_NEXT };
 | 
				
			||||||
 | 
					    let state = {
 | 
				
			||||||
 | 
					      groupSelection: -1,
 | 
				
			||||||
 | 
					      itemSelection: -1,
 | 
				
			||||||
 | 
					      groups: [{
 | 
				
			||||||
 | 
					        name: 'Apple',
 | 
				
			||||||
 | 
					        items: [1, 2]
 | 
				
			||||||
 | 
					      }, {
 | 
				
			||||||
 | 
					        name: 'Banana',
 | 
				
			||||||
 | 
					        items: [3]
 | 
				
			||||||
 | 
					      }]
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    state = completionReducer(state, action);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('groupSelection', 0);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('itemSelection', 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    state = completionReducer(state, action);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('groupSelection', 0);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('itemSelection', 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    state = completionReducer(state, action);
 | 
				
			||||||
 | 
					    state = completionReducer(state, action);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('groupSelection', -1);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('itemSelection', -1);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it ('return next state for COMPLETION_SELECT_PREV', () => {
 | 
				
			||||||
 | 
					    let action = { type: actions.COMPLETION_SELECT_PREV };
 | 
				
			||||||
 | 
					    let state = {
 | 
				
			||||||
 | 
					      groupSelection: -1,
 | 
				
			||||||
 | 
					      itemSelection: -1,
 | 
				
			||||||
 | 
					      groups: [{
 | 
				
			||||||
 | 
					        name: 'Apple',
 | 
				
			||||||
 | 
					        items: [1, 2]
 | 
				
			||||||
 | 
					      }, {
 | 
				
			||||||
 | 
					        name: 'Banana',
 | 
				
			||||||
 | 
					        items: [3]
 | 
				
			||||||
 | 
					      }]
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    state = completionReducer(state, action);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('groupSelection', 1);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('itemSelection', 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    state = completionReducer(state, action);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('groupSelection', 0);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('itemSelection', 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    state = completionReducer(state, action);
 | 
				
			||||||
 | 
					    state = completionReducer(state, action);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('groupSelection', -1);
 | 
				
			||||||
 | 
					    expect(state).to.have.property('itemSelection', -1);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
		Reference in a new issue