UNPKG

reduce-redux

Version:

A helper library to reduce redux boilerplate and make developers life easier.

81 lines (63 loc) 2.91 kB
const assert = require('assert') const sinon = require('sinon') const createReducer = require('./').createReducer describe('createReducer', () => { describe('default behaviour and primitive data type state', () => { const spyAction = () => ({ type: 'SPY_ACTION' }) const setState = state => ({ type: 'SET_STATE', state }) const randomAction = () => ({ type: 'RANDOM_ACTION' }) const spy = sinon.spy() const initialState = 'State' const actionMap = { SPY_ACTION: spy, SET_STATE: action => action.state } it('should return initial state when no previous state is provided', () => { const reducer = createReducer(initialState, actionMap) const result = reducer(undefined) assert.strictEqual(result, initialState) }) it('should return previous state if no action is provided in the given action map', () => { const reducer = createReducer(initialState, actionMap) const result = reducer(initialState, randomAction()) assert.strictEqual(result, initialState) }) it('should return relevant action map function result', () => { const reducer = createReducer(initialState, actionMap) const result = reducer(initialState, setState('New name')) assert.strictEqual(result, 'New name') }) it('should provide action and state for the given action map function', () => { const reducer = createReducer(initialState, actionMap) reducer(initialState, spyAction()) assert.ok(spy.calledWithExactly(spyAction(), initialState)) }) }) describe('object data type state', () => { const setPersonId = id => ({ type: 'PERSON_SET_ID', id }) const setPersonName = name => ({ type: 'PERSON_SET_NAME', name }) const deletePerson = () => ({ type: 'PERSON_DELETE' }) const initialState = { name: 'Old name', id: 123 } const actionMap = { PERSON_SET_NAME: action => ({ name: action.name }), PERSON_SET_ID: action => ({ id: action.id }), PERSON_DELETE: () => null } it('should merge returned state and previous state if both are objects', () => { const reducer = createReducer(initialState, actionMap) const result = reducer(initialState, setPersonName('New name')) assert.deepEqual(result, { name: 'New name', id: 123 }) }) it('should set the state correctly with different actions', () => { const reducer = createReducer(initialState, actionMap) const result = reducer(initialState, setPersonName('New name')) const result2 = reducer(result, setPersonId(456)) assert.deepEqual(result2, { name: 'New name', id: 456 }) }) it('should set null if it is returned by action map function', () => { const reducer = createReducer(initialState, actionMap) const result = reducer(initialState, deletePerson()) assert.equal(result, null) }) }) })