diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index 1a36f6eeb0..30356977b8 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -19,7 +19,7 @@ module.exports = function (db, module) { db.collection('objects').update({_key: key, value: value}, {$set: {score: parseInt(score, 10)}}, {upsert:true, w: 1}, function (err) { if (err && err.message.startsWith('E11000 duplicate key error')) { - return module.sortedSetAdd(key, score, value, callback); + return process.nextTick(module.sortedSetAdd, key, score, value, callback); } callback(err); }); @@ -572,7 +572,7 @@ module.exports = function (db, module) { // https://jira.mongodb.org/browse/SERVER-14322 // https://docs.mongodb.org/manual/reference/command/findAndModify/#upsert-and-unique-index if (err && err.message.startsWith('E11000 duplicate key error')) { - return module.sortedSetIncrBy(key, increment, value, callback); + return process.nextTick(module.sortedSetIncrBy, key, increment, value, callback); } callback(err, result && result.value ? result.value.score : null); }); diff --git a/src/routes/index.js b/src/routes/index.js index e1e5c79d80..47f06771b5 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -1,6 +1,7 @@ "use strict"; var nconf = require('nconf'); +var winston = require('winston'); var path = require('path'); var async = require('async'); var controllers = require('../controllers'); @@ -157,5 +158,10 @@ module.exports = function (app, middleware, hotswapIds) { async.apply(plugins.reloadRoutes), async.apply(authRoutes.reloadRoutes), async.apply(user.addInterstitials) - ]); + ], function (err) { + if (err) { + return winston.error(err); + } + winston.info('Routes added'); + }); }; diff --git a/src/socket.io/index.js b/src/socket.io/index.js index f871f7ecd1..a497c480c5 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -1,12 +1,10 @@ "use strict"; -var SocketIO = require('socket.io'); -var socketioWildcard = require('socketio-wildcard')(); var async = require('async'); var nconf = require('nconf'); -var cookieParser = require('cookie-parser')(nconf.get('secret')); var winston = require('winston'); var url = require('url'); +var cookieParser = require('cookie-parser')(nconf.get('secret')); var db = require('../database'); var logger = require('../logger'); @@ -19,6 +17,8 @@ var ratelimit = require('../middleware/ratelimit'); Sockets.init = function (server) { requireModules(); + var SocketIO = require('socket.io'); + var socketioWildcard = require('socketio-wildcard')(); io = new SocketIO({ path: nconf.get('relative_path') + '/socket.io' }); diff --git a/src/webserver.js b/src/webserver.js index c11080fa1d..c2233761b3 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -65,6 +65,7 @@ module.exports.listen = function (callback) { emitter.all(['templates:compiled', 'meta:js.compiled', 'meta:css.compiled'], function () { winston.info('NodeBB Ready'); emitter.emit('nodebb:ready'); + listen(callback); }); @@ -100,6 +101,19 @@ function initializeNodeBB(callback) { }, async.apply(plugins.fireHook, 'static:assets.prepare', {}), async.apply(meta.js.bridgeModules, app), + function (next) { + plugins.fireHook('static:app.preload', { + app: app, + middleware: middleware + }, next); + }, + function (next) { + plugins.fireHook('filter:hotswap.prepare', [], next); + }, + function (hotswapIds, next) { + routes(app, middleware, hotswapIds); + next(); + }, function (next) { async.series([ async.apply(meta.templates.compile), @@ -110,17 +124,6 @@ function initializeNodeBB(callback) { async.apply(languages.init), async.apply(meta.blacklist.load) ], next); - }, - function (results, next) { - plugins.fireHook('static:app.preload', { - app: app, - middleware: middleware - }, next); - }, - async.apply(plugins.fireHook, 'filter:hotswap.prepare', []), - function (hotswapIds, next) { - routes(app, middleware, hotswapIds); - next(); } ], callback); } diff --git a/test/authentication.js b/test/authentication.js index aeedad1cbf..f63ab85f38 100644 --- a/test/authentication.js +++ b/test/authentication.js @@ -2,21 +2,17 @@ /*global require, before*/ var assert = require('assert'); -var async = require('async'); var nconf = require('nconf'); var request = require('request'); var db = require('./mocks/databasemock'); +var user = require('../src/user'); describe('authentication', function () { var jar = request.jar(); before(function (done) { - request({ - url: nconf.get('url') + '/api/config', - json: true, - jar: jar - }, function (err, response, body) { + user.create({username: 'regular', password: 'regularpwd', email: 'regular@nodebb.org' }, function (err) { assert.ifError(err); done(); }); @@ -54,7 +50,7 @@ describe('authentication', function () { assert(body); assert.equal(body.username, 'admin'); assert.equal(body.email, 'admin@nodebb.org'); - done() + done(); }); }); }); @@ -102,8 +98,8 @@ describe('authentication', function () { request.post(nconf.get('url') + '/login', { form: { - username: 'admin', - password: 'adminpwd', + username: 'regular', + password: 'regularpwd', }, json: true, jar: jar, @@ -121,8 +117,8 @@ describe('authentication', function () { }, function (err, response, body) { assert.ifError(err); assert(body); - assert.equal(body.username, 'admin'); - assert.equal(body.email, 'admin@nodebb.org'); + assert.equal(body.username, 'regular'); + assert.equal(body.email, 'regular@nodebb.org'); done() }); }); diff --git a/test/messaging.js b/test/messaging.js index 9c85259ede..4d331eaeac 100644 --- a/test/messaging.js +++ b/test/messaging.js @@ -1,13 +1,13 @@ 'use strict'; /*global require, before, after*/ -var assert = require('assert'), - db = require('./mocks/databasemock'), - async = require('async'), - User = require('../src/user'), - Groups = require('../src/groups'), - Messaging = require('../src/messaging'), - testUids; +var assert = require('assert'); +var db = require('./mocks/databasemock'); +var async = require('async'); +var User = require('../src/user'); +var Groups = require('../src/groups'); +var Messaging = require('../src/messaging'); +var testUids; describe('Messaging Library', function () { before(function (done) { diff --git a/test/mocks/databasemock.js b/test/mocks/databasemock.js index 75931d0141..672e72bc4b 100644 --- a/test/mocks/databasemock.js +++ b/test/mocks/databasemock.js @@ -12,7 +12,6 @@ var path = require('path'); var nconf = require('nconf'); var url = require('url'); - var winston = require('winston'); var errorText; @@ -82,10 +81,10 @@ winston.info(testDbConfig); var db = require('../../src/database'); - var meta = require('../../src/meta'); before(function (done) { this.timeout(30000); + var meta; async.waterfall([ function (next) { db.init(next); @@ -95,6 +94,7 @@ }, function (next) { winston.info('test_database flushed'); + meta = require('../../src/meta'); meta.configs.init(next); }, function (next) { diff --git a/test/plugins.js b/test/plugins.js index 8d1b0842f6..36137133fe 100644 --- a/test/plugins.js +++ b/test/plugins.js @@ -17,7 +17,6 @@ describe('Plugins', function () { assert(plugins.libraries[pluginId]); assert(plugins.loadedHooks['static:app.load']); assert(plugins.staticDirs['nodebb-plugin-markdown/js']); - assert.notEqual(plugins.lessFiles.indexOf('nodebb-plugin-markdown/public/less/default.less'), -1); done(); }); diff --git a/test/socket.io.js b/test/socket.io.js index dc78a2990f..d4c582969a 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -19,11 +19,10 @@ var groups = require('../src/groups'); describe('socket.io', function () { - var adminUid; var io; before(function (done) { - async.parallel([ + async.series([ async.apply(user.create, { username: 'admin', password: 'adminpwd' }), async.apply(user.create, { username: 'regular', password: 'regularpwd' }) ], function (err, uids) { @@ -31,7 +30,6 @@ describe('socket.io', function () { return done(err); } - adminUid = uids[0]; groups.join('administrators', uids[0], done); }); }); diff --git a/test/translator.js b/test/translator.js index 5d8c234747..18518f2e2e 100644 --- a/test/translator.js +++ b/test/translator.js @@ -21,7 +21,7 @@ describe('translator shim', function (){ describe('new Translator(language)', function (){ describe('.translate()', function (){ it('should handle basic translations', function (done) { - var translator = new Translator('en_GB'); + var translator = new Translator('en_GB'); translator.translate('[[global:home]]').then(function (translated) { assert.strictEqual(translated, 'Home'); @@ -30,7 +30,7 @@ describe('new Translator(language)', function (){ }); it('should handle language keys in regular text', function (done) { - var translator = new Translator('en_GB'); + var translator = new Translator('en_GB'); translator.translate('Let\'s go [[global:home]]').then(function (translated) { assert.strictEqual(translated, 'Let\'s go Home'); @@ -39,7 +39,7 @@ describe('new Translator(language)', function (){ }); it('should accept a language parameter and adjust accordingly', function (done) { - var translator = new Translator('de'); + var translator = new Translator('de'); translator.translate('[[global:home]]').then(function (translated) { assert.strictEqual(translated, 'Übersicht'); @@ -48,7 +48,7 @@ describe('new Translator(language)', function (){ }); it('should handle language keys in regular text with another language specified', function (done) { - var translator = new Translator('de'); + var translator = new Translator('de'); translator.translate('[[global:home]] test').then(function (translated) { assert.strictEqual(translated, 'Übersicht test'); @@ -57,7 +57,7 @@ describe('new Translator(language)', function (){ }); it('should handle language keys with parameters', function (done) { - var translator = new Translator('en_GB'); + var translator = new Translator('en_GB'); translator.translate('[[global:pagination.out_of, 1, 5]]').then(function (translated) { assert.strictEqual(translated, '1 out of 5'); @@ -66,7 +66,7 @@ describe('new Translator(language)', function (){ }); it('should handle language keys inside language keys', function (done) { - var translator = new Translator('en_GB'); + var translator = new Translator('en_GB'); translator.translate('[[notifications:outgoing_link_message, [[global:guest]]]]').then(function (translated) { assert.strictEqual(translated, 'You are now leaving Guest'); @@ -75,7 +75,7 @@ describe('new Translator(language)', function (){ }); it('should handle language keys inside language keys with multiple parameters', function (done) { - var translator = new Translator('en_GB'); + var translator = new Translator('en_GB'); translator.translate('[[notifications:user_posted_to, [[global:guest]], My Topic]]').then(function (translated) { assert.strictEqual(translated, 'Guest has posted a reply to: My Topic'); @@ -84,7 +84,7 @@ describe('new Translator(language)', function (){ }); it('should handle language keys inside language keys with all parameters as language keys', function (done) { - var translator = new Translator('en_GB'); + var translator = new Translator('en_GB'); translator.translate('[[notifications:user_posted_to, [[global:guest]], [[global:guest]]]]').then(function (translated) { assert.strictEqual(translated, 'Guest has posted a reply to: Guest'); @@ -93,7 +93,7 @@ describe('new Translator(language)', function (){ }); it('should properly handle parameters that contain square brackets', function (done) { - var translator = new Translator('en_GB'); + var translator = new Translator('en_GB'); translator.translate('[[global:pagination.out_of, [guest], [[global:home]]]]').then(function (translated) { assert.strictEqual(translated, '[guest] out of Home'); @@ -102,7 +102,7 @@ describe('new Translator(language)', function (){ }); it('should properly handle parameters that contain parentheses', function (done) { - var translator = new Translator('en_GB'); + var translator = new Translator('en_GB'); translator.translate('[[global:pagination.out_of, (foobar), [[global:home]]]]').then(function (translated) { assert.strictEqual(translated, '(foobar) out of Home'); @@ -111,7 +111,7 @@ describe('new Translator(language)', function (){ }); it('should not translate language key parameters with HTML in them', function (done) { - var translator = new Translator('en_GB'); + var translator = new Translator('en_GB'); var key = '[[global:403.login, test]]'; translator.translate(key).then(function (translated) { diff --git a/test/user.js b/test/user.js index 72c4164f19..4de38c461a 100644 --- a/test/user.js +++ b/test/user.js @@ -3,20 +3,20 @@ var winston = require('winston'); -var assert = require('assert'), - async = require('async'), - db = require('./mocks/databasemock'); +var assert = require('assert'); +var async = require('async'); +var db = require('./mocks/databasemock'); -var User = require('../src/user'), - Topics = require('../src/topics'), - Categories = require('../src/categories'), - Meta = require('../src/meta'), - Password = require('../src/password'); +var User = require('../src/user'); +var Topics = require('../src/topics'); +var Categories = require('../src/categories'); +var Meta = require('../src/meta'); +var Password = require('../src/password'); describe('User', function () { - var userData, - testUid, - testCid; + var userData; + var testUid; + var testCid; before(function (done) { var groups = require('../src/groups');