diff --git a/src/posts.js b/src/posts.js index 047917cb5f..3a7d2d7e19 100644 --- a/src/posts.js +++ b/src/posts.js @@ -188,39 +188,37 @@ var plugins = require('./plugins'); return callback(null, []); } - user.getSettings(uid, function (err, settings) { - if (err) { - return callback(err); - } - - var byVotes = settings.topicPostSort === 'most_votes'; - var sets = posts.map(function (post) { - return byVotes ? 'tid:' + post.tid + ':posts:votes' : 'tid:' + post.tid + ':posts'; - }); - - var uniqueSets = _.uniq(sets); - var method = 'sortedSetsRanks'; - if (uniqueSets.length === 1) { - method = 'sortedSetRanks'; - sets = uniqueSets[0]; - } - - var pids = posts.map(function (post) { - return post.pid; - }); - - db[method](sets, pids, function (err, indices) { - if (err) { - return callback(err); + async.waterfall([ + function (next) { + user.getSettings(uid, next); + }, + function (settings, next) { + var byVotes = settings.topicPostSort === 'most_votes'; + var sets = posts.map(function (post) { + return byVotes ? 'tid:' + post.tid + ':posts:votes' : 'tid:' + post.tid + ':posts'; + }); + + var uniqueSets = _.uniq(sets); + var method = 'sortedSetsRanks'; + if (uniqueSets.length === 1) { + method = 'sortedSetRanks'; + sets = uniqueSets[0]; } + var pids = posts.map(function (post) { + return post.pid; + }); + + db[method](sets, pids, next); + }, + function (indices, next) { for (var i = 0; i < indices.length; ++i) { indices[i] = utils.isNumber(indices[i]) ? parseInt(indices[i], 10) + 1 : 0; } - callback(null, indices); - }); - }); + next(null, indices); + } + ], callback); }; Posts.updatePostVoteCount = function (postData, callback) { diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index 964001a3f1..4a77c224a7 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -104,19 +104,20 @@ User.sendValidationEmail = function (socket, uids, callback) { return callback(new Error('[[error:email-confirmations-are-disabled]]')); } - user.getUsersFields(uids, ['uid', 'email'], function (err, usersData) { - if (err) { - return callback(err); + async.waterfall([ + function (next) { + user.getUsersFields(uids, ['uid', 'email'], next); + }, + function (usersData, next) { + async.eachLimit(usersData, 50, function (userData, next) { + if (userData.email && userData.uid) { + user.email.sendValidationEmail(userData.uid, userData.email, next); + } else { + next(); + } + }, next); } - - async.eachLimit(usersData, 50, function (userData, next) { - if (userData.email && userData.uid) { - user.email.sendValidationEmail(userData.uid, userData.email, next); - } else { - next(); - } - }, callback); - }); + ], callback); }; User.sendPasswordResetEmail = function (socket, uids, callback) { diff --git a/test/categories.js b/test/categories.js index abcaf118c8..d968cacc5d 100644 --- a/test/categories.js +++ b/test/categories.js @@ -390,7 +390,27 @@ describe('Categories', function () { }); }); + it('should get active users', function (done) { + Categories.create({ + name: 'test' + }, function (err, category) { + assert.ifError(err); + Topics.post({ + uid: posterUid, + cid: category.cid, + title: 'Test Topic Title', + content: 'The content of test topic' + }, function (err) { + assert.ifError(err); + Categories.getActiveUsers(category.cid, function (err, uids) { + assert.ifError(err); + assert.equal(uids[0], posterUid); + done(); + }); + }); + }); + }); after(function (done) { diff --git a/test/controllers.js b/test/controllers.js index cd08039557..89fce43246 100644 --- a/test/controllers.js +++ b/test/controllers.js @@ -829,6 +829,25 @@ describe('Controllers', function () { }); }); + describe('post redirect', function () { + it('should 404 for invalid pid', function (done) { + request(nconf.get('url') + '/post/fail', function (err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 404); + done(); + }); + }); + + it('should return correct post path', function (done) { + request(nconf.get('url') + '/api/post/' + pid, function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 308); + assert.equal(body, '"/topic/1/test-topic-title/1"'); + done(); + }); + }); + }); + after(function (done) { var analytics = require('../src/analytics'); analytics.writeData(function (err) { diff --git a/test/socket.io.js b/test/socket.io.js index b03753f362..ddb136d3b0 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -253,13 +253,45 @@ describe('socket.io', function () { }); }); - it('should validate emails', function (done) { + + + describe('validation emails', function () { var socketAdmin = require('../src/socket.io/admin'); - socketAdmin.user.validateEmail({uid: adminUid}, [regularUid], function (err) { - assert.ifError(err); - user.getUserField(regularUid, 'email:confirmed', function (err, emailConfirmed) { + var meta = require('../src/meta'); + + it('should validate emails', function (done) { + socketAdmin.user.validateEmail({uid: adminUid}, [regularUid], function (err) { + assert.ifError(err); + user.getUserField(regularUid, 'email:confirmed', function (err, emailConfirmed) { + assert.ifError(err); + assert.equal(parseInt(emailConfirmed, 10), 1); + done(); + }); + }); + }); + + it('should error with invalid uids', function (done) { + var socketAdmin = require('../src/socket.io/admin'); + socketAdmin.user.sendValidationEmail({uid: adminUid}, null, function (err) { + assert.equal(err.message, '[[error:invalid-data]]'); + done(); + }); + }); + + it('should error if email validation is not required', function (done) { + var socketAdmin = require('../src/socket.io/admin'); + socketAdmin.user.sendValidationEmail({uid: adminUid}, [regularUid], function (err) { + assert.equal(err.message, '[[error:email-confirmations-are-disabled]]'); + done(); + }); + }); + + it('should send validation email', function (done) { + var socketAdmin = require('../src/socket.io/admin'); + meta.config.requireEmailConfirmation = 1; + socketAdmin.user.sendValidationEmail({uid: adminUid}, [regularUid], function (err) { assert.ifError(err); - assert.equal(parseInt(emailConfirmed, 10), 1); + meta.config.requireEmailConfirmation = 0; done(); }); }); diff --git a/test/user.js b/test/user.js index c5769579e1..4854fbf110 100644 --- a/test/user.js +++ b/test/user.js @@ -684,6 +684,29 @@ describe('User', function () { }); }); }); + + it('should fail if data is invalid', function (done) { + socketUser.emailExists({uid: testUid}, null, function (err) { + assert.equal(err.message, '[[error:invalid-data]]'); + done(); + }); + }); + + it('should return true if email exists', function (done) { + socketUser.emailExists({uid: testUid}, {email: 'john@example.com'}, function (err, exists) { + assert.ifError(err); + assert(exists); + done(); + }); + }); + + it('should return false if email does not exist', function (done) { + socketUser.emailExists({uid: testUid}, {email: 'does@not.exist'}, function (err, exists) { + assert.ifError(err); + assert(!exists); + done(); + }); + }); }); describe('approval queue', function () {