diff --git a/client/src/js/__tests__/reducer-servers.test.js b/client/src/js/__tests__/reducer-servers.test.js new file mode 100644 index 00000000..fa233b68 --- /dev/null +++ b/client/src/js/__tests__/reducer-servers.test.js @@ -0,0 +1,128 @@ +import Immutable from 'immutable'; +import reducer from '../reducers/servers'; +import * as actions from '../actions'; +import { connect } from '../actions/server'; + +describe('reducers/servers', () => { + it('adds the server on CONNECT', () => { + let state = reducer(undefined, connect('127.0.0.1:1337', 'nick', {})); + + expect(state.toJS()).toEqual({ + '127.0.0.1': { + connected: false, + name: '127.0.0.1', + nick: 'nick' + } + }); + + state = reducer(state, connect('127.0.0.1:1337', 'nick', {})); + + expect(state.toJS()).toEqual({ + '127.0.0.1': { + connected: false, + name: '127.0.0.1', + nick: 'nick' + } + }); + + state = reducer(state, connect('127.0.0.2:1337', 'nick', { + name: 'srv' + })); + + expect(state.toJS()).toEqual({ + '127.0.0.1': { + connected: false, + name: '127.0.0.1', + nick: 'nick' + }, + '127.0.0.2': { + connected: false, + name: 'srv', + nick: 'nick' + } + }); + }); + + it('removes the server on DISCONNECT', () => { + let state = Immutable.fromJS({ + srv: {}, + srv2: {} + }); + + state = reducer(state, { + type: actions.DISCONNECT, + server: 'srv2' + }); + + expect(state.toJS()).toEqual({ + srv: {} + }); + }); + + it('updates the nick on SOCKET_NICK', () => { + let state = reducer(undefined, connect('127.0.0.1:1337', 'nick', {})); + state = reducer(state, { + type: actions.SOCKET_NICK, + server: '127.0.0.1', + old: 'nick', + new: 'nick2' + }); + + expect(state.toJS()).toEqual({ + '127.0.0.1': { + connected: false, + name: '127.0.0.1', + nick: 'nick2' + } + }); + }); + + it('adds the servers on SOCKET_SERVERS', () => { + let state = reducer(undefined, { + type: 'SOCKET_SERVERS', + data: [ + { + host: '127.0.0.1', + name: 'stuff', + nick: 'nick', + connected: true + }, + { + host: '127.0.0.2', + name: 'stuffz', + nick: 'nick2', + connected: false + }, + ] + }); + + expect(state.toJS()).toEqual({ + '127.0.0.1': { + name: 'stuff', + nick: 'nick', + connected: true + }, + '127.0.0.2': { + name: 'stuffz', + nick: 'nick2', + connected: false + } + }); + }); + + it('updates connection status on SOCKET_CONNECTION_UPDATE', () => { + let state = reducer(undefined, connect('127.0.0.1:1337', 'nick', {})); + state = reducer(state, { + type: actions.SOCKET_CONNECTION_UPDATE, + '127.0.0.1': true + }); + + expect(state.toJS()).toEqual({ + '127.0.0.1': { + name: '127.0.0.1', + nick: 'nick', + connected: true + } + }); + }); +}); diff --git a/client/src/js/reducers/servers.js b/client/src/js/reducers/servers.js index 3a63f7e5..1a8e9f42 100644 --- a/client/src/js/reducers/servers.js +++ b/client/src/js/reducers/servers.js @@ -1,5 +1,4 @@ import { Map, Record } from 'immutable'; -import forEach from 'lodash/forEach'; import createReducer from '../util/createReducer'; import * as actions from '../actions'; @@ -48,10 +47,12 @@ export default createReducer(Map(), { }, [actions.SOCKET_CONNECTION_UPDATE](state, action) { - return state.withMutations(s => forEach(action, (connected, server) => { - if (s.has(server)) { - s.setIn([server, 'connected'], connected); - } - })); + return state.withMutations(s => + Object.keys(action).forEach(server => { + if (s.has(server)) { + s.setIn([server, 'connected'], action[server]); + } + }) + ); } });