diff --git a/src/digest.js b/src/digest.js index 912735c77..a4b23d997 100644 --- a/src/digest.js +++ b/src/digest.js @@ -1,30 +1,37 @@ 'use strict'; -var assert = require('assert'), - debug = require('debug')('box:digest'), +var debug = require('debug')('box:digest'), eventlog = require('./eventlog.js'), updatechecker = require('./updatechecker.js'), mailer = require('./mailer.js'), settings = require('./settings.js'); +var NOOP_CALLBACK = function (error) { if (error) debug(error); }; + exports = module.exports = { maybeSend: maybeSend }; -function maybeSend() { +function maybeSend(callback) { + callback = callback || NOOP_CALLBACK; + settings.getEmailDigest(function (error, enabled) { - if (error) return console.error(error); - if (!enabled) return debug('Email digest is disabled'); + if (error) return callback(error); + + if (!enabled) { + debug('Email digest is disabled'); + return callback(); + } var updateInfo = updatechecker.getUpdateInfo(); var pendingAppUpdates = updateInfo.apps || {}; pendingAppUpdates = Object.keys(pendingAppUpdates).map(function (key) { return pendingAppUpdates[key]; }); eventlog.getByActionLastWeek(eventlog.ACTION_APP_UPDATE, function (error, appUpdates) { - if (error) return console.error(error); + if (error) return callback(error); eventlog.getByActionLastWeek(eventlog.ACTION_UPDATE, function (error, boxUpdates) { - if (error) return console.error(error); + if (error) return callback(error); var info = { pendingAppUpdates: pendingAppUpdates, @@ -40,6 +47,8 @@ function maybeSend() { } else { debug('maybeSend: nothing happened, NOT sending digest email'); } + + callback(); }); }); }); diff --git a/src/test/digest-test.js b/src/test/digest-test.js new file mode 100644 index 000000000..a2ab3bcfb --- /dev/null +++ b/src/test/digest-test.js @@ -0,0 +1,110 @@ +/* global it:false */ +/* global describe:false */ +/* global before:false */ +/* global after:false */ + +'use strict'; + +var async = require('async'), + config = require('../config.js'), + database = require('../database.js'), + digest = require('../digest.js'), + eventlog = require('../eventlog.js'), + expect = require('expect.js'), + mailer = require('../mailer.js'), + paths = require('../paths.js'), + safe = require('safetydance'), + settings = require('../settings.js'), + updatechecker = require('../updatechecker.js'), + user = require('../user.js'); + +// owner +var USER_0 = { + username: 'username0', + password: 'Username0pass?1234', + email: 'user0@email.com', + displayName: 'User 0' +}; + +var AUDIT_SOURCE = { + ip: '1.2.3.4' +}; + +function checkMails(number, done) { + // mails are enqueued async + setTimeout(function () { + expect(mailer._getMailQueue().length).to.equal(number); + mailer._clearMailQueue(); + done(); + }, 500); +} + +describe('digest', function () { + function cleanup(done) { + mailer._clearMailQueue(); + safe.fs.unlinkSync(paths.UPDATE_CHECKER_FILE); + + async.series([ + settings.uninitialize, + database._clear + ], done); + } + + before(function (done) { + config._reset(); + config.set('version', '1.0.0'); + config.set('apiServerOrigin', 'http://localhost:4444'); + config.set('provider', 'notcaas'); + safe.fs.unlinkSync(paths.UPDATE_CHECKER_FILE); + + async.series([ + database.initialize, + database._clear, + settings.initialize, + user.createOwner.bind(null, USER_0.username, USER_0.password, USER_0.email, USER_0.displayName, AUDIT_SOURCE), + eventlog.add.bind(null, eventlog.ACTION_UPDATE, AUDIT_SOURCE, { boxUpdateInfo: { sourceTarballUrl: 'xx', version: '1.2.3', changelog: [ 'good stuff' ] } }), + mailer.start, + mailer._clearMailQueue + ], done); + }); + + after(cleanup); + + describe('disabled', function () { + before(function (done) { + settings.setEmailDigest(false, done); + }); + + it('does not send mail with digest disabled', function (done) { + digest.maybeSend(function (error) { + if (error) return done(error); + checkMails(0, done); + }); + }); + + }); + + describe('enabled', function () { + before(function (done) { + settings.setEmailDigest(true, done); + }); + + it('sends mail for box update', function (done) { + digest.maybeSend(function (error) { + if (error) return done(error); + + checkMails(1, done); + }); + }); + + it('sends mail for pending update', function (done) { + updatechecker._setUpdateInfo({ box: null, apps: { 'appid': { manifest: { version: '1.2.5', changelog: 'noop\nreally' } } } }); + + digest.maybeSend(function (error) { + if (error) return done(error); + + checkMails(1, done); + }); + }); + }); +}); diff --git a/src/test/settings-test.js b/src/test/settings-test.js index 0973588dc..426ac2abb 100644 --- a/src/test/settings-test.js +++ b/src/test/settings-test.js @@ -197,6 +197,21 @@ describe('Settings', function () { }); }); + it('can enable mail digest', function (done) { + settings.setEmailDigest(true, function (error) { + expect(error).to.be(null); + done(); + }); + }); + + it('can get mail digest', function (done) { + settings.getEmailDigest(function (error, enabled) { + expect(error).to.be(null); + expect(enabled).to.be(true); + done(); + }); + }); + it('can get mail relay', function (done) { settings.getMailRelay(function (error, address) { expect(error).to.be(null); diff --git a/src/updatechecker.js b/src/updatechecker.js index f74e04d88..1f5ba30a0 100644 --- a/src/updatechecker.js +++ b/src/updatechecker.js @@ -6,7 +6,9 @@ exports = module.exports = { getUpdateInfo: getUpdateInfo, resetUpdateInfo: resetUpdateInfo, - resetAppUpdateInfo: resetAppUpdateInfo + resetAppUpdateInfo: resetAppUpdateInfo, + + _setUpdateInfo: setUpdateInfo }; var apps = require('./apps.js'), @@ -41,6 +43,11 @@ function getUpdateInfo() { }; } +function setUpdateInfo(info) { + gBoxUpdateInfo = info.box; + gAppUpdateInfo = info.apps; +} + function resetUpdateInfo() { gBoxUpdateInfo = null; resetAppUpdateInfo();