From e450fe1d8e16c489937b8b76af4ac59e4b65d0eb Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Tue, 12 Jan 2016 14:10:06 +0100 Subject: [PATCH 1/4] refactor(WalletService): use MyWalletNetwork Depends on blockchain/My-Wallet-V3#87 and a new bower release. Also uses the new promise based resendTwoFactorSms() method. --- app/index.jade | 1 + assets/js/core/walletNetwork.service.js | 7 +++++++ assets/js/services/wallet.service.js | 11 ++++++----- bower.json | 2 +- tests/mocks/my_wallet/my_wallet_network.coffee | 2 ++ 5 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 assets/js/core/walletNetwork.service.js create mode 100644 tests/mocks/my_wallet/my_wallet_network.coffee diff --git a/app/index.jade b/app/index.jade index 9684848643..451badb76a 100644 --- a/app/index.jade +++ b/app/index.jade @@ -56,6 +56,7 @@ head script(src='build/js/core/myWallet.service.js') script(src='build/js/core/payment.service.js') script(src='build/js/core/walletTokenEndpoints.service.js') + script(src='build/js/core/walletNetwork.service.js') script(src='build/js/browser-polyfill.js') script(src='build/js/app.js') diff --git a/assets/js/core/walletNetwork.service.js b/assets/js/core/walletNetwork.service.js new file mode 100644 index 0000000000..7e3bb726b4 --- /dev/null +++ b/assets/js/core/walletNetwork.service.js @@ -0,0 +1,7 @@ +angular + .module('walletApp.core') + .factory('MyWalletNetwork', MyWalletNetwork); + +function MyWalletNetwork() { + return Blockchain.WalletNetwork +} diff --git a/assets/js/services/wallet.service.js b/assets/js/services/wallet.service.js index 318badd095..b47e4d0b82 100644 --- a/assets/js/services/wallet.service.js +++ b/assets/js/services/wallet.service.js @@ -9,9 +9,9 @@ angular .module('walletServices', []) .factory('Wallet', Wallet); -Wallet.$inject = ['$http', '$window', '$timeout', 'Alerts', 'MyWallet', 'MyBlockchainApi', 'MyBlockchainSettings', 'MyWalletStore', 'MyWalletPayment', 'MyWalletTokenEndpoints', '$rootScope', 'ngAudio', '$cookies', '$translate', '$filter', '$state', '$q', 'bcPhoneNumber', 'languages', 'currency']; +Wallet.$inject = ['$http', '$window', '$timeout', 'Alerts', 'MyWallet', 'MyBlockchainApi', 'MyBlockchainSettings', 'MyWalletStore', 'MyWalletPayment', 'MyWalletTokenEndpoints', 'MyWalletNetwork','$rootScope', 'ngAudio', '$cookies', '$translate', '$filter', '$state', '$q', 'bcPhoneNumber', 'languages', 'currency']; -function Wallet($http, $window, $timeout, Alerts, MyWallet, MyBlockchainApi, MyBlockchainSettings, MyWalletStore, MyWalletPayment, MyWalletTokenEndpoints, $rootScope, ngAudio, $cookies, $translate, $filter, $state, $q, bcPhoneNumber, languages, currency) { +function Wallet($http, $window, $timeout, Alerts, MyWallet, MyBlockchainApi, MyBlockchainSettings, MyWalletStore, MyWalletPayment, MyWalletTokenEndpoints, MyWalletNetwork, $rootScope, ngAudio, $cookies, $translate, $filter, $state, $q, bcPhoneNumber, languages, currency) { const wallet = { goal: { auth: false @@ -80,6 +80,7 @@ function Wallet($http, $window, $timeout, Alerts, MyWallet, MyBlockchainApi, MyB wallet.payment = MyWalletPayment; wallet.tokenEndpoints = MyWalletTokenEndpoints; + wallet.network = MyWalletNetwork; wallet.transactions = []; wallet.api_code = '1770d5d9-bcea-4d28-ad21-6cbd5be018a8'; @@ -290,7 +291,7 @@ function Wallet($http, $window, $timeout, Alerts, MyWallet, MyBlockchainApi, MyB errorCallback(); $rootScope.$safeApply(); }; - wallet.my.resendTwoFactorSms(uid, success, error); + wallet.network.resendTwoFactorSms(uid).then(success).catch(error); }; wallet.recoverGuid = (email, captcha) => { @@ -316,7 +317,7 @@ function Wallet($http, $window, $timeout, Alerts, MyWallet, MyBlockchainApi, MyB defer.reject(); $rootScope.$safeApply(); }; - wallet.my.recoverGuid(email, captcha).then(success).catch(error); + wallet.network.recoverGuid(email, captcha).then(success).catch(error); return defer.promise; }; @@ -344,7 +345,7 @@ function Wallet($http, $window, $timeout, Alerts, MyWallet, MyBlockchainApi, MyB defer.reject(); $rootScope.$safeApply(); }; - wallet.my.requestTwoFactorReset(guid, email, new_email, secret, message, captcha) + wallet.network.requestTwoFactorReset(guid, email, new_email, secret, message, captcha) .then(success) .catch(error); diff --git a/bower.json b/bower.json index a9e233679e..430d2cba49 100644 --- a/bower.json +++ b/bower.json @@ -23,7 +23,7 @@ "browserdetection": "0.3.*", "bc-qr-reader": "0.2.*", "bootstrap-sass": "3.3.*", - "blockchain-wallet": "3.5.*", + "blockchain-wallet": "3.6.*", "bc-phone-number": "5.0.*" }, "devDependencies": { diff --git a/tests/mocks/my_wallet/my_wallet_network.coffee b/tests/mocks/my_wallet/my_wallet_network.coffee new file mode 100644 index 0000000000..f3901d722c --- /dev/null +++ b/tests/mocks/my_wallet/my_wallet_network.coffee @@ -0,0 +1,2 @@ +angular.module('walletApp.core').factory 'MyWalletNetwork', () -> + this From 1ba4eab18ffb80d6bf0383c6bb30cfde7c0ca369 Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Tue, 12 Jan 2016 16:15:53 +0100 Subject: [PATCH 2/4] refactor(WalletNetwork): move 7 functions out of Wallet service --- app/index.jade | 1 + .../authorizeApprove.controller.js | 8 +- assets/js/controllers/login.controller.js | 4 +- assets/js/controllers/lostGuid.controller.js | 4 +- .../controllers/resetTwoFactor.controller.js | 4 +- .../resetTwoFactorToken.controller.js | 4 +- .../js/controllers/unsubscribe.controller.js | 4 +- .../js/controllers/verifyEmail.controller.js | 4 +- assets/js/services/wallet.service.js | 165 +--------------- assets/js/services/walletNetwork.service.js | 182 ++++++++++++++++++ 10 files changed, 201 insertions(+), 179 deletions(-) create mode 100644 assets/js/services/walletNetwork.service.js diff --git a/app/index.jade b/app/index.jade index 451badb76a..2ee67e2898 100644 --- a/app/index.jade +++ b/app/index.jade @@ -154,6 +154,7 @@ head script(src='build/js/directives/destinationInput.directive.js') script(src='build/js/services/wallet.service.js') + script(src='build/js/services/walletNetwork.service.js') script(src='build/js/services/securityCenter.service.js') script(src='build/js/services/adverts.service.js') script(src='build/js/services/bcTranslationLoader.service.js') diff --git a/assets/js/controllers/authorizeApprove.controller.js b/assets/js/controllers/authorizeApprove.controller.js index fd911875be..0ef9fc0daf 100644 --- a/assets/js/controllers/authorizeApprove.controller.js +++ b/assets/js/controllers/authorizeApprove.controller.js @@ -2,7 +2,7 @@ angular .module('walletApp') .controller("AuthorizeApproveCtrl", AuthorizeApproveCtrl); -function AuthorizeApproveCtrl($window, $scope, Wallet, $stateParams, $state, Alerts, $translate) { +function AuthorizeApproveCtrl($window, $scope, WalletNetwork, $stateParams, $state, Alerts, $translate) { const success = (uid) => { $scope.checkingToken = false; $scope.busyApproving = false; @@ -44,13 +44,13 @@ function AuthorizeApproveCtrl($window, $scope, Wallet, $stateParams, $state, Ale $scope.checkingToken = true; - Wallet.authorizeApprove($stateParams.token, differentBrowser, null) + WalletNetwork.authorizeApprove($stateParams.token, differentBrowser, null) .then(success) .catch(error); $scope.approve = () => { $scope.busyApproving = true; - Wallet.authorizeApprove($stateParams.token, () => {}, true) + WalletNetwork.authorizeApprove($stateParams.token, () => {}, true) .then(success) .catch(error); } @@ -68,7 +68,7 @@ function AuthorizeApproveCtrl($window, $scope, Wallet, $stateParams, $state, Ale }); }; - Wallet.authorizeApprove($stateParams.token, () => {}, false) + WalletNetwork.authorizeApprove($stateParams.token, () => {}, false) .then(rejected) .catch(error); } diff --git a/assets/js/controllers/login.controller.js b/assets/js/controllers/login.controller.js index 2fcefa26be..439a9f6cb9 100644 --- a/assets/js/controllers/login.controller.js +++ b/assets/js/controllers/login.controller.js @@ -2,7 +2,7 @@ angular .module('walletApp') .controller("LoginCtrl", LoginCtrl); -function LoginCtrl($scope, $rootScope, $log, $http, Wallet, Alerts, $cookies, $uibModal, $state, $stateParams, $timeout, $translate, filterFilter) { +function LoginCtrl($scope, $rootScope, $log, $http, Wallet, WalletNetwork, Alerts, $cookies, $uibModal, $state, $stateParams, $timeout, $translate, filterFilter) { $scope.status = Wallet.status; $scope.settings = Wallet.settings; $scope.disableLogin = null; @@ -136,7 +136,7 @@ function LoginCtrl($scope, $rootScope, $log, $http, Wallet, Alerts, $cookies, $u const error = () => { $scope.resending = false; }; - Wallet.resendTwoFactorSms($scope.uid, success, error); + WalletNetwork.resendTwoFactorSms($scope.uid).then(success).catch(error); } }; diff --git a/assets/js/controllers/lostGuid.controller.js b/assets/js/controllers/lostGuid.controller.js index 57856a21cb..70ec579ded 100644 --- a/assets/js/controllers/lostGuid.controller.js +++ b/assets/js/controllers/lostGuid.controller.js @@ -2,7 +2,7 @@ angular .module('walletApp') .controller('LostGuidCtrl', LostGuidCtrl); -function LostGuidCtrl($scope, $rootScope, $http, $translate, Wallet, Alerts) { +function LostGuidCtrl($scope, $rootScope, $http, $translate, WalletNetwork, Alerts) { $scope.currentStep = 1; $scope.fields = { email: '', @@ -29,7 +29,7 @@ function LostGuidCtrl($scope, $rootScope, $http, $translate, Wallet, Alerts) { $scope.remindForm.$setPristine(); $scope.remindForm.$setUntouched(); - Wallet.recoverGuid($scope.fields.email, $scope.fields.captcha).then(success).catch(error); + WalletNetwork.recoverGuid($scope.fields.email, $scope.fields.captcha).then(success).catch(error); }; // Set SID cookie by requesting headers diff --git a/assets/js/controllers/resetTwoFactor.controller.js b/assets/js/controllers/resetTwoFactor.controller.js index 896d4675f0..3eec3548fb 100644 --- a/assets/js/controllers/resetTwoFactor.controller.js +++ b/assets/js/controllers/resetTwoFactor.controller.js @@ -2,7 +2,7 @@ angular .module('walletApp') .controller('ResetTwoFactorCtrl', ResetTwoFactorCtrl); -function ResetTwoFactorCtrl($scope, $rootScope, $http, $translate, Wallet, Alerts) { +function ResetTwoFactorCtrl($scope, $rootScope, $http, $translate, WalletNetwork, Alerts) { $scope.currentStep = 1; $scope.fields = { @@ -34,7 +34,7 @@ function ResetTwoFactorCtrl($scope, $rootScope, $http, $translate, Wallet, Alert $scope.form.$setPristine(); $scope.form.$setUntouched(); - Wallet.requestTwoFactorReset( + WalletNetwork.requestTwoFactorReset( $scope.fields.uid, $scope.fields.email, $scope.fields.newEmail, diff --git a/assets/js/controllers/resetTwoFactorToken.controller.js b/assets/js/controllers/resetTwoFactorToken.controller.js index 218de4e04c..b28f859ca1 100644 --- a/assets/js/controllers/resetTwoFactorToken.controller.js +++ b/assets/js/controllers/resetTwoFactorToken.controller.js @@ -2,7 +2,7 @@ angular .module('walletApp') .controller("ResetTwoFactorTokenCtrl", ResetTwoFactorTokenCtrl); -function ResetTwoFactorTokenCtrl($scope, Wallet, $stateParams, $state, Alerts, $translate, $rootScope) { +function ResetTwoFactorTokenCtrl($scope, WalletNetwork, $stateParams, $state, Alerts, $translate, $rootScope) { const success = (obj) => { $scope.checkingToken = false @@ -27,5 +27,5 @@ function ResetTwoFactorTokenCtrl($scope, Wallet, $stateParams, $state, Alerts, $ $scope.checkingToken = true - Wallet.resetTwoFactorToken($stateParams.token).then(success).catch(error); + WalletNetwork.resetTwoFactorToken($stateParams.token).then(success).catch(error); } diff --git a/assets/js/controllers/unsubscribe.controller.js b/assets/js/controllers/unsubscribe.controller.js index 9d1dac2e68..24f84c3b17 100644 --- a/assets/js/controllers/unsubscribe.controller.js +++ b/assets/js/controllers/unsubscribe.controller.js @@ -2,7 +2,7 @@ angular .module('walletApp') .controller("UnsubscribeCtrl", UnsubscribeCtrl); -function UnsubscribeCtrl($scope, Wallet, $stateParams, $state, Alerts, $translate) { +function UnsubscribeCtrl($scope, WalletNetwork, $stateParams, $state, Alerts, $translate) { const success = (uid) => { if(uid) { @@ -27,5 +27,5 @@ function UnsubscribeCtrl($scope, Wallet, $stateParams, $state, Alerts, $translat Alerts.displayError(message, true); } - Wallet.unsubscribe($stateParams.token).then(success).catch(error); + WalletNetwork.unsubscribe($stateParams.token).then(success).catch(error); } diff --git a/assets/js/controllers/verifyEmail.controller.js b/assets/js/controllers/verifyEmail.controller.js index fdaf575c10..570d757ebe 100644 --- a/assets/js/controllers/verifyEmail.controller.js +++ b/assets/js/controllers/verifyEmail.controller.js @@ -2,7 +2,7 @@ angular .module('walletApp') .controller("VerifyEmailCtrl", VerifyEmailCtrl); -function VerifyEmailCtrl($scope, Wallet, $stateParams, $state, Alerts, $translate, $rootScope) { +function VerifyEmailCtrl($scope, WalletNetwork, $stateParams, $state, Alerts, $translate, $rootScope) { const success = (uid) => { if(uid) { $translate(['SUCCESS', 'EMAIL_VERIFIED_SUCCESS']).then(translations => { @@ -36,5 +36,5 @@ function VerifyEmailCtrl($scope, Wallet, $stateParams, $state, Alerts, $translat Alerts.displayError(message, true); } - Wallet.verifyEmail($stateParams.token).then(success).catch(error); + WalletNetwork.verifyEmail($stateParams.token).then(success).catch(error); } diff --git a/assets/js/services/wallet.service.js b/assets/js/services/wallet.service.js index b47e4d0b82..21f7685cd4 100644 --- a/assets/js/services/wallet.service.js +++ b/assets/js/services/wallet.service.js @@ -9,9 +9,9 @@ angular .module('walletServices', []) .factory('Wallet', Wallet); -Wallet.$inject = ['$http', '$window', '$timeout', 'Alerts', 'MyWallet', 'MyBlockchainApi', 'MyBlockchainSettings', 'MyWalletStore', 'MyWalletPayment', 'MyWalletTokenEndpoints', 'MyWalletNetwork','$rootScope', 'ngAudio', '$cookies', '$translate', '$filter', '$state', '$q', 'bcPhoneNumber', 'languages', 'currency']; +Wallet.$inject = ['$http', '$window', '$timeout', 'Alerts', 'MyWallet', 'MyBlockchainApi', 'MyBlockchainSettings', 'MyWalletStore', 'MyWalletPayment', '$rootScope', 'ngAudio', '$cookies', '$translate', '$filter', '$state', '$q', 'bcPhoneNumber', 'languages', 'currency']; -function Wallet($http, $window, $timeout, Alerts, MyWallet, MyBlockchainApi, MyBlockchainSettings, MyWalletStore, MyWalletPayment, MyWalletTokenEndpoints, MyWalletNetwork, $rootScope, ngAudio, $cookies, $translate, $filter, $state, $q, bcPhoneNumber, languages, currency) { +function Wallet( $http, $window, $timeout, Alerts, MyWallet, MyBlockchainApi, MyBlockchainSettings, MyWalletStore, MyWalletPayment, $rootScope, ngAudio, $cookies, $translate, $filter, $state, $q, bcPhoneNumber, languages, currency) { const wallet = { goal: { auth: false @@ -79,8 +79,6 @@ function Wallet($http, $window, $timeout, Alerts, MyWallet, MyBlockchainApi, MyB } wallet.payment = MyWalletPayment; - wallet.tokenEndpoints = MyWalletTokenEndpoints; - wallet.network = MyWalletNetwork; wallet.transactions = []; wallet.api_code = '1770d5d9-bcea-4d28-ad21-6cbd5be018a8'; @@ -280,98 +278,6 @@ function Wallet($http, $window, $timeout, Alerts, MyWallet, MyBlockchainApi, MyB }); }; - wallet.resendTwoFactorSms = (uid, successCallback, errorCallback) => { - let success = () => { - $translate('RESENT_2FA_SMS').then(Alerts.displaySuccess); - successCallback(); - $rootScope.$safeApply(); - }; - let error = (e) => { - $translate('RESENT_2FA_SMS_FAILED').then(Alerts.displayError); - errorCallback(); - $rootScope.$safeApply(); - }; - wallet.network.resendTwoFactorSms(uid).then(success).catch(error); - }; - - wallet.recoverGuid = (email, captcha) => { - let defer = $q.defer() - let success = (message) => { - Alerts.displaySuccess(message); - defer.resolve(); - $rootScope.$safeApply(); - }; - let error = (error) => { - - switch (error) { - case 'Captcha Code Incorrect': - Alerts.displayError($translate.instant('CAPTCHA_INCORRECT')); - break; - case 'Quota Exceeded': - Alerts.displayError($translate.instant('QUOTA_EXCEEDED')); - break; - default: - Alerts.displayError($translate.instant('UNKNOWN_ERROR')); - } - - defer.reject(); - $rootScope.$safeApply(); - }; - wallet.network.recoverGuid(email, captcha).then(success).catch(error); - return defer.promise; - }; - - wallet.requestTwoFactorReset = (guid, email, new_email, secret, message, captcha) => { - let defer = $q.defer() - - Alerts.clear() - let success = (message) => { - Alerts.displaySuccess(message); - defer.resolve(); - $rootScope.$safeApply(); - }; - let error = (error) => { - switch (error) { - case 'Captcha Code Incorrect': - Alerts.displayError($translate.instant('CAPTCHA_INCORRECT'), true); - break; - case 'Quota Exceeded': - Alerts.displayError($translate.instant('QUOTA_EXCEEDED'), true); - break; - default: - Alerts.displayError(error, true); - } - - defer.reject(); - $rootScope.$safeApply(); - }; - wallet.network.requestTwoFactorReset(guid, email, new_email, secret, message, captcha) - .then(success) - .catch(error); - - return defer.promise; - }; - - wallet.resetTwoFactorToken = (token) => { - let defer = $q.defer() - - const success = (obj) => { - defer.resolve(obj); - $rootScope.$safeApply(); - } - - const error = (e) => { - defer.reject(e.error); - $rootScope.$safeApply(); - } - - wallet.tokenEndpoints.resetTwoFactor(token) - .then(success) - .catch(error); - - return defer.promise; - } - wallet.create = (password, email, currency, language, success_callback) => { let success = (uid) => { Alerts.displaySuccess('Wallet created with identifier: ' + uid, true); @@ -1293,73 +1199,6 @@ function Wallet($http, $window, $timeout, Alerts, MyWallet, MyBlockchainApi, MyB wallet.my.wallet.encrypt(password, success, error, encrypting, syncing); }; - wallet.verifyEmail = (token) => { - let defer = $q.defer(); - - const success = (res) => { - wallet.user.isEmailVerified = true; - defer.resolve(res.guid); - $rootScope.$safeApply(); - } - - const error = (res) => { - console.log(res.error); - defer.reject(res.error); - $rootScope.$safeApply(); - } - - wallet.tokenEndpoints.verifyEmail(token) - .then(success) - .catch(error); - - return defer.promise; - } - - wallet.unsubscribe = (token) => { - let defer = $q.defer(); - - const success = (res) => { - defer.resolve(res.guid); - $rootScope.$safeApply(); - } - - const error = (res) => { - console.log(res.error); - defer.reject(res.error); - $rootScope.$safeApply(); - } - - wallet.tokenEndpoints.unsubscribe(token).then(success).catch(error); - - return defer.promise; - } - - wallet.authorizeApprove = (token, differentBrowserCallback, differentBrowserApproved) => { - let defer = $q.defer() - - const success = (res) => { - defer.resolve(res.guid); - $rootScope.$safeApply(); - } - - const error = (res) => { - console.log(res.error); - defer.reject(res.error); - $rootScope.$safeApply(); - } - - const differentBrowser = (details) => { - differentBrowserCallback(details); - $rootScope.$safeApply(); - } - - wallet.tokenEndpoints.authorizeApprove(token, differentBrowser, differentBrowserApproved) - .then(success) - .catch(error); - - return defer.promise; - } - // Testing: only works on mock MyWallet wallet.refresh = () => { diff --git a/assets/js/services/walletNetwork.service.js b/assets/js/services/walletNetwork.service.js new file mode 100644 index 0000000000..bd68a7d8d6 --- /dev/null +++ b/assets/js/services/walletNetwork.service.js @@ -0,0 +1,182 @@ +angular + .module('walletApp') + .factory('WalletNetwork', WalletNetwork); + +WalletNetwork.$inject = ['MyWalletTokenEndpoints', 'MyWalletNetwork', '$q', '$rootScope', 'Alerts', '$translate']; + +function WalletNetwork(MyWalletTokenEndpoints, MyWalletNetwork, $q, $rootScope, Alerts, $translate) { + const service = { + resetTwoFactorToken: resetTwoFactorToken, + verifyEmail: verifyEmail, + unsubscribe: unsubscribe, + authorizeApprove: authorizeApprove, + requestTwoFactorReset : requestTwoFactorReset, + resendTwoFactorSms: resendTwoFactorSms, + recoverGuid : recoverGuid + } + + function resetTwoFactorToken(token) { + let defer = $q.defer() + + const success = (obj) => { + defer.resolve(obj); + $rootScope.$safeApply(); + } + + const error = (e) => { + defer.reject(e.error); + $rootScope.$safeApply(); + } + + MyWalletTokenEndpoints.resetTwoFactor(token) + .then(success) + .catch(error); + + return defer.promise; + } + + function verifyEmail(token) { + let defer = $q.defer(); + + const success = (res) => { + defer.resolve(res.guid); + $rootScope.$safeApply(); + } + + const error = (res) => { + console.log(res.error); + defer.reject(res.error); + $rootScope.$safeApply(); + } + + MyWalletTokenEndpoints.verifyEmail(token) + .then(success) + .catch(error); + + return defer.promise; + } + + function unsubscribe(token) { + let defer = $q.defer(); + + const success = (res) => { + defer.resolve(res.guid); + $rootScope.$safeApply(); + } + + const error = (res) => { + console.log(res.error); + defer.reject(res.error); + $rootScope.$safeApply(); + } + + MyWalletTokenEndpoints.unsubscribe(token).then(success).catch(error); + + return defer.promise; + } + + function authorizeApprove(token, differentBrowserCallback, differentBrowserApproved) { + let defer = $q.defer() + + const success = (res) => { + defer.resolve(res.guid); + $rootScope.$safeApply(); + } + + const error = (res) => { + console.log(res.error); + defer.reject(res.error); + $rootScope.$safeApply(); + } + + const differentBrowser = (details) => { + differentBrowserCallback(details); + $rootScope.$safeApply(); + } + + MyWalletTokenEndpoints.authorizeApprove(token, differentBrowser, differentBrowserApproved) + .then(success) + .catch(error); + + return defer.promise; + } + + function requestTwoFactorReset(guid, email, new_email, secret, message, captcha) { + let defer = $q.defer() + + Alerts.clear() + let success = (message) => { + Alerts.displaySuccess(message); + defer.resolve(); + $rootScope.$safeApply(); + }; + let error = (error) => { + switch (error) { + case 'Captcha Code Incorrect': + Alerts.displayError($translate.instant('CAPTCHA_INCORRECT'), true); + break; + case 'Quota Exceeded': + Alerts.displayError($translate.instant('QUOTA_EXCEEDED'), true); + break; + default: + Alerts.displayError(error, true); + } + + defer.reject(); + $rootScope.$safeApply(); + }; + MyWalletNetwork.requestTwoFactorReset(guid, email, new_email, secret, message, captcha) + .then(success) + .catch(error); + + return defer.promise; + }; + + function resendTwoFactorSms(uid) { + let defer = $q.defer() + + let success = () => { + $translate('RESENT_2FA_SMS').then(Alerts.displaySuccess); + defer.resolve(); + $rootScope.$safeApply(); + }; + let error = (e) => { + $translate('RESENT_2FA_SMS_FAILED').then(Alerts.displayError); + defer.reject(); + $rootScope.$safeApply(); + }; + + MyWalletNetwork.resendTwoFactorSms(uid).then(success).catch(error); + + return defer.promise; + }; + + function recoverGuid(email, captcha) { + let defer = $q.defer() + let success = (message) => { + Alerts.displaySuccess(message); + defer.resolve(); + $rootScope.$safeApply(); + }; + let error = (error) => { + + switch (error) { + case 'Captcha Code Incorrect': + Alerts.displayError($translate.instant('CAPTCHA_INCORRECT')); + break; + case 'Quota Exceeded': + Alerts.displayError($translate.instant('QUOTA_EXCEEDED')); + break; + default: + Alerts.displayError($translate.instant('UNKNOWN_ERROR')); + } + + defer.reject(); + $rootScope.$safeApply(); + }; + MyWalletNetwork.recoverGuid(email, captcha).then(success).catch(error); + return defer.promise; + }; + + return service; +} From 881dac0ac7091278fdb89d81147a578ca6bdb4cf Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Tue, 12 Jan 2016 18:39:29 +0100 Subject: [PATCH 3/4] test(VerifyEmail): add tests Also fixed and expanded broken test for LoginCtrl. --- .../js/controllers/verifyEmail.controller.js | 28 +------ assets/js/services/alerts.service.js | 16 +++- tests/controllers/login_ctrl_spec.coffee | 45 +++++++---- .../controllers/verify_email_ctrl_spec.coffee | 78 +++++++++++++++++++ tests/mocks/ui_router_mock.coffee | 23 +++--- 5 files changed, 140 insertions(+), 50 deletions(-) create mode 100644 tests/controllers/verify_email_ctrl_spec.coffee diff --git a/assets/js/controllers/verifyEmail.controller.js b/assets/js/controllers/verifyEmail.controller.js index 570d757ebe..e4ad8b627b 100644 --- a/assets/js/controllers/verifyEmail.controller.js +++ b/assets/js/controllers/verifyEmail.controller.js @@ -4,31 +4,11 @@ angular function VerifyEmailCtrl($scope, WalletNetwork, $stateParams, $state, Alerts, $translate, $rootScope) { const success = (uid) => { - if(uid) { - $translate(['SUCCESS', 'EMAIL_VERIFIED_SUCCESS']).then(translations => { - $state.go("public.login-uid", {uid: uid}).then(() =>{ - $rootScope.$emit('showNotification', { - type: 'verified-email', - icon: 'ti-email', - heading: translations.SUCCESS, - msg: translations.EMAIL_VERIFIED_SUCCESS - }); - }); + $translate(['SUCCESS', 'EMAIL_VERIFIED_SUCCESS']).then(translations => { + $state.go("public.login-uid", {uid: uid}).then(() =>{ + Alerts.displayVerifiedEmail() }); - } else { - $translate(['SUCCESS', 'EMAIL_VERIFIED_SUCCESS_NO_UID']).then(translations => { - $state.go("public.login-no-uid").then(() => { - $rootScope.$emit('showNotification', { - type: 'verified-email', - icon: 'ti-email', - heading: translations.SUCCESS, - msg: translations.EMAIL_VERIFIED_SUCCESS_NO_UID - }); - }); - }); - } - - + }); } const error = (message) => { diff --git a/assets/js/services/alerts.service.js b/assets/js/services/alerts.service.js index 47f22d3b17..b7253ba5eb 100644 --- a/assets/js/services/alerts.service.js +++ b/assets/js/services/alerts.service.js @@ -2,9 +2,9 @@ angular .module('walletApp') .factory('Alerts', Alerts); -Alerts.$inject = ['$timeout']; +Alerts.$inject = ['$timeout', '$rootScope']; -function Alerts($timeout) { +function Alerts($timeout, $rootScope) { const service = { alerts : [], close : close, @@ -13,7 +13,8 @@ function Alerts($timeout) { displaySuccess : display.bind(null, 'success'), displayWarning : display.bind(null, ''), displayError : display.bind(null, 'danger'), - displayReceivedBitcoin : display.bind(null, 'received-bitcoin') + displayReceivedBitcoin : display.bind(null, 'received-bitcoin'), + displayVerifiedEmail : displayVerifiedEmail }; function close(alert, context=service.alerts) { @@ -34,5 +35,14 @@ function Alerts($timeout) { context.push(alert); } + function displayVerifiedEmail() { + $rootScope.$emit('showNotification', { + type: 'verified-email', + icon: 'ti-email', + heading: translations.SUCCESS, + msg: translations.EMAIL_VERIFIED_SUCCESS + }); + } + return service; } diff --git a/tests/controllers/login_ctrl_spec.coffee b/tests/controllers/login_ctrl_spec.coffee index 71bcd7eb16..f54a782d73 100644 --- a/tests/controllers/login_ctrl_spec.coffee +++ b/tests/controllers/login_ctrl_spec.coffee @@ -2,7 +2,7 @@ describe "LoginCtrl", -> scope = undefined modal = - open: (args) -> + open: (args) -> result: then: -> @@ -11,37 +11,54 @@ describe "LoginCtrl", -> beforeEach -> angular.mock.inject ($injector, $rootScope, $controller) -> Wallet = $injector.get("Wallet") - MyWallet = $injector.get("MyWallet") - + WalletNetwork = $injector.get("WalletNetwork") + + spyOn(WalletNetwork, "resendTwoFactorSms").and.callFake(()-> + { + then: (callback) -> + callback() + { + catch: (callback) -> + if false + callback() + { + } + } + } + ) + + MyWallet = $injector.get("MyWallet") + scope = $rootScope.$new() - + $controller "LoginCtrl", $scope: scope, $stateParams: {} $uibModal: modal - + return return - + it "should login", inject((Wallet) -> scope.uid = "user" scope.password = "pass" - + spyOn(Wallet, "login") - + scope.login() - + return ) - it "should resend two factor sms", inject((Wallet) -> + it "should resend two factor sms", inject((Wallet, WalletNetwork) -> Wallet.settings.twoFactorMethod = 5 - - spyOn(Wallet, "resendTwoFactorSms") + scope.uid = "user" scope.resend() - expect(Wallet.resendTwoFactorSms).toHaveBeenCalled() + expect(WalletNetwork.resendTwoFactorSms).toHaveBeenCalled() + expect(WalletNetwork.resendTwoFactorSms).toHaveBeenCalledWith("user") + return - ) \ No newline at end of file + ) diff --git a/tests/controllers/verify_email_ctrl_spec.coffee b/tests/controllers/verify_email_ctrl_spec.coffee new file mode 100644 index 0000000000..440c5a1e3a --- /dev/null +++ b/tests/controllers/verify_email_ctrl_spec.coffee @@ -0,0 +1,78 @@ +describe "VerifyEmailController", -> + scope = undefined + + beforeEach angular.mock.module("walletApp") + + beforeEach -> + angular.mock.inject ($injector, $rootScope, $controller) -> + WalletNetwork = $injector.get("WalletNetwork") + $state = $injector.get("$state") # This is a mock + Alerts = $injector.get("Alerts") + + spyOn(WalletNetwork, "verifyEmail").and.callFake((token)-> + { + then: (callback) -> + if token == "token" + callback("1234") + { + catch: (callback) -> + if token == "wrong-token" + callback() + { + } + } + } + ) + + spyOn($state, "go").and.callThrough() + + spyOn(Alerts, "displayError").and.callFake(() ->) + spyOn(Alerts, "displayVerifiedEmail").and.callFake(() ->) + + return + + return + + describe "with token", -> + beforeEach -> + angular.mock.inject ($controller, $rootScope) -> + + scope = $rootScope.$new() + + $controller "VerifyEmailCtrl", + $scope: scope, + $stateParams: {token: "token"} + + it "should show call WalletNetwork.verifyEmail()", inject((WalletNetwork) -> + expect(WalletNetwork.verifyEmail).toHaveBeenCalled() + ) + + it "should pass the token parameter along", inject((WalletNetwork) -> + expect(WalletNetwork.verifyEmail).toHaveBeenCalledWith("token") + ) + + it "should redirect to the login page", inject(($state)-> + expect($state.go).toHaveBeenCalledWith("public.login-uid", { uid : '1234' }) + ) + + it "should request a modal success message", inject((Alerts) -> + expect(Alerts.displayVerifiedEmail).toHaveBeenCalled() + ) + + describe "with wrong token", -> + beforeEach -> + angular.mock.inject ($controller, $rootScope) -> + + scope = $rootScope.$new() + + $controller "VerifyEmailCtrl", + $scope: scope, + $stateParams: {token: "wrong-token"} + + it "should display an error message", inject((Alerts)-> + expect(Alerts.displayError).toHaveBeenCalled() + ) + + it "should redirect to the login page", inject(($state)-> + expect($state.go).toHaveBeenCalledWith("public.login-no-uid") + ) diff --git a/tests/mocks/ui_router_mock.coffee b/tests/mocks/ui_router_mock.coffee index 3faa40b826..3bf93bd24d 100644 --- a/tests/mocks/ui_router_mock.coffee +++ b/tests/mocks/ui_router_mock.coffee @@ -5,18 +5,23 @@ angular.module("ui.router", ["ng"]).run [ ] angular.module("ui.router").provider "$state", -> - + $get: () -> $state = {current: "somewhere"} - - $state.go = (destination) -> - return - + + $state.go = (destination) -> + { + then: (callback) -> + callback() + { + } + } + return $state - + angular.module("ui.router").provider "$stateParams", -> - + $get: () -> $stateParams = {} - - return $stateParams \ No newline at end of file + + return $stateParams From 1ab336dfb7dee3a70a43afacc92b5c54d569a645 Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Fri, 15 Jan 2016 13:09:02 +0100 Subject: [PATCH 4/4] fix(AuthorizeApprove): promise might be resolved even if result is null --- .../authorizeApprove.controller.js | 21 +++++++------------ assets/js/services/walletNetwork.service.js | 2 +- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/assets/js/controllers/authorizeApprove.controller.js b/assets/js/controllers/authorizeApprove.controller.js index 0ef9fc0daf..5e0d320b62 100644 --- a/assets/js/controllers/authorizeApprove.controller.js +++ b/assets/js/controllers/authorizeApprove.controller.js @@ -3,27 +3,22 @@ angular .controller("AuthorizeApproveCtrl", AuthorizeApproveCtrl); function AuthorizeApproveCtrl($window, $scope, WalletNetwork, $stateParams, $state, Alerts, $translate) { - const success = (uid) => { + const success = (res) => { $scope.checkingToken = false; $scope.busyApproving = false; $scope.busyRejecting = false; + // If differentBrowser is called, success will be null: + if (res.success == null) return; $window.close(); // This is sometimes ignored, hence the code below: - if(uid) { - $translate('AUTHORIZE_APPROVE_SUCCESS').then(translation => { - $state.go("public.login-uid", {uid: uid}).then(() => { - Alerts.displaySuccess(translation) - }); + $translate('AUTHORIZE_APPROVE_SUCCESS').then(translation => { + $state.go("public.login-uid", {uid: res.guid}).then(() => { + Alerts.displaySuccess(translation) }); - } else { - $translate('AUTHORIZE_APPROVE_SUCCESS').then(translation => { - $state.go("public.login-no-uid").then(() => { - Alerts.displaySuccess(translation) - }); - }); - } + }); + } const error = (message) => { diff --git a/assets/js/services/walletNetwork.service.js b/assets/js/services/walletNetwork.service.js index bd68a7d8d6..f37ff10c79 100644 --- a/assets/js/services/walletNetwork.service.js +++ b/assets/js/services/walletNetwork.service.js @@ -79,7 +79,7 @@ function WalletNetwork(MyWalletTokenEndpoints, MyWalletNetwork, $q, $rootScope, let defer = $q.defer() const success = (res) => { - defer.resolve(res.guid); + defer.resolve(res); $rootScope.$safeApply(); }