diff --git a/src/socket.io/posts/flag.js b/src/socket.io/posts/flag.js index 565c4ec7c9..42c789eb54 100644 --- a/src/socket.io/posts/flag.js +++ b/src/socket.io/posts/flag.js @@ -107,7 +107,7 @@ module.exports = function (SocketPosts) { SocketPosts.dismissFlag = function (socket, pid, callback) { if (!pid || !socket.uid) { - return callback('[[error:invalid-data]]'); + return callback(new Error('[[error:invalid-data]]')); } async.waterfall([ function (next) { @@ -138,7 +138,7 @@ module.exports = function (SocketPosts) { SocketPosts.updateFlag = function (socket, data, callback) { if (!data || !(data.pid && data.data)) { - return callback('[[error:invalid-data]]'); + return callback(new Error('[[error:invalid-data]]')); } var payload = {}; diff --git a/src/socket.io/user/picture.js b/src/socket.io/user/picture.js index 95f1613501..995b184b47 100644 --- a/src/socket.io/user/picture.js +++ b/src/socket.io/user/picture.js @@ -11,7 +11,7 @@ module.exports = function (SocketUser) { SocketUser.changePicture = function (socket, data, callback) { if (!socket.uid) { - return callback('[[error:invalid-uid]]'); + return callback(new Error('[[error:invalid-uid]]')); } if (!data) { diff --git a/src/socket.io/user/profile.js b/src/socket.io/user/profile.js index 63726cb31d..8e2cbda7bd 100644 --- a/src/socket.io/user/profile.js +++ b/src/socket.io/user/profile.js @@ -84,12 +84,13 @@ module.exports = function (SocketUser) { } SocketUser.changePassword = function (socket, data, callback) { + if (!socket.uid) { + return callback(new Error('[[error:invalid-uid]]')); + } + if (!data || !data.uid) { return callback(new Error('[[error:invalid-data]]')); } - if (!socket.uid) { - return callback('[[error:invalid-uid]]'); - } user.changePassword(socket.uid, data, function (err) { if (err) { @@ -108,7 +109,7 @@ module.exports = function (SocketUser) { SocketUser.updateProfile = function (socket, data, callback) { if (!socket.uid) { - return callback('[[error:invalid-uid]]'); + return callback(new Error('[[error:invalid-uid]]')); } if (!data || !data.uid) { diff --git a/test/helpers/index.js b/test/helpers/index.js index 116f48d49d..a519771839 100644 --- a/test/helpers/index.js +++ b/test/helpers/index.js @@ -3,6 +3,8 @@ var request = require('request'); var nconf = require('nconf'); +var myXhr = require('../mocks/newXhr'); + var helpers = module.exports; helpers.loginUser = function (username, password, callback) { @@ -11,8 +13,8 @@ helpers.loginUser = function (username, password, callback) { url: nconf.get('url') + '/api/config', json: true, jar: jar - }, function (err, response, body) { - if (err || response.statusCode !== 200) { + }, function (err, res, body) { + if (err || res.statusCode !== 200) { return callback(err || new Error('[[error:invalid-response]]')); } @@ -26,11 +28,61 @@ helpers.loginUser = function (username, password, callback) { headers: { 'x-csrf-token': body.csrf_token } - }, function (err, response) { - if (err || response.statusCode !== 200) { + }, function (err, res) { + if (err || res.statusCode !== 200) { return callback(err || new Error('[[error:invalid-response]]')); } - callback(null, jar); + myXhr.callbacks.test2 = function () { + this.setDisableHeaderCheck(true); + var stdOpen = this.open; + this.open = function () { + stdOpen.apply(this, arguments); + this.setRequestHeader('Cookie', res.headers['set-cookie'][0].split(';')[0]); + }; + }; + + var socketClient = require('socket.io-client'); + + var io = socketClient.connect(nconf.get('url'), {forceNew: true, multiplex: false}); + io.on('connect', function () { + callback(null, jar, io); + }); + + io.on('error', function (err) { + callback(err); + }); + }); + }); +}; + +helpers.initSocketIO = function (callback) { + var jar; + request.get({ + url: nconf.get('url') + '/api/config', + jar: jar, + json: true + }, function (err, res, body) { + if (err) { + return callback(err); + } + + myXhr.callbacks.test2 = function () { + this.setDisableHeaderCheck(true); + var stdOpen = this.open; + this.open = function () { + stdOpen.apply(this, arguments); + this.setRequestHeader('Cookie', res.headers['set-cookie'][0].split(';')[0]); + }; + }; + + var io = require('socket.io-client')(nconf.get('url'), {forceNew: true}); + + io.on('connect', function () { + callback(null, jar, io); + }); + + io.on('error', function (err) { + callback(err); }); }); -}; \ No newline at end of file +}; diff --git a/test/user.js b/test/user.js index 722188ed8b..34e1c329be 100644 --- a/test/user.js +++ b/test/user.js @@ -1,7 +1,4 @@ 'use strict'; -/*global require, process, before, beforeEach, after*/ - -var winston = require('winston'); var assert = require('assert'); var async = require('async'); @@ -12,6 +9,7 @@ var Topics = require('../src/topics'); var Categories = require('../src/categories'); var Meta = require('../src/meta'); var Password = require('../src/password'); +var helpers = require('./helpers'); describe('User', function () { var userData; @@ -290,18 +288,61 @@ describe('User', function () { }); }); - describe('updateProfile', function () { + describe('not logged in', function () { + var jar; + var io; + before(function (done) { + helpers.initSocketIO(function (err, _jar, _io) { + assert.ifError(err); + jar = _jar; + io = _io; + done(); + }); + }); + + it('should return error if not logged in', function (done) { + io.emit('user.updateProfile', {}, function (err) { + assert.equal(err.message, '[[error:invalid-uid]]'); + done(); + }); + }); + }); + + describe('profile methods', function () { var uid; + var jar; + var io; + before(function (done) { - User.create({username: 'updateprofile', email: 'update@me.com'}, function (err, newUid) { + User.create({username: 'updateprofile', email: 'update@me.com', password: '123456'}, function (err, newUid) { assert.ifError(err); uid = newUid; + helpers.loginUser('updateprofile', '123456', function (err, _jar, _io) { + assert.ifError(err); + jar = _jar; + io = _io; + done(); + }); + }); + }); + + it('should return error if data is invalid', function (done) { + io.emit('user.updateProfile', null, function (err) { + assert.equal(err.message, '[[error:invalid-data]]'); + done(); + }); + }); + + it('should return error if data is missing uid', function (done) { + io.emit('user.updateProfile', {username: 'bip', email: 'bop'}, function (err) { + assert.equal(err.message, '[[error:invalid-data]]'); done(); }); }); it('should update a user\'s profile', function (done) { var data = { + uid: uid, username: 'updatedUserName', email: 'updatedEmail@me.com', fullname: 'updatedFullname', @@ -311,10 +352,13 @@ describe('User', function () { birthday: '01/01/1980', signature: 'nodebb is good' }; - - User.updateProfile(uid, data, function (err, result) { + io.emit('user.updateProfile', data, function (err, result) { assert.ifError(err); - assert(result); + + assert.equal(result.username, 'updatedUserName'); + assert.equal(result.userslug, 'updatedusername'); + assert.equal(result.email, 'updatedEmail@me.com'); + db.getObject('user:' + uid, function (err, userData) { assert.ifError(err); Object.keys(data).forEach(function (key) { @@ -324,6 +368,65 @@ describe('User', function () { }); }); }); + + it('should change a user\'s password', function (done) { + io.emit('user.changePassword', {uid: uid, newPassword: '654321', currentPassword: '123456'}, function (err) { + assert.ifError(err); + User.isPasswordCorrect(uid, '654321', function (err, correct) { + assert.ifError(err); + assert(correct); + done(); + }); + }); + }); + + it('should change username', function (done) { + io.emit('user.changeUsernameEmail', {uid: uid, username: 'updatedAgain', password: '654321'}, function (err) { + assert.ifError(err); + db.getObjectField('user:' + uid, 'username', function (err, username) { + assert.ifError(err); + assert.equal(username, 'updatedAgain'); + done(); + }); + }); + }); + + it('should change email', function (done) { + io.emit('user.changeUsernameEmail', {uid: uid, email: 'updatedAgain@me.com', password: '654321'}, function (err) { + assert.ifError(err); + db.getObjectField('user:' + uid, 'email', function (err, email) { + assert.ifError(err); + assert.equal(email, 'updatedAgain@me.com'); + done(); + }); + }); + }); + + it('should update cover image', function (done) { + var imageData = 'data:image/png;base64,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'; + var position = '50.0301% 19.2464%'; + io.emit('user.updateCover', {uid: uid, imageData: imageData, position: position}, function (err, result) { + assert.ifError(err); + assert(result.url); + db.getObjectFields('user:' + uid, ['cover:url', 'cover:position'], function (err, data) { + assert.ifError(err); + assert.equal(data['cover:url'], result.url); + assert.equal(data['cover:position'], position); + done(); + }); + }); + }); + + it('should remove cover image', function (done) { + io.emit('user.removeCover', {uid: uid}, function (err) { + assert.ifError(err); + db.getObjectField('user:' + uid, 'cover:url', function (err, url) { + assert.ifError(err); + assert.equal(url, null); + done(); + }); + }); + }); }); after(function (done) {