diff --git a/src/js/controller/app/status-display.js b/src/js/controller/app/status-display.js index f86d40d..d98e8d1 100644 --- a/src/js/controller/app/status-display.js +++ b/src/js/controller/app/status-display.js @@ -3,17 +3,14 @@ var StatusDisplayCtrl = function($scope, statusDisplay) { // set the show functions - statusDisplay.showStatus = updateStatus; - statusDisplay.showSearching = setSearching; - - function updateStatus(lbl, time) { + statusDisplay.showStatus = function(lbl, time) { $scope.lastUpdateLbl = lbl; $scope.lastUpdate = (time) ? time : ''; - } + }; - function setSearching(state) { + statusDisplay.showSearching = function(state) { $scope.searching = state; - } + }; }; diff --git a/src/js/util/connection-doctor.js b/src/js/util/connection-doctor.js index ea7f8fb..f11ca02 100644 --- a/src/js/util/connection-doctor.js +++ b/src/js/util/connection-doctor.js @@ -151,11 +151,12 @@ ConnectionDoctor.prototype._checkReachable = function(options, callback) { timeout, // remember the timeout object host = options.host + ':' + options.port, hasTimedOut = false, // prevents multiple callbacks - cfg = this._appConfig.config; + cfg = this._appConfig.config, + str = this._appConfig.string; timeout = setTimeout(function() { hasTimedOut = true; - callback(createError(HOST_TIMEOUT, this._appConfig.string.connDocHostTimeout.replace('{0}', host).replace('{1}', cfg.connDocTimeout))); + callback(createError(HOST_TIMEOUT, str.connDocHostTimeout.replace('{0}', host).replace('{1}', cfg.connDocTimeout))); }, cfg.connDocTimeout); socket = TCPSocket.open(options.host, options.port, { @@ -175,14 +176,14 @@ ConnectionDoctor.prototype._checkReachable = function(options, callback) { socket.oncert = function() { if (options.ca) { // the certificate we already have is outdated - error = createError(TLS_WRONG_CERT, this._appConfig.string.connDocTlsWrongCert.replace('{0}', host)); + error = createError(TLS_WRONG_CERT, str.connDocTlsWrongCert.replace('{0}', host)); } }; } catch (e) {} socket.onerror = function(e) { if (!error) { - error = createError(HOST_UNREACHABLE, this._appConfig.string.connDocHostUnreachable.replace('{0}', host), e.data); + error = createError(HOST_UNREACHABLE, str.connDocHostUnreachable.replace('{0}', host), e.data); } }; @@ -207,8 +208,8 @@ ConnectionDoctor.prototype._checkReachable = function(options, callback) { ConnectionDoctor.prototype._checkImap = function(callback) { var self = this, loggedIn = false, - host = self.credentials.imap.host + ':' + self.credentials.imap.port; - + host = self.credentials.imap.host + ':' + self.credentials.imap.port, + str = this._appConfig.string; self._imap.onCert = function(pemEncodedCert) { if (!self.credentials.imap.ca) { @@ -220,9 +221,9 @@ ConnectionDoctor.prototype._checkImap = function(callback) { // the global onError handler, so we need to track if login was successful self._imap.onError = function(error) { if (!loggedIn) { - callback(createError(AUTH_REJECTED, this._appConfig.string.connDocAuthRejected.replace('{0}', host), error)); + callback(createError(AUTH_REJECTED, str.connDocAuthRejected.replace('{0}', host), error)); } else { - callback(createError(GENERIC_ERROR, this._appConfig.string.connDocGenericError.replace('{0}', host).replace('{1}', error.message), error)); + callback(createError(GENERIC_ERROR, str.connDocGenericError.replace('{0}', host).replace('{1}', error.message), error)); } }; @@ -231,12 +232,12 @@ ConnectionDoctor.prototype._checkImap = function(callback) { self._imap.listWellKnownFolders(function(error, wellKnownFolders) { if (error) { - return callback(createError(GENERIC_ERROR, this._appConfig.string.connDocGenericError.replace('{0}', host).replace('{1}', error.message), error)); + return callback(createError(GENERIC_ERROR, str.connDocGenericError.replace('{0}', host).replace('{1}', error.message), error)); } if (wellKnownFolders.Inbox.length === 0) { // the client needs at least an inbox folder to work properly - return callback(createError(NO_INBOX, this._appConfig.string.connDocNoInbox.replace('{0}', host))); + return callback(createError(NO_INBOX, str.connDocNoInbox.replace('{0}', host))); } self._imap.logout(function() { @@ -255,7 +256,8 @@ ConnectionDoctor.prototype._checkImap = function(callback) { ConnectionDoctor.prototype._checkSmtp = function(callback) { var self = this, host = self.credentials.smtp.host + ':' + self.credentials.smtp.port, - errored = false; // tracks if we need to invoke the callback at onclose or not + errored = false, // tracks if we need to invoke the callback at onclose or not + str = this._appConfig.string; self._smtp.oncert = function(pemEncodedCert) { if (!self.credentials.smtp.ca) { @@ -266,7 +268,7 @@ ConnectionDoctor.prototype._checkSmtp = function(callback) { self._smtp.onerror = function(error) { if (error) { errored = true; - callback(createError(AUTH_REJECTED, this._appConfig.string.connDocAuthRejected.replace('{0}', host), error)); + callback(createError(AUTH_REJECTED, str.connDocAuthRejected.replace('{0}', host), error)); } }; diff --git a/src/js/util/status-display.js b/src/js/util/status-display.js index 5461ea3..a51fcf9 100644 --- a/src/js/util/status-display.js +++ b/src/js/util/status-display.js @@ -4,7 +4,13 @@ var ngModule = angular.module('woUtil'); ngModule.service('statusDisplay', StatusDisplay); module.exports = StatusDisplay; -function StatusDisplay() {} +/** + * A central service to display status updates to the user + */ +function StatusDisplay($q, axe) { + this._q = $q; + this._axe = axe; +} /** * Update the status disply in the lower left of the screen @@ -12,7 +18,16 @@ function StatusDisplay() {} * @param {Date} time The time of the last update */ StatusDisplay.prototype.update = function(msg, time) { - this.showStatus(msg, time); + var self = this; + self._axe.info('status display', msg); + return self._q(function(resolve, reject) { + if (self.showStatus) { + self.showStatus(msg, time); + resolve(); + } else { + reject(new Error('Status display service showStatus not set!')); + } + }); }; /** @@ -20,5 +35,13 @@ StatusDisplay.prototype.update = function(msg, time) { * @param {Boolean} state If the spinner should be displayed or not */ StatusDisplay.prototype.setSearching = function(state) { - this.showSearching(state); + var self = this; + return self._q(function(resolve, reject) { + if (self.showSearching) { + self.showSearching(state); + resolve(); + } else { + reject(new Error('Status display service showSearching not set!')); + } + }); }; \ No newline at end of file diff --git a/src/js/util/update/update-handler.js b/src/js/util/update/update-handler.js index ebfdd11..243a57a 100644 --- a/src/js/util/update/update-handler.js +++ b/src/js/util/update/update-handler.js @@ -15,9 +15,9 @@ var axe = require('axe-logger'), /** * Handles database migration */ -function UpdateHandler(appConfigStore, deviceStorage, auth, dialog) { +function UpdateHandler(appConfigStore, accountStore, auth, dialog) { this._appConfigStorage = appConfigStore; - this._userStorage = deviceStorage; + this._userStorage = accountStore; this._updateScripts = [updateV1, updateV2, updateV3, updateV4, updateV5]; this._auth = auth; this._dialog = dialog; diff --git a/test/unit/util/backbutton-handler-test.js b/test/unit/util/backbutton-handler-test.js index 9cb0892..f6d5ffe 100644 --- a/test/unit/util/backbutton-handler-test.js +++ b/test/unit/util/backbutton-handler-test.js @@ -1,6 +1,6 @@ 'use strict'; -var btnHandler = require('../../src/js/util/backbutton-handler'); +var btnHandler = require('../../../src/js/util/backbutton-handler'); describe('Backbutton Handler', function() { chai.config.includeStack = true; diff --git a/test/unit/util/connection-doctor-test.js b/test/unit/util/connection-doctor-test.js index 8a431d5..a8aabe0 100644 --- a/test/unit/util/connection-doctor-test.js +++ b/test/unit/util/connection-doctor-test.js @@ -3,8 +3,9 @@ var TCPSocket = require('tcp-socket'), ImapClient = require('imap-client'), SmtpClient = require('wo-smtpclient'), - ConnectionDoctor = require('../../src/js/util/connection-doctor'), - cfg = require('../../src/js/app-config').config; + ConnectionDoctor = require('../../../src/js/util/connection-doctor'), + appConfig = require('../../../src/js/app-config'), + cfg = appConfig.config; describe('Connection Doctor', function() { var doctor; @@ -22,7 +23,7 @@ describe('Connection Doctor', function() { } }; - workerPath = 'js/tcp-socket-tls-worker.min.js'; + workerPath = '../lib/tcp-socket-tls-worker.min.js'; imapStub = sinon.createStubInstance(ImapClient); smtpStub = sinon.createStubInstance(SmtpClient); @@ -51,7 +52,7 @@ describe('Connection Doctor', function() { // // Setup SUT // - doctor = new ConnectionDoctor(); + doctor = new ConnectionDoctor(appConfig); doctor.configure(credentials); doctor._imap = imapStub; doctor._smtp = smtpStub; @@ -412,4 +413,4 @@ describe('Connection Doctor', function() { }); }); }); -}); +}); \ No newline at end of file diff --git a/test/unit/util/status-display-test.js b/test/unit/util/status-display-test.js new file mode 100644 index 0000000..6f6e9e5 --- /dev/null +++ b/test/unit/util/status-display-test.js @@ -0,0 +1,65 @@ +'use strict'; + +describe('Status Display Service unit test', function() { + var statusDisplay, logInfoStub; + + beforeEach(function() { + angular.module('statusDisplay-test', ['woUtil']); + angular.mock.module('statusDisplay-test'); + angular.mock.inject(function($injector, axe) { + logInfoStub = sinon.stub(axe, 'info'); + statusDisplay = $injector.get('statusDisplay'); + }); + }); + + afterEach(function() { + logInfoStub.restore(); + }); + + describe('update', function() { + it('should work', inject(function($rootScope) { + var message = 'Tada!', + time = new Date(); + statusDisplay.showStatus = function() {}; + var showStatusStub = sinon.stub(statusDisplay, 'showStatus'); + + statusDisplay.update(message, time).then(function(result) { + expect(result).to.not.exist; + }); + + expect(logInfoStub.calledOnce).to.be.true; + $rootScope.$apply(); + expect(showStatusStub.withArgs(message, time).calledOnce).to.be.true; + })); + it('should fail for no display function', inject(function($rootScope) { + statusDisplay.update().catch(function(err) { + expect(err.message).to.match(/showStatus/); + }); + + expect(logInfoStub.calledOnce).to.be.true; + $rootScope.$apply(); + })); + }); + + describe('setSearching', function() { + it('should work', inject(function($rootScope) { + statusDisplay.showSearching = function() {}; + var showSearchingStub = sinon.stub(statusDisplay, 'showSearching'); + + statusDisplay.setSearching(true).then(function(result) { + expect(result).to.not.exist; + }); + + $rootScope.$apply(); + expect(showSearchingStub.withArgs(true).calledOnce).to.be.true; + })); + it('should fail for no display function', inject(function($rootScope) { + statusDisplay.setSearching().catch(function(err) { + expect(err.message).to.match(/showSearching/); + }); + + $rootScope.$apply(); + })); + }); + +}); \ No newline at end of file diff --git a/test/unit/util/update-handler-test.js b/test/unit/util/update-handler-test.js index 9333e57..6d70d6d 100644 --- a/test/unit/util/update-handler-test.js +++ b/test/unit/util/update-handler-test.js @@ -1,12 +1,13 @@ 'use strict'; -var DeviceStorageDAO = require('../../src/js/dao/devicestorage-dao'), - Auth = require('../../src/js/bo/auth'), - cfg = require('../../src/js/app-config').config, - UpdateHandler = require('../../src/js/util/update/update-handler'); +var DeviceStorageDAO = require('../../../src/js/service/devicestorage'), + Auth = require('../../../src/js/service/auth'), + cfg = require('../../../src/js/app-config').config, + UpdateHandler = require('../../../src/js/util/update/update-handler'), + Dialog = require('../../../src/js/util/dialog'); describe('UpdateHandler', function() { - var updateHandler, appConfigStorageStub, authStub, userStorageStub, origDbVersion; + var updateHandler, appConfigStorageStub, authStub, userStorageStub, dialogStub, origDbVersion; chai.config.includeStack = true; @@ -15,7 +16,8 @@ describe('UpdateHandler', function() { appConfigStorageStub = sinon.createStubInstance(DeviceStorageDAO); userStorageStub = sinon.createStubInstance(DeviceStorageDAO); authStub = sinon.createStubInstance(Auth); - updateHandler = new UpdateHandler(appConfigStorageStub, userStorageStub, authStub); + dialogStub = sinon.createStubInstance(Dialog); + updateHandler = new UpdateHandler(appConfigStorageStub, userStorageStub, authStub, dialogStub); }); afterEach(function() {