From 6d3201d1feecea2c868a01dab02a5544abba802e Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Mon, 11 Nov 2019 23:10:10 -0300 Subject: [PATCH] Fix broken tests --- src/client/actions/CallActions.test.js | 24 ++++++++++++++ src/client/actions/ChatActions.js | 5 --- src/client/actions/PeerActions.js | 18 ++++++++--- src/client/actions/PeerActions.test.js | 23 +++++++------ src/client/actions/SocketActions.js | 13 -------- src/client/components/App.js | 3 -- src/client/components/Chat.js | 32 +++++++++++------- src/client/components/Input.js | 45 ++++++++++---------------- src/client/components/Input.test.js | 9 +++--- src/client/components/Toolbar.js | 4 +-- src/client/components/Toolbar.test.js | 35 +++++++++++++++++--- src/client/constants.js | 3 -- src/client/containers/App.js | 1 - src/client/reducers/messages.js | 2 -- src/client/reducers/messages.test.js | 8 ----- src/server/socket.js | 23 +------------ src/server/socket.test.js | 5 ++- 17 files changed, 124 insertions(+), 129 deletions(-) diff --git a/src/client/actions/CallActions.test.js b/src/client/actions/CallActions.test.js index 375c1bb..bc3f6d6 100644 --- a/src/client/actions/CallActions.test.js +++ b/src/client/actions/CallActions.test.js @@ -39,6 +39,14 @@ describe('reducers/alerts', () => { message: 'Connected to server socket', type: 'warning' } + }, { + type: constants.MESSAGE_ADD, + payload: { + image: null, + message: 'Connected to server socket', + timestamp: jasmine.any(String), + userId: '[PeerCalls]' + } }]) await promise expect(SocketActions.handshake.mock.calls).toEqual([[{ @@ -62,6 +70,14 @@ describe('reducers/alerts', () => { message: 'Connected to server socket', type: 'warning' } + }, { + type: constants.MESSAGE_ADD, + payload: { + image: null, + message: 'Connected to server socket', + timestamp: jasmine.any(String), + userId: '[PeerCalls]' + } }, { type: constants.NOTIFY, payload: { @@ -69,6 +85,14 @@ describe('reducers/alerts', () => { message: 'Server socket disconnected', type: 'error' } + }, { + type: constants.MESSAGE_ADD, + payload: { + image: null, + message: 'Server socket disconnected', + timestamp: jasmine.any(String), + userId: '[PeerCalls]' + } }]) await promise }) diff --git a/src/client/actions/ChatActions.js b/src/client/actions/ChatActions.js index e057a60..ef01410 100644 --- a/src/client/actions/ChatActions.js +++ b/src/client/actions/ChatActions.js @@ -9,8 +9,3 @@ export const addMessage = ({ userId, message, timestamp, image }) => ({ image } }) - -export const loadHistory = messages => ({ - type: constants.MESSAGES_HISTORY, - messages -}) diff --git a/src/client/actions/PeerActions.js b/src/client/actions/PeerActions.js index c05a10d..eba865e 100644 --- a/src/client/actions/PeerActions.js +++ b/src/client/actions/PeerActions.js @@ -49,7 +49,7 @@ class PeerHandler { const { dispatch, user } = this const message = JSON.parse(new window.TextDecoder('utf-8').decode(object)) debug('peer: %s, message: %o', user.id, object) - switch (object.type) { + switch (message.type) { case 'file': dispatch(ChatActions.addMessage({ userId: user.id, @@ -143,18 +143,26 @@ export const destroyPeers = () => ({ export const sendMessage = message => (dispatch, getState) => { const { peers } = getState() - dispatch(NotifyActions.info('Sending message type: {0} to {1} peers.', - message.type, Object.keys(peers).length)) - _.each(peers, peer => { + debug('Sending message type: %s to %s peers.', + message.type, Object.keys(peers).length) + _.each(peers, (peer, userId) => { switch (message.type) { case 'file': dispatch(ChatActions.addMessage({ userId: 'You', message: 'Send file: "' + - message.payload.name + '" to peer: ' + peer._id, + message.payload.name + '" to peer: ' + userId, timestamp: new Date().toLocaleString(), image: message.payload.data })) + break + default: + dispatch(ChatActions.addMessage({ + userId: 'You', + message: message.payload, + timestamp: new Date().toLocaleString(), + image: null + })) } peer.send(JSON.stringify(message)) }) diff --git a/src/client/actions/PeerActions.test.js b/src/client/actions/PeerActions.test.js index e011607..45f46a0 100644 --- a/src/client/actions/PeerActions.test.js +++ b/src/client/actions/PeerActions.test.js @@ -96,16 +96,15 @@ describe('PeerActions', () => { }) it('decodes a message', () => { - const message = 'test' - const object = JSON.stringify({ message }) + const payload = 'test' + const object = JSON.stringify({ payload }) peer.emit('data', Buffer.from(object, 'utf-8')) - const { notifications } = store.getState() - const keys = Object.keys(notifications) - const n = notifications[keys[keys.length - 1]] - expect(n).toEqual({ - id: jasmine.any(String), - type: 'info', - message: `${user.id}: ${message}` + const { messages } = store.getState() + expect(messages[messages.length - 1]).toEqual({ + userId: 'user2', + timestamp: jasmine.any(String), + image: null, + message: 'test' }) }) }) @@ -158,12 +157,12 @@ describe('PeerActions', () => { }) it('sends a message to all peers', () => { - store.dispatch(PeerActions.sendMessage('test')) + store.dispatch(PeerActions.sendMessage({ payload: 'test', type: 'text' })) const { peers } = store.getState() expect(peers['user2'].send.mock.calls) - .toEqual([[ '{"message":"test"}' ]]) + .toEqual([[ '{"payload":"test","type":"text"}' ]]) expect(peers['user3'].send.mock.calls) - .toEqual([[ '{"message":"test"}' ]]) + .toEqual([[ '{"payload":"test","type":"text"}' ]]) }) }) diff --git a/src/client/actions/SocketActions.js b/src/client/actions/SocketActions.js index f017d14..69c6429 100644 --- a/src/client/actions/SocketActions.js +++ b/src/client/actions/SocketActions.js @@ -1,4 +1,3 @@ -import * as ChatActions from '../actions/ChatActions.js' import * as NotifyActions from '../actions/NotifyActions.js' import * as PeerActions from '../actions/PeerActions.js' import * as constants from '../constants.js' @@ -42,16 +41,6 @@ class SocketHandler { .filter(id => !newUsersMap[id]) .forEach(id => peers[id].destroy()) } - handleMessages = (messages) => { - const { dispatch } = this - debug('socket messages: %o', messages) - dispatch(ChatActions.loadHistory(messages)) - } - handleNewMessage = (payload) => { - const { dispatch } = this - debug('socket message: %o', payload) - dispatch(ChatActions.addMessage(payload)) - } } export function handshake ({ socket, roomName, stream }) { @@ -66,8 +55,6 @@ export function handshake ({ socket, roomName, stream }) { socket.on(constants.SOCKET_EVENT_SIGNAL, handler.handleSignal) socket.on(constants.SOCKET_EVENT_USERS, handler.handleUsers) - socket.on(constants.SOCKET_EVENT_MESSAGES, handler.handleMessages) - socket.on(constants.SOCKET_EVENT_NEW_MESSAGE, handler.handleNewMessage) debug('socket.id: %s', socket.id) debug('emit ready for room: %s', roomName) diff --git a/src/client/components/App.js b/src/client/components/App.js index 5cdd1d7..79ce691 100644 --- a/src/client/components/App.js +++ b/src/client/components/App.js @@ -15,7 +15,6 @@ export default class App extends React.PureComponent { dismissAlert: PropTypes.func.isRequired, init: PropTypes.func.isRequired, notifications: PropTypes.objectOf(NotificationPropTypes).isRequired, - notify: PropTypes.func.isRequired, messages: PropTypes.arrayOf(MessagePropTypes).isRequired, peers: PropTypes.object.isRequired, sendMessage: PropTypes.func.isRequired, @@ -55,7 +54,6 @@ export default class App extends React.PureComponent { alerts, dismissAlert, notifications, - notify, messages, onSendFile, peers, @@ -79,7 +77,6 @@ export default class App extends React.PureComponent { + {message.image && ( + + )} + {message.message} +

+ ) +} + +Message.propTypes = { + message: MessagePropTypes +} + export default class Chat extends React.PureComponent { static propTypes = { visible: PropTypes.bool.isRequired, messages: PropTypes.arrayOf(MessagePropTypes).isRequired, - notify: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired, sendMessage: PropTypes.func.isRequired, videos: PropTypes.object.isRequired @@ -35,7 +49,7 @@ export default class Chat extends React.PureComponent { this.scrollToBottom() } render () { - const { messages, videos, notify, sendMessage } = this.props + const { messages, videos, sendMessage } = this.props return (
(
- {message.userId === socket.id ? ( + {message.userId === 'You' ? (
@@ -61,7 +75,7 @@ export default class Chat extends React.PureComponent { -

{message.message}

+
{message.image ? ( @@ -82,12 +96,7 @@ export default class Chat extends React.PureComponent { -

- {message.image && ( - - )} - {message.message} -

+
)} @@ -104,7 +113,6 @@ export default class Chat extends React.PureComponent {
diff --git a/src/client/components/Input.js b/src/client/components/Input.js index adb52df..cfa8ec1 100644 --- a/src/client/components/Input.js +++ b/src/client/components/Input.js @@ -1,11 +1,8 @@ import PropTypes from 'prop-types' import React from 'react' -import socket from '../socket.js' export default class Input extends React.PureComponent { static propTypes = { - videos: PropTypes.object.isRequired, - notify: PropTypes.func.isRequired, sendMessage: PropTypes.func.isRequired } constructor () { @@ -35,35 +32,27 @@ export default class Input extends React.PureComponent { }) } submit = () => { - const { videos, notify, sendMessage } = this.props + const { sendMessage } = this.props const { message } = this.state if (message) { - notify('You: ' + message) - sendMessage(message) - - const userId = socket.id - const timestamp = new Date().toLocaleString('en-US', { - hour: 'numeric', - minute: 'numeric', - hour12: false + sendMessage({ + payload: message, + type: 'text' }) - let image = null + // let image = null - // take snapshoot - try { - const video = videos[userId] - if (video) { - const canvas = document.createElement('canvas') - canvas.height = video.videoHeight - canvas.width = video.videoWidth - const avatar = canvas.getContext('2d') - avatar.drawImage(video, 0, 0, canvas.width, canvas.height) - image = canvas.toDataURL() - } - } catch (e) {} - - const payload = { userId, message, timestamp, image } - socket.emit('new_message', payload) + // // take snapshoot + // try { + // const video = videos[userId] + // if (video) { + // const canvas = document.createElement('canvas') + // canvas.height = video.videoHeight + // canvas.width = video.videoWidth + // const avatar = canvas.getContext('2d') + // avatar.drawImage(video, 0, 0, canvas.width, canvas.height) + // image = canvas.toDataURL() + // } + // } catch (e) {} } this.setState({ message: '' }) } diff --git a/src/client/components/Input.test.js b/src/client/components/Input.test.js index 2b1ff5f..b0b9e40 100644 --- a/src/client/components/Input.test.js +++ b/src/client/components/Input.test.js @@ -39,8 +39,8 @@ describe('components/Input', () => { it('sends a message', () => { TestUtils.Simulate.submit(node) expect(input.value).toBe('') - expect(sendMessage.mock.calls).toEqual([[ message ]]) - expect(notify.mock.calls).toEqual([[ `You: ${message}` ]]) + expect(sendMessage.mock.calls) + .toEqual([[ { payload: message, type: 'text' } ]]) }) }) @@ -50,8 +50,8 @@ describe('components/Input', () => { key: 'Enter' }) expect(input.value).toBe('') - expect(sendMessage.mock.calls).toEqual([[ message ]]) - expect(notify.mock.calls).toEqual([[ `You: ${message}` ]]) + expect(sendMessage.mock.calls) + .toEqual([[ { payload: message, type: 'text' } ]]) }) it('does nothing when other key pressed', () => { @@ -59,7 +59,6 @@ describe('components/Input', () => { key: 'test' }) expect(sendMessage.mock.calls.length).toBe(0) - expect(notify.mock.calls.length).toBe(0) }) }) diff --git a/src/client/components/Toolbar.js b/src/client/components/Toolbar.js index dd060d2..4fb7447 100644 --- a/src/client/components/Toolbar.js +++ b/src/client/components/Toolbar.js @@ -47,9 +47,9 @@ export default class Toolbar extends React.PureComponent { handleSendFile = () => { this.file.current.click() } - handleSelectFiles = () => { + handleSelectFiles = (event) => { Array - .from(this.file.current.files) + .from(event.target.files) .forEach(file => this.props.onSendFile(file)) } render () { diff --git a/src/client/components/Toolbar.test.js b/src/client/components/Toolbar.test.js index 8baf47c..a01eb85 100644 --- a/src/client/components/Toolbar.test.js +++ b/src/client/components/Toolbar.test.js @@ -17,20 +17,23 @@ describe('components/Toolbar', () => { return } } - let component, node, mediaStream, url, onToggleChat + let component, node, mediaStream, url, onToggleChat, onSendFile function render () { mediaStream = new MediaStream() onToggleChat = jest.fn() + onSendFile = jest.fn() component = TestUtils.renderIntoDocument( @@ -38,10 +41,8 @@ describe('components/Toolbar', () => { node = ReactDOM.findDOMNode(component) } - describe('render', () => { - it('should not fail', () => { - render() - }) + beforeEach(() => { + render() }) describe('handleChatClick', () => { @@ -85,4 +86,28 @@ describe('components/Toolbar', () => { }) }) + describe('handleSendFile', () => { + it('triggers input dialog', () => { + const sendFileButton = node.querySelector('.send-file') + const click = jest.fn() + const file = node.querySelector('input[type=file]') + file.click = click + TestUtils.Simulate.click(sendFileButton) + expect(click.mock.calls.length).toBe(1) + }) + }) + + describe('handleSelectFiles', () => { + it('iterates through files and calls onSendFile for each', () => { + const file = node.querySelector('input[type=file]') + const files = [{ name: 'first' }] + TestUtils.Simulate.change(file, { + target: { + files + } + }) + expect(onSendFile.mock.calls).toEqual([[ files[0] ]]) + }) + }) + }) diff --git a/src/client/constants.js b/src/client/constants.js index 3e16f4a..a5eba94 100644 --- a/src/client/constants.js +++ b/src/client/constants.js @@ -18,7 +18,6 @@ export const NOTIFY_DISMISS = 'NOTIFY_DISMISS' export const NOTIFY_CLEAR = 'NOTIFY_CLEAR' export const MESSAGE_ADD = 'MESSAGE_ADD' -export const MESSAGES_HISTORY = 'MESSAGES_HISTORY' export const PEER_ADD = 'PEER_ADD' export const PEER_REMOVE = 'PEER_REMOVE' @@ -33,8 +32,6 @@ export const PEER_EVENT_DATA = 'data' export const SOCKET_EVENT_SIGNAL = 'signal' export const SOCKET_EVENT_USERS = 'users' -export const SOCKET_EVENT_MESSAGES = 'messages' -export const SOCKET_EVENT_NEW_MESSAGE = 'new_message' export const STREAM_ADD = 'PEER_STREAM_ADD' export const STREAM_REMOVE = 'PEER_STREAM_REMOVE' diff --git a/src/client/containers/App.js b/src/client/containers/App.js index 552be30..a72f8e2 100644 --- a/src/client/containers/App.js +++ b/src/client/containers/App.js @@ -23,7 +23,6 @@ function mapDispatchToProps (dispatch) { sendMessage: bindActionCreators(PeerActions.sendMessage, dispatch), dismissAlert: bindActionCreators(NotifyActions.dismissAlert, dispatch), init: bindActionCreators(CallActions.init, dispatch), - notify: bindActionCreators(NotifyActions.info, dispatch), onSendFile: bindActionCreators(PeerActions.sendFile, dispatch) } } diff --git a/src/client/reducers/messages.js b/src/client/reducers/messages.js index 505c7d2..b9fcaa2 100644 --- a/src/client/reducers/messages.js +++ b/src/client/reducers/messages.js @@ -9,8 +9,6 @@ export default function messages (state = defaultState, action) { const messages = state.asMutable() messages.push(action.payload) return Immutable(messages) - case constants.MESSAGES_HISTORY: - return Immutable(action.messages) default: return state } diff --git a/src/client/reducers/messages.test.js b/src/client/reducers/messages.test.js index 37c23a3..8bf788c 100644 --- a/src/client/reducers/messages.test.js +++ b/src/client/reducers/messages.test.js @@ -17,12 +17,4 @@ describe('reducers/messages', () => { }) }) - describe('messageHistory', () => { - it('get chat message hisotry', () => { - let state = messages() - state = messages(state, ChatActions.loadHistory([])) - expect(state).toEqual([]) - }) - }) - }) diff --git a/src/server/socket.js b/src/server/socket.js index a9dd036..5f67b6b 100644 --- a/src/server/socket.js +++ b/src/server/socket.js @@ -2,8 +2,6 @@ const debug = require('debug')('peer-calls:socket') const _ = require('underscore') -const messages = {} - module.exports = function (socket, io) { socket.on('signal', payload => { // debug('signal: %s, payload: %o', socket.id, payload) @@ -13,11 +11,6 @@ module.exports = function (socket, io) { }) }) - socket.on('new_message', payload => { - addMesssage(socket.room, payload) - io.to(socket.room).emit('new_message', payload) - }) - socket.on('ready', roomName => { debug('ready: %s, room: %s', socket.id, roomName) if (socket.room) socket.leave(socket.room) @@ -26,17 +19,13 @@ module.exports = function (socket, io) { socket.room = roomName let users = getUsers(roomName) - let messages = getMesssages(roomName) - debug('ready: %s, room: %s, users: %o, messages: %o', - socket.id, roomName, users, messages) + debug('ready: %s, room: %s, users: %o', socket.id, roomName, users) io.to(roomName).emit('users', { initiator: socket.id, users }) - - io.to(roomName).emit('messages', messages) }) function getUsers (roomName) { @@ -45,14 +34,4 @@ module.exports = function (socket, io) { }) } - function getMesssages (roomName) { - if (_.isUndefined(messages[roomName])) { - messages[roomName] = [] - } - return messages[roomName] - } - - function addMesssage (roomName, payload) { - getMesssages(roomName).push(payload) - } } diff --git a/src/server/socket.test.js b/src/server/socket.test.js index dff952c..3c5dd5c 100644 --- a/src/server/socket.test.js +++ b/src/server/socket.test.js @@ -83,7 +83,7 @@ describe('server/socket', () => { it('should emit users', () => { socket.emit('ready', 'room3') - expect(io.to.mock.calls).toEqual([[ 'room3' ], [ 'room3' ]]) + expect(io.to.mock.calls).toEqual([[ 'room3' ]]) expect(io.to('room3').emit.mock.calls).toEqual([ [ 'users', { @@ -96,8 +96,7 @@ describe('server/socket', () => { id: 'socket2' }] } - ], - ['messages', []] + ] ]) }) })