From 86295c9cf0f6672dc10a90714e243b2fe0ae57b9 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Mon, 16 Jun 2014 15:44:22 -0300 Subject: [PATCH 01/11] add backup service --- js/services/backup.js | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 js/services/backup.js diff --git a/js/services/backup.js b/js/services/backup.js new file mode 100644 index 000000000..64d20d55c --- /dev/null +++ b/js/services/backup.js @@ -0,0 +1,6 @@ +'use strict'; + +var BackupService = function() { +}; + +angular.module('copayApp.services').value('backup', new BackupService()); From b40038a554b5f6f1f08519e031f7bfd405306c84 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Mon, 16 Jun 2014 16:46:17 -0300 Subject: [PATCH 02/11] extract backup into service --- index.html | 1 + js/app.js | 4 +- js/controllers/backup.js | 66 ++++++++------------------------ js/controllers/signin.js | 74 ++++++++++++++++++++++++------------ js/services/backup.js | 6 --- js/services/backupService.js | 47 +++++++++++++++++++++++ 6 files changed, 115 insertions(+), 83 deletions(-) delete mode 100644 js/services/backup.js create mode 100644 js/services/backupService.js diff --git a/index.html b/index.html index caf3c0eb1..de4a5840c 100644 --- a/index.html +++ b/index.html @@ -849,6 +849,7 @@ on supported browsers please check http://www.w + diff --git a/js/app.js b/js/app.js index 2060979fc..5dea3f699 100644 --- a/js/app.js +++ b/js/app.js @@ -26,13 +26,13 @@ var copayApp = window.copayApp = angular.module('copayApp',[ 'monospaced.qrcode', 'notifications', 'copayApp.filters', + 'copayApp.services', 'copayApp.controllers', 'copayApp.directives', - 'copayApp.services', ]); angular.module('copayApp.filters', []); +angular.module('copayApp.services', []); angular.module('copayApp.controllers', []); angular.module('copayApp.directives', []); -angular.module('copayApp.services', []); diff --git a/js/controllers/backup.js b/js/controllers/backup.js index 92cc40f9b..3e4eb6c0a 100644 --- a/js/controllers/backup.js +++ b/js/controllers/backup.js @@ -1,69 +1,33 @@ 'use strict'; angular.module('copayApp.controllers').controller('BackupController', - function($scope, $rootScope, $location, $window, $timeout, $modal) { + function($scope, $rootScope, $location, $window, $timeout, $modal, backupService) { $scope.title = 'Backup'; - var _getEncryptedWallet = function() { - var wallet = $rootScope.wallet.toEncryptedObj(); - return wallet; - }; - $scope.download = function() { - var timestamp = +(new Date); - var walletName = ($rootScope.wallet.name ? $rootScope.wallet.name : '') + '-' + $rootScope.wallet.id ; - var filename = walletName + '-' + timestamp + '.json.aes'; - var wallet = _getEncryptedWallet(); - var blob = new Blob([wallet], {type: 'text/plain;charset=utf-8'}); - // show a native save dialog if we are in the shell - // and pass the wallet to the shell to convert to node Buffer - if (window.cshell) { - return window.cshell.send('backup:download', { - name: walletName, - wallet: wallet - }); - } - // otherwise lean on the browser implementation - saveAs(blob, filename); + backupService.download($rootScope.wallet); }; - $scope.openModal = function () { - var modalInstance = $modal.open({ - templateUrl: 'backupModal.html', - controller: ModalInstanceCtrl, - }); + $scope.openModal = function() { + var modalInstance = $modal.open({ + templateUrl: 'backupModal.html', + controller: ModalInstanceCtrl, + }); - modalInstance.result.then(sendEmail); - }; + modalInstance.result.then(function(email) { + backupService.sendEmail(email, $rootScope.wallet); + }); + }; - var sendEmail = function(email) { - var body = _getEncryptedWallet(); - var subject = ($rootScope.wallet.name ? $rootScope.wallet.name + ' - ' : '') + $rootScope.wallet.id; - var href = 'mailto:' + email + '?' - + 'subject=[Copay Backup] ' + subject + '&' - + 'body=' + body; + }); - if (window.cshell) { - return window.cshell.send('backup:email', href); - } +var ModalInstanceCtrl = function($scope, $modalInstance) { - var newWin = $window.open(href, '_blank', 'scrollbars=yes,resizable=yes,width=10,height=10'); - - if (newWin) { - $timeout(function() { - newWin.close(); - }, 1000); - } - }; -}); - -var ModalInstanceCtrl = function ($scope, $modalInstance) { - - $scope.submit = function (form) { + $scope.submit = function(form) { $modalInstance.close($scope.email); }; - $scope.cancel = function () { + $scope.cancel = function() { $modalInstance.dismiss('cancel'); }; }; diff --git a/js/controllers/signin.js b/js/controllers/signin.js index 2c522efba..d6c5be450 100644 --- a/js/controllers/signin.js +++ b/js/controllers/signin.js @@ -2,9 +2,10 @@ angular.module('copayApp.controllers').controller('SigninController', function($scope, $rootScope, $location, walletFactory, controllerUtils, Passphrase) { - var cmp = function(o1, o2){ - var v1 = o1.show.toLowerCase(), v2 = o2.show.toLowerCase(); - return v1 > v2 ? 1 : ( v1 < v2 ) ? -1 : 0; + var cmp = function(o1, o2) { + var v1 = o1.show.toLowerCase(), + v2 = o2.show.toLowerCase(); + return v1 > v2 ? 1 : (v1 < v2) ? -1 : 0; }; $rootScope.videoInfo = {}; $scope.loading = false; @@ -14,23 +15,31 @@ angular.module('copayApp.controllers').controller('SigninController', $scope.open = function(form) { if (form && form.$invalid) { - $rootScope.$flashMessage = { message: 'Please, enter required fields', type: 'error'}; + $rootScope.$flashMessage = { + message: 'Please, enter required fields', + type: 'error' + }; return; } - + $scope.loading = true; var password = form.openPassword.$modelValue; - Passphrase.getBase64Async(password, function(passphrase){ + Passphrase.getBase64Async(password, function(passphrase) { var w, errMsg; - try{ - var w = walletFactory.open($scope.selectedWalletId, { passphrase: passphrase}); - } catch (e){ + try { + var w = walletFactory.open($scope.selectedWalletId, { + passphrase: passphrase + }); + } catch (e) { errMsg = e.message; }; if (!w) { $scope.loading = false; - $rootScope.$flashMessage = { message: errMsg || 'Wrong password', type: 'error'}; + $rootScope.$flashMessage = { + message: errMsg || 'Wrong password', + type: 'error' + }; $rootScope.$digest(); return; } @@ -40,31 +49,48 @@ angular.module('copayApp.controllers').controller('SigninController', $scope.join = function(form) { if (form && form.$invalid) { - $rootScope.$flashMessage = { message: 'Please, enter required fields', type: 'error'}; + $rootScope.$flashMessage = { + message: 'Please, enter required fields', + type: 'error' + }; return; } $scope.loading = true; - walletFactory.network.on('badSecret', function() { - }); + walletFactory.network.on('badSecret', function() {}); - Passphrase.getBase64Async($scope.joinPassword, function(passphrase){ - walletFactory.joinCreateSession($scope.connectionId, $scope.nickname, passphrase, function(err,w) { + Passphrase.getBase64Async($scope.joinPassword, function(passphrase) { + walletFactory.joinCreateSession($scope.connectionId, $scope.nickname, passphrase, function(err, w) { $scope.loading = false; if (err || !w) { - if (err === 'joinError') - $rootScope.$flashMessage = { message: 'Can not find peer'}; + if (err === 'joinError') + $rootScope.$flashMessage = { + message: 'Can\'t find peer' + }; else if (err === 'walletFull') - $rootScope.$flashMessage = { message: 'The wallet is full', type: 'error'}; + $rootScope.$flashMessage = { + message: 'The wallet is full', + type: 'error' + }; else if (err === 'badNetwork') - $rootScope.$flashMessage = { message: 'The wallet your are trying to join uses a different Bitcoin Network. Check your settings.', type: 'error'}; - else if (err === 'badSecret') - $rootScope.$flashMessage = { message: 'Bad secret secret string', type: 'error'}; - else - $rootScope.$flashMessage = { message: 'Unknown error', type: 'error'}; + $rootScope.$flashMessage = { + message: 'The wallet your are trying to join uses a different Bitcoin Network. Check your settings.', + type: 'error' + }; + else if (err === 'badSecret') + $rootScope.$flashMessage = { + message: 'Bad secret secret string', + type: 'error' + }; + else + $rootScope.$flashMessage = { + message: 'Unknown error', + type: 'error' + }; controllerUtils.onErrorDigest(); } else { - controllerUtils.startNetwork(w, $scope); + backupService.download(w); + controllerUtils.startNetwork(w, $scope); } }); }); diff --git a/js/services/backup.js b/js/services/backup.js deleted file mode 100644 index 64d20d55c..000000000 --- a/js/services/backup.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -var BackupService = function() { -}; - -angular.module('copayApp.services').value('backup', new BackupService()); diff --git a/js/services/backupService.js b/js/services/backupService.js new file mode 100644 index 000000000..8e5d64455 --- /dev/null +++ b/js/services/backupService.js @@ -0,0 +1,47 @@ +'use strict'; + +var BackupService = function() {}; + +BackupService.prototype.getName = function(wallet) { + return (wallet.name ? (wallet.name+'-') : '') + wallet.id; +}; + +BackupService.prototype.download = function(wallet) { + var ew = wallet.toEncryptedObj(); + var timestamp = +(new Date()); + var walletName = this.getName(wallet); + var filename = walletName + '-' + timestamp + '.json.aes'; + var blob = new Blob([ew], { + type: 'text/plain;charset=utf-8' + }); + // show a native save dialog if we are in the shell + // and pass the wallet to the shell to convert to node Buffer + if (window.cshell) { + return window.cshell.send('backup:download', { + name: walletName, + wallet: ew + }); + } + // otherwise lean on the browser implementation + saveAs(blob, filename); +}; + +BackupService.prototype.sendEmail = function(email, wallet) { + var ew = wallet.toEncryptedObj(); + var body = ew; + var subject = this.getName(wallet); + var href = 'mailto:' + email + '?' + 'subject=[Copay Backup] ' + subject + '&' + 'body=' + body; + + if (window.cshell) { + return window.cshell.send('backup:email', href); + } + + var newWin = window.open(href, '_blank', 'scrollbars=yes,resizable=yes,width=10,height=10'); + if (newWin) { + setTimeout(function() { + newWin.close(); + }, 1000); + } +}; + +angular.module('copayApp.services').value('backupService', new BackupService()); From eeb621b6016bf7e37a4af650c9aa0a0792e23364 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Mon, 16 Jun 2014 16:54:50 -0300 Subject: [PATCH 03/11] added auto backup after create/join --- js/controllers/setup.js | 3 ++- js/controllers/signin.js | 2 +- js/services/backupService.js | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/js/controllers/setup.js b/js/controllers/setup.js index bdc9d8a49..ce36e12ef 100644 --- a/js/controllers/setup.js +++ b/js/controllers/setup.js @@ -33,7 +33,7 @@ var valid_pairs = { }; angular.module('copayApp.controllers').controller('SetupController', - function($scope, $rootScope, $location, $timeout, walletFactory, controllerUtils, Passphrase) { + function($scope, $rootScope, $location, $timeout, walletFactory, controllerUtils, Passphrase, backupService) { $rootScope.videoInfo = {}; $scope.loading = false; @@ -84,6 +84,7 @@ angular.module('copayApp.controllers').controller('SetupController', passphrase: passphrase, }; var w = walletFactory.create(opts); + backupService.download(w); controllerUtils.startNetwork(w, $scope); }); }; diff --git a/js/controllers/signin.js b/js/controllers/signin.js index d6c5be450..f639871ba 100644 --- a/js/controllers/signin.js +++ b/js/controllers/signin.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('SigninController', - function($scope, $rootScope, $location, walletFactory, controllerUtils, Passphrase) { + function($scope, $rootScope, $location, walletFactory, controllerUtils, Passphrase, backupService) { var cmp = function(o1, o2) { var v1 = o1.show.toLowerCase(), v2 = o2.show.toLowerCase(); diff --git a/js/services/backupService.js b/js/services/backupService.js index 8e5d64455..982d3376a 100644 --- a/js/services/backupService.js +++ b/js/services/backupService.js @@ -10,7 +10,7 @@ BackupService.prototype.download = function(wallet) { var ew = wallet.toEncryptedObj(); var timestamp = +(new Date()); var walletName = this.getName(wallet); - var filename = walletName + '-' + timestamp + '.json.aes'; + var filename = walletName + '-' + timestamp + '-keybackup.json.aes'; var blob = new Blob([ew], { type: 'text/plain;charset=utf-8' }); From 4b81bc1fdbf08b115f49bc8e0d33c002a1b30ca7 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Mon, 16 Jun 2014 17:40:59 -0300 Subject: [PATCH 04/11] add tests --- test/mocks/FakeWallet.js | 6 ++++++ test/unit/services/servicesSpec.js | 21 +++++++++++++++++++++ util/build.js | 5 +++++ 3 files changed, 32 insertions(+) diff --git a/test/mocks/FakeWallet.js b/test/mocks/FakeWallet.js index ec7f4fade..cfdcc75b9 100644 --- a/test/mocks/FakeWallet.js +++ b/test/mocks/FakeWallet.js @@ -3,6 +3,7 @@ var FakeWallet = function(){ this.balance=10000; this.safeBalance=1000; this.balanceByAddr={'1CjPR7Z5ZSyWk6WtXvSFgkptmpoi4UM9BC': 1000}; + this.name = 'myTESTwullet'; }; FakeWallet.prototype.set = function(balance, safeBalance, balanceByAddr){ @@ -28,6 +29,11 @@ FakeWallet.prototype.getBalance=function(cb){ return cb(null, this.balance, this.balanceByAddr, this.safeBalance); }; + +FakeWallet.prototype.toEncryptedObj = function() { + return 'SUPERENCRYPTEDSICRITSTUFF'; +}; + // This mock is meant for karma, module.exports is not necesary. try { module.exports = require('soop')(FakeWallet); diff --git a/test/unit/services/servicesSpec.js b/test/unit/services/servicesSpec.js index f272d51dd..65fed5a81 100644 --- a/test/unit/services/servicesSpec.js +++ b/test/unit/services/servicesSpec.js @@ -87,3 +87,24 @@ describe("Unit: controllerUtils", function() { }); + + +describe("Unit: Backup Service", function() { + var sinon = require('../sinon'); + beforeEach(angular.mock.module('copayApp.services')); + it('should contain a backup service', inject(function(backupService) { + expect(backupService).not.to.equal(null); + })); + it('should backup in file', inject(function(backupService) { + var mock = sinon.mock(window); + var expectation = mock.expects('saveAs'); + backupService.download(new FakeWallet()); + expectation.once(); + })); + it('should backup by email', inject(function(backupService) { + var mock = sinon.mock(window); + var expectation = mock.expects('open'); + backupService.sendEmail('fake@test.com', new FakeWallet()); + expectation.once(); + })); +}); diff --git a/util/build.js b/util/build.js index 7a1be5ffe..220162f47 100755 --- a/util/build.js +++ b/util/build.js @@ -80,6 +80,11 @@ var createBundle = function(opts) { expose: '../js/models/core/Passphrase' }); + if (opts.dontminify) { + b.require('sinon', { + expose: '../sinon' + }); + } if (!opts.dontminify) { b.transform({ global: true From 9462da95c062da56b42cfffcb9ddf5cdb52e6528 Mon Sep 17 00:00:00 2001 From: Gustavo Cortez Date: Mon, 16 Jun 2014 17:50:02 -0300 Subject: [PATCH 05/11] Fixes on storage tests (removes current localStorage) * Fix test that removes localStorage (made clean() function). * Enable the test for LocalPlain model. --- test/test.storage.LocalEncrypted.js | 27 ++++++++++++++++++--------- test/test.storage.LocalPlain.js | 15 +++++++++++---- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/test/test.storage.LocalEncrypted.js b/test/test.storage.LocalEncrypted.js index 60b16966b..8b614cd68 100644 --- a/test/test.storage.LocalEncrypted.js +++ b/test/test.storage.LocalEncrypted.js @@ -7,8 +7,10 @@ if (typeof process === 'undefined' || !process.version) { var copay = copay || require('../copay'); var LocalEncrypted = copay.StorageLocalEncrypted; + var fakeWallet = 'fake-wallet-id'; + var timeStamp = Date.now(); + describe('Storage/LocalEncrypted model', function() { - var wid = 'fake-wallet-id'; var s = new LocalEncrypted(); s._setPassphrase('mysupercoolpassword'); @@ -18,14 +20,19 @@ if (typeof process === 'undefined' || !process.version) { }); it('should fail when encrypting without a password', function() { var s = new LocalEncrypted(); - (function(){s.set(wid, 'x', 1);}).should.throw(); + (function(){ + s.set(fakeWallet, timeStamp, 1); + localStorage.removeItem(fakeWallet +'::'+ timeStamp); + }).should.throw(); }); it('should be able to encrypt and decrypt', function() { - s._write('key', 'value'); - s._read('key').should.equal('value'); + s._write(fakeWallet+timeStamp, 'value'); + s._read(fakeWallet+timeStamp).should.equal('value'); + localStorage.removeItem(fakeWallet+timeStamp); }); it('should be able to set a value', function() { - s.set(wid, 'x', 1); + s.set(fakeWallet, timeStamp, 1); + localStorage.removeItem(fakeWallet +'::'+ timeStamp); }); var getSetData = [ 1,1000,-15, -1000, @@ -40,22 +47,24 @@ if (typeof process === 'undefined' || !process.version) { ]; getSetData.forEach(function(obj) { it('should be able to set a value and get it for '+JSON.stringify(obj), function() { - s.set(wid, 'x', obj); - var obj2 = s.get(wid, 'x'); + s.set(fakeWallet, timeStamp, obj); + var obj2 = s.get(fakeWallet, timeStamp); JSON.stringify(obj2).should.equal(JSON.stringify(obj)); + localStorage.removeItem(fakeWallet +'::'+ timeStamp); }); }); describe('#export', function() { it('should export the encrypted wallet', function() { - localStorage.clear(); var storage = new LocalEncrypted({password: 'password'}); - storage.set('walletId', 'test', 'testval'); + storage.set(fakeWallet, timeStamp, 'testval'); var obj = {test:'testval'}; var encrypted = storage.export(obj); encrypted.length.should.be.greaterThan(10); + localStorage.removeItem(fakeWallet +'::'+ timeStamp); //encrypted.slice(0,6).should.equal("53616c"); }); }); + }); } diff --git a/test/test.storage.LocalPlain.js b/test/test.storage.LocalPlain.js index 7b0c6734d..06d474f5c 100644 --- a/test/test.storage.LocalPlain.js +++ b/test/test.storage.LocalPlain.js @@ -7,7 +7,7 @@ if (typeof process === 'undefined' || !process.version) { var copay = copay || require('../copay'); var LocalPlain = copay.StorageLocalPlain; - describe.skip('Storage/LocalPlain model', function() { + describe('Storage/LocalPlain model', function() { it('should create an instance', function() { var s = new LocalPlain(); @@ -16,7 +16,9 @@ if (typeof process === 'undefined' || !process.version) { describe('#setFromObj', function() { it('should set keys from an object', function() { - localStorage.clear(); + var fakeWallet = 'fake-wallet-id'; + var timeStamp = Date.now(); + var obj = { test: 'testval', opts: { @@ -24,8 +26,13 @@ if (typeof process === 'undefined' || !process.version) { } }; var storage = new LocalPlain(); - storage.setFromObj('walletId', obj); - storage.get('walletId', 'test').should.equal('testval'); + storage.setFromObj(fakeWallet+timeStamp, obj); + storage.get(fakeWallet+timeStamp, 'test').should.equal('testval'); + + // Clean data used in localstorage + localStorage.removeItem(fakeWallet+timeStamp+'::test'); + localStorage.removeItem(fakeWallet+timeStamp+'::opts'); + localStorage.removeItem('nameFor::'+fakeWallet+timeStamp); }); }); }); From f7e34acae8ce52c0370d3c146b5bf5bdc240c9cb Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Sun, 15 Jun 2014 20:55:23 -0700 Subject: [PATCH 06/11] make mocha browser tests all run with no console errors ...except Wallet and WalletFactory. --- copay.js | 8 +------- js/models/core/WalletFactory.js | 18 ++++++++++++------ test/index.html | 4 ---- test/test.API.js | 6 +++++- test/test.AddressIndex.js | 6 +++++- test/test.Passphrase.js | 6 +++++- test/test.PrivateKey.js | 8 ++++++-- test/test.PublicKeyRing.js | 6 +++++- test/test.Structure.js | 6 +++++- test/test.TxProposals.js | 8 ++++++-- test/test.Wallet.js | 6 +++++- test/test.WalletFactory.js | 19 +++++++++++++------ test/test.blockchain.Insight.js | 6 +++++- util/build.js | 17 ++++++++++++----- 14 files changed, 85 insertions(+), 39 deletions(-) diff --git a/copay.js b/copay.js index 585fc1677..544b0eb45 100644 --- a/copay.js +++ b/copay.js @@ -1,4 +1,3 @@ - // core module.exports.PublicKeyRing = require('./js/models/core/PublicKeyRing'); module.exports.TxProposals = require('./js/models/core/TxProposals'); @@ -14,11 +13,6 @@ var Insight = module.exports.Insight = require('./js/models/blockchain/Insight') var StorageLocalPlain = module.exports.StorageLocalPlain = require('./js/models/storage/LocalPlain'); var StorageLocalEncrypted = module.exports.StorageLocalEncrypted = require('./js/models/storage/LocalEncrypted'); -var WalletFactory = require('soop').load('./js/models/core/WalletFactory',{ - Network: WebRTC, - Blockchain: Insight, - Storage: StorageLocalEncrypted, -}); -module.exports.WalletFactory = WalletFactory; +module.exports.WalletFactory = require('./js/models/core/WalletFactory'); module.exports.version = require('./version'); module.exports.API = require('./API'); diff --git a/js/models/core/WalletFactory.js b/js/models/core/WalletFactory.js index 6c00cc96a..9554ab531 100644 --- a/js/models/core/WalletFactory.js +++ b/js/models/core/WalletFactory.js @@ -1,15 +1,17 @@ 'use strict'; var imports = require('soop').imports(); -var Storage = imports.Storage; -var Network = imports.Network; -var Blockchain = imports.Blockchain; var TxProposals = require('./TxProposals'); var PublicKeyRing = require('./PublicKeyRing'); var PrivateKey = require('./PrivateKey'); var Wallet = require('./Wallet'); +var WebRTC = module.exports.WebRTC = require('../network/WebRTC'); +var Insight = module.exports.Insight = require('../blockchain/Insight'); +//var StorageLocalPlain = module.exports.StorageLocalPlain = require('../storage/LocalPlain'); +var StorageLocalEncrypted = module.exports.StorageLocalEncrypted = require('../storage/LocalEncrypted'); + /* * WalletFactory * @@ -19,9 +21,13 @@ function WalletFactory(config, version) { var self = this; config = config || {}; - this.storage = new Storage(config.storage); - this.network = new Network(config.network); - this.blockchain = new Blockchain(config.blockchain); + this.Storage = config.Storage || StorageLocalEncrypted; + this.Network = config.Network || WebRTC; + this.Blockchain = config.Blockchain || Insight; + + this.storage = new this.Storage(config.storage); + this.network = new this.Network(config.network); + this.blockchain = new this.Blockchain(config.blockchain); this.networkName = config.networkName; this.verbose = config.verbose; diff --git a/test/index.html b/test/index.html index 52dab4944..a2e2a06b5 100644 --- a/test/index.html +++ b/test/index.html @@ -14,15 +14,11 @@ - - diff --git a/test/test.API.js b/test/test.API.js index 14569a337..caeef8637 100644 --- a/test/test.API.js +++ b/test/test.API.js @@ -2,7 +2,11 @@ var chai = chai || require('chai'); var should = chai.should(); -var copay = copay || require('../copay'); +try { + var copay = require('copay'); //browser +} catch (e) { + var copay = require('../copay'); //node +} var API = API || copay.API; var Storage = Storage || require('../test/mocks/FakeStorage'); diff --git a/test/test.AddressIndex.js b/test/test.AddressIndex.js index d78ea3407..130ea99a2 100644 --- a/test/test.AddressIndex.js +++ b/test/test.AddressIndex.js @@ -5,7 +5,11 @@ var should = chai.should(); var bitcore = bitcore || require('bitcore'); var Address = bitcore.Address; var buffertools = bitcore.buffertools; -var copay = copay || require('../copay'); +try { + var copay = require('copay'); //browser +} catch (e) { + var copay = require('../copay'); //node +} var PublicKeyRing = copay.PublicKeyRing; var AddressIndex = copay.AddressIndex; diff --git a/test/test.Passphrase.js b/test/test.Passphrase.js index 6e2b58a02..882135f54 100644 --- a/test/test.Passphrase.js +++ b/test/test.Passphrase.js @@ -4,7 +4,11 @@ var chai = chai || require('chai'); var should = chai.should(); var bitcore = bitcore || require('bitcore'); var buffertools = bitcore.buffertools; -var copay = copay || require('../copay'); +try { + var copay = require('copay'); //browser +} catch (e) { + var copay = require('../copay'); //node +} var Passphrase = copay.Passphrase; diff --git a/test/test.PrivateKey.js b/test/test.PrivateKey.js index 0bfb820c8..7e002759c 100644 --- a/test/test.PrivateKey.js +++ b/test/test.PrivateKey.js @@ -7,11 +7,15 @@ var Transaction = bitcore.Transaction; var buffertools = bitcore.buffertools; var WalletKey = bitcore.WalletKey; var Key = bitcore.Key; -var bignum = bitcore.bignum; +var bignum = bitcore.Bignum; var networks = bitcore.networks; var Address = bitcore.Address; var BitcorePrivateKey = bitcore.PrivateKey; -var copay = copay || require('../copay'); +try { + var copay = require('copay'); //browser +} catch (e) { + var copay = require('../copay'); //node +} var PrivateKey = copay.PrivateKey || require('../js/models/core/PrivateKey'); var config = { diff --git a/test/test.PublicKeyRing.js b/test/test.PublicKeyRing.js index c21ed6dd8..b4c541178 100644 --- a/test/test.PublicKeyRing.js +++ b/test/test.PublicKeyRing.js @@ -5,7 +5,11 @@ var should = chai.should(); var bitcore = bitcore || require('bitcore'); var Address = bitcore.Address; var buffertools = bitcore.buffertools; -var copay = copay || require('../copay'); +try { + var copay = require('copay'); //browser +} catch (e) { + var copay = require('../copay'); //node +} var PublicKeyRing = copay.PublicKeyRing; var aMasterPubKey = 'tprv8ZgxMBicQKsPdSVTiWXEqCCzqRaRr9EAQdn5UVMpT9UHX67Dh1FmzEMbavPumpAicsUm2XvC6NTdcWB89yN5DUWx5HQ7z3KByUg7Ht74VRZ'; diff --git a/test/test.Structure.js b/test/test.Structure.js index 722497ab0..845032b14 100644 --- a/test/test.Structure.js +++ b/test/test.Structure.js @@ -3,7 +3,11 @@ var chai = chai || require('chai'); var should = chai.should(); var bitcore = bitcore || require('bitcore'); -var copay = copay || require('../copay'); +try { + var copay = require('copay'); //browser +} catch (e) { + var copay = require('../copay'); //node +} var Structure = require('../js/models/core/Structure'); describe('Structure model', function() { diff --git a/test/test.TxProposals.js b/test/test.TxProposals.js index 59beb4822..d95c20370 100644 --- a/test/test.TxProposals.js +++ b/test/test.TxProposals.js @@ -12,7 +12,11 @@ var Script = bitcore.Script; var Builder = bitcore.TransactionBuilder; var util = bitcore.util; var networks = bitcore.networks; -var copay = copay || require('../copay'); +try { + var copay = require('copay'); //browser +} catch (e) { + var copay = require('../copay'); //node +} var fakeStorage = copay.FakeStorage; var PrivateKey = copay.PrivateKey || require('../js/models/PrivateKey'); var TxProposals = copay.TxProposals || require('../js/models/TxProposal'); @@ -126,7 +130,7 @@ describe('TxProposals model', function() { var createTx = function(toAddress, amountSatStr, utxos, opts, priv, pkr) { opts = opts || {}; - var amountSat = bitcore.bignum(amountSatStr); + var amountSat = bitcore.Bignum(amountSatStr); if (!pkr.isComplete()) { throw new Error('publicKeyRing is not complete'); diff --git a/test/test.Wallet.js b/test/test.Wallet.js index 91f223bbd..eea60056b 100644 --- a/test/test.Wallet.js +++ b/test/test.Wallet.js @@ -3,7 +3,11 @@ var chai = chai || require('chai'); var should = chai.should(); var sinon = require('sinon'); -var copay = copay || require('../copay'); +try { + var copay = require('copay'); //browser +} catch (e) { + var copay = require('../copay'); //node +} var Wallet = require('../js/models/core/Wallet'); var Storage = require('./mocks/FakeStorage'); var Network = require('./mocks/FakeNetwork'); diff --git a/test/test.WalletFactory.js b/test/test.WalletFactory.js index aeec5faed..3bae8797d 100644 --- a/test/test.WalletFactory.js +++ b/test/test.WalletFactory.js @@ -7,17 +7,17 @@ var FakeNetwork = require('./mocks/FakeNetwork'); var Insight = require('../js/models/blockchain/Insight'); var FakeStorage = require('./mocks/FakeStorage'); -var WalletFactory = typeof copay === 'undefined' ? require('soop').load('../js/models/core/WalletFactory', { - Network: FakeNetwork, - Blockchain: Insight, - Storage: FakeStorage, -}) : copay.WalletFactory; +try { + var copay = require('copay'); //browser +} catch (e) { + var copay = require('../copay'); //node +} +var WalletFactory = require('../js/models/core/WalletFactory'); var blanket = require("blanket")({ "pattern": "/js/" }); - var addCopayers = function(w) { for (var i = 0; i < 4; i++) { w.publicKeyRing.addCopayer(); @@ -26,11 +26,15 @@ var addCopayers = function(w) { describe('WalletFactory model', function() { var config = { + Network: FakeNetwork, + Blockchain: Insight, + Storage: FakeStorage, wallet: { requiredCopayers: 3, totalCopayers: 5, spendUnconfirmed: 1, reconnectDelay: 100, + }, blockchain: { host: 'test.insight.is', @@ -82,6 +86,9 @@ describe('WalletFactory model', function() { it('BIP32 length problem', function() { var sconfig = { + Network: FakeNetwork, + Blockchain: Insight, + Storage: FakeStorage, "networkName": "testnet", "network": { "key": "g23ihfh82h35rf", diff --git a/test/test.blockchain.Insight.js b/test/test.blockchain.Insight.js index a17cb07ce..f27e9f511 100644 --- a/test/test.blockchain.Insight.js +++ b/test/test.blockchain.Insight.js @@ -3,7 +3,11 @@ var chai = chai || require('chai'); var should = chai.should(); var bitcore = bitcore || require('bitcore'); -var copay = copay || require('../copay'); +try { + var copay = require('copay'); //browser +} catch (e) { + var copay = require('../copay'); //node +} var Insight = copay.Insight || require('../js/models/blockchain/Insight'); var ID = '933bf321393459b7'; diff --git a/util/build.js b/util/build.js index 220162f47..2af0ca892 100755 --- a/util/build.js +++ b/util/build.js @@ -50,7 +50,9 @@ var createBundle = function(opts) { }); b.require('./version'); // b.external('bitcore'); - b.require('./js/models/core/WalletFactory'); + b.require('./js/models/core/WalletFactory', { + expose: '../js/models/core/WalletFactory' + }); b.require('./js/models/core/Wallet'); b.require('./js/models/core/Wallet', { expose: '../js/models/core/Wallet' @@ -58,6 +60,9 @@ var createBundle = function(opts) { b.require('./test/mocks/FakeStorage', { expose: './mocks/FakeStorage' }); + b.require('./test/mocks/FakeBlockchain', { + expose: './mocks/FakeBlockchain' + }); b.require('./js/models/core/Wallet', { expose: '../js/models/core/Wallet' }); @@ -81,10 +86,12 @@ var createBundle = function(opts) { }); if (opts.dontminify) { - b.require('sinon', { - expose: '../sinon' - }); + //include dev dependencies + b.require('sinon'); + b.require('blanket'); + b.require('soop'); } + if (!opts.dontminify) { b.transform({ global: true @@ -101,7 +108,7 @@ if (require.main === module) { var program = require('commander'); program .version('0.0.1') - .option('-d, --dontminify', 'Don\'t minify the code.') + .option('-d, --dontminify', 'Development. Don\'t minify the code.') .option('-o, --stdout', 'Specify output as stdout') .parse(process.argv); From 46efea1243ac2052f100b2ed20e20a9d66bdd68f Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Sun, 15 Jun 2014 21:19:21 -0700 Subject: [PATCH 07/11] make Wallet tests work in mocha browser --- test/test.Wallet.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test.Wallet.js b/test/test.Wallet.js index eea60056b..c1557b3b6 100644 --- a/test/test.Wallet.js +++ b/test/test.Wallet.js @@ -81,7 +81,7 @@ describe('Wallet model', function() { should.exist(w.privateKey); should.exist(w.txProposals); should.exist(w.netKey); - var b = new Buffer(w.netKey, 'base64'); + var b = new bitcore.Buffer(w.netKey, 'base64'); b.toString('hex').length.should.equal(16); }); @@ -291,6 +291,7 @@ describe('Wallet model', function() { }); it('call reconnect after interval', function(done) { + this.timeout(10000); var w = createW2(); var testTime = 1000; var callCount = 0; @@ -543,6 +544,7 @@ describe('Wallet model', function() { }); }); it('should create & sign transaction from received funds', function(done) { + this.timeout(10000); var w = createW2(); var pk = w.privateKey; w.privateKey = null; From de4225cc3f0fad8f99edb228c3bf5f1c539f1f98 Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Sun, 15 Jun 2014 21:36:23 -0700 Subject: [PATCH 08/11] make WalletFactory tests work in mocha browser --- test/test.WalletFactory.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/test.WalletFactory.js b/test/test.WalletFactory.js index 3bae8797d..c4536192d 100644 --- a/test/test.WalletFactory.js +++ b/test/test.WalletFactory.js @@ -14,10 +14,6 @@ try { } var WalletFactory = require('../js/models/core/WalletFactory'); -var blanket = require("blanket")({ - "pattern": "/js/" -}); - var addCopayers = function(w) { for (var i = 0; i < 4; i++) { w.publicKeyRing.addCopayer(); From e413ec43ef46e21f74b2104c77ecd2babba097a0 Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Mon, 16 Jun 2014 12:38:24 -0700 Subject: [PATCH 09/11] add TxProposals test; fix WalletFactory link --- test/index.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/index.html b/test/index.html index a2e2a06b5..f34a867bf 100644 --- a/test/index.html +++ b/test/index.html @@ -19,8 +19,9 @@ + - + From 4ba6eeafb5adfb1fbb3525841b839bebb1422217 Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Tue, 17 Jun 2014 09:08:58 -0700 Subject: [PATCH 10/11] fix karma tests by using require('sinon') not incorrect require('../sinon') --- test/unit/services/servicesSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/services/servicesSpec.js b/test/unit/services/servicesSpec.js index 65fed5a81..64e9e713e 100644 --- a/test/unit/services/servicesSpec.js +++ b/test/unit/services/servicesSpec.js @@ -90,7 +90,7 @@ describe("Unit: controllerUtils", function() { describe("Unit: Backup Service", function() { - var sinon = require('../sinon'); + var sinon = require('sinon'); beforeEach(angular.mock.module('copayApp.services')); it('should contain a backup service', inject(function(backupService) { expect(backupService).not.to.equal(null); From 13350d21b355dcde72b8725ae8994d4a77675776 Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Tue, 17 Jun 2014 09:39:41 -0700 Subject: [PATCH 11/11] fix more tests broken in last rebase --- test/test.PublicKeyRing.js | 23 +++++++++++++++++++---- test/test.TxProposals.js | 6 +++--- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/test/test.PublicKeyRing.js b/test/test.PublicKeyRing.js index b4c541178..06776761a 100644 --- a/test/test.PublicKeyRing.js +++ b/test/test.PublicKeyRing.js @@ -15,10 +15,6 @@ var PublicKeyRing = copay.PublicKeyRing; var aMasterPubKey = 'tprv8ZgxMBicQKsPdSVTiWXEqCCzqRaRr9EAQdn5UVMpT9UHX67Dh1FmzEMbavPumpAicsUm2XvC6NTdcWB89yN5DUWx5HQ7z3KByUg7Ht74VRZ'; -var config = { - networkName:'livenet', -}; - var createW = function (networkName) { var config = { networkName: networkName || 'livenet', @@ -41,6 +37,10 @@ var createW = function (networkName) { describe('PublicKeyRing model', function() { it('should create an instance (livenet)', function () { + var config = { + networkName:'livenet', + }; + var w = new PublicKeyRing({ networkName: config.networkName }); @@ -54,6 +54,9 @@ describe('PublicKeyRing model', function() { }); it('should fail to generate shared pub keys wo extended key', function () { + var config = { + networkName:'livenet', + }; var w2 = new PublicKeyRing(config); should.exist(w2); @@ -239,6 +242,9 @@ describe('PublicKeyRing model', function() { it('#merge pubkey tests', function () { + var config = { + networkName:'livenet', + }; var w = new PublicKeyRing(config); should.exist(w); var copayers = []; @@ -268,6 +274,9 @@ describe('PublicKeyRing model', function() { }); it('#merge pubkey tests (case 2)', function () { + var config = { + networkName:'livenet', + }; var w = new PublicKeyRing(config); should.exist(w); @@ -285,6 +294,9 @@ describe('PublicKeyRing model', function() { it('#merge with nickname', function () { + var config = { + networkName:'livenet', + }; var w = new PublicKeyRing(config); should.exist(w); for(var i=0; i<3; i++) { @@ -319,6 +331,9 @@ describe('PublicKeyRing model', function() { it('#toObj #fromObj with nickname', function () { + var config = { + networkName:'livenet', + }; var w = new PublicKeyRing(config); should.exist(w); for(var i=0; i<3; i++) { diff --git a/test/test.TxProposals.js b/test/test.TxProposals.js index d95c20370..00df86166 100644 --- a/test/test.TxProposals.js +++ b/test/test.TxProposals.js @@ -7,7 +7,7 @@ var Transaction = bitcore.Transaction; var buffertools = bitcore.buffertools; var WalletKey = bitcore.WalletKey; var Key = bitcore.Key; -var bignum = bitcore.bignum; +var bignum = bitcore.Bignum; var Script = bitcore.Script; var Builder = bitcore.TransactionBuilder; var util = bitcore.util; @@ -20,11 +20,11 @@ try { var fakeStorage = copay.FakeStorage; var PrivateKey = copay.PrivateKey || require('../js/models/PrivateKey'); var TxProposals = copay.TxProposals || require('../js/models/TxProposal'); +var is_browser = (typeof process == 'undefined' || typeof process.versions === 'undefined') var PublicKeyRing = is_browser ? copay.PublicKeyRing : require('soop').load('../js/models/core/PublicKeyRing', { Storage: fakeStorage }); -var is_browser = (typeof process.versions === 'undefined') var config = { networkName: 'testnet', @@ -106,7 +106,7 @@ describe('TxProposals model', function() { tx = b.build(); tx.isComplete().should.equal(true); - var s = new Script(new Buffer(unspentTest[0].scriptPubKey, 'hex')); + var s = new Script(new bitcore.Buffer(unspentTest[0].scriptPubKey, 'hex')); tx.verifyInput(0, s, { verifyP2SH: true,