reduce-redux
Version:
A helper library to reduce redux boilerplate and make developers life easier.
81 lines (63 loc) • 2.91 kB
JavaScript
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)
})
})
})