133 lines
2.8 KiB
JavaScript
133 lines
2.8 KiB
JavaScript
|
import {List, Map, fromJS} from 'immutable';
|
||
|
import {expect} from 'chai';
|
||
|
|
||
|
import reducer from '../src/reducer';
|
||
|
|
||
|
describe('reducer', () => {
|
||
|
|
||
|
it('handles SET_STATE', () => {
|
||
|
const initialState = Map();
|
||
|
const action = {
|
||
|
type: 'SET_STATE',
|
||
|
state: Map({
|
||
|
vote: Map({
|
||
|
pair: List.of('Trainspotting', '28 Days Later'),
|
||
|
tally: Map({
|
||
|
Trainspotting: 1
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
};
|
||
|
const nextState = reducer(initialState, action);
|
||
|
|
||
|
expect(nextState).to.equal(fromJS({
|
||
|
vote: {
|
||
|
pair: ['Trainspotting', '28 Days Later'],
|
||
|
tally: {Trainspotting: 1}
|
||
|
}
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
it('handles SET_STATE with plain JS payload', () => {
|
||
|
const initialState = Map();
|
||
|
const action = {
|
||
|
type: 'SET_STATE',
|
||
|
state: {
|
||
|
vote: {
|
||
|
pair: ['Trainspotting', '28 Days Later'],
|
||
|
tally: {Trainspotting: 1}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
const nextState = reducer(initialState, action);
|
||
|
|
||
|
expect(nextState).to.equal(fromJS({
|
||
|
vote: {
|
||
|
pair: ['Trainspotting', '28 Days Later'],
|
||
|
tally: {Trainspotting: 1}
|
||
|
}
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
it('handles SET_STATE without initial state', () => {
|
||
|
const action = {
|
||
|
type: 'SET_STATE',
|
||
|
state: {
|
||
|
vote: {
|
||
|
pair: ['Trainspotting', '28 Days Later'],
|
||
|
tally: {Trainspotting: 1}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
const nextState = reducer(undefined, action);
|
||
|
|
||
|
expect(nextState).to.equal(fromJS({
|
||
|
vote: {
|
||
|
pair: ['Trainspotting', '28 Days Later'],
|
||
|
tally: {Trainspotting: 1}
|
||
|
}
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
it('handles VOTE by setting hasVoted', () => {
|
||
|
const state = fromJS({
|
||
|
vote: {
|
||
|
pair: ['Trainspotting', '28 Days Later'],
|
||
|
tally: {Trainspotting: 1}
|
||
|
}
|
||
|
});
|
||
|
const action = {type: 'VOTE', entry: 'Trainspotting'};
|
||
|
const nextState = reducer(state, action);
|
||
|
|
||
|
expect(nextState).to.equal(fromJS({
|
||
|
vote: {
|
||
|
pair: ['Trainspotting', '28 Days Later'],
|
||
|
tally: {Trainspotting: 1}
|
||
|
},
|
||
|
hasVoted: 'Trainspotting'
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
it('does not set hasVoted for VOTE on invalid entry', () => {
|
||
|
const state = fromJS({
|
||
|
vote: {
|
||
|
pair: ['Trainspotting', '28 Days Later'],
|
||
|
tally: {Trainspotting: 1}
|
||
|
}
|
||
|
});
|
||
|
const action = {type: 'VOTE', entry: 'Sunshine'};
|
||
|
const nextState = reducer(state, action);
|
||
|
|
||
|
expect(nextState).to.equal(fromJS({
|
||
|
vote: {
|
||
|
pair: ['Trainspotting', '28 Days Later'],
|
||
|
tally: {Trainspotting: 1}
|
||
|
}
|
||
|
}));
|
||
|
});
|
||
|
|
||
|
it('removes hasVoted on SET_STATE if pair changes', () => {
|
||
|
const initialState = fromJS({
|
||
|
vote: {
|
||
|
pair: ['Trainspotting', '28 Days Later'],
|
||
|
tally: {Trainspotting: 1}
|
||
|
},
|
||
|
hasVoted: 'Trainspotting'
|
||
|
});
|
||
|
const action = {
|
||
|
type: 'SET_STATE',
|
||
|
state: {
|
||
|
vote: {
|
||
|
pair: ['Sunshine', 'Slumdog Millionaire']
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
const nextState = reducer(initialState, action);
|
||
|
|
||
|
expect(nextState).to.equal(fromJS({
|
||
|
vote: {
|
||
|
pair: ['Sunshine', 'Slumdog Millionaire']
|
||
|
}
|
||
|
}));
|
||
|
});
|
||
|
});
|