diff --git a/Gruntfile.js b/Gruntfile.js index 81487fe1b..04e3537e0 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -20,7 +20,7 @@ module.exports = function(grunt) { tagMessage: 'Version <%= version %>', github: { repo: 'bitpay/copay', - usernameVar: 'GITHUB_USERNAME', //ENVIRONMENT VARIABLE that contains Github username + usernameVar: 'GITHUB_USERNAME', //ENVIRONMENT VARIABLE that contains Github username passwordVar: 'GITHUB_PASSWORD' //ENVIRONMENT VARIABLE that contains Github password } } @@ -79,13 +79,23 @@ module.exports = function(grunt) { config: { files: ['config.js'], tasks: ['shell:dev', 'concat:main'] + }, + test: { + files: ['test/models/*.js'], + tasks: ['mochaTest'] } }, mochaTest: { - options: { - reporter: 'spec', - }, - src: ['test/*.js'], + tests: { + options: { + require: 'test/mocha_node_setup.js', + reporter: 'spec', + mocha: require('mocha') + }, + src: [ + 'test/models/*.js', + ] + } }, markdown: { all: { diff --git a/karma.conf.js b/karma.conf.js index 06b14adcf..d2953b68a 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -10,7 +10,7 @@ module.exports = function(config) { // frameworks to use // available frameworks: https://npmjs.org/browse/keyword/karma-adapter - frameworks: ['mocha'], + frameworks: ['mocha', 'chai'], // list of files / patterns to load in the browser @@ -31,7 +31,6 @@ module.exports = function(config) { 'lib/angular-load/angular-load.min.js', 'lib/angular-gettext/dist/angular-gettext.min.js', 'lib/inherits/inherits.js', - 'lib/bitcore.js', 'lib/underscore/underscore.js', 'lib/crypto-js/rollups/sha256.js', 'lib/crypto-js/rollups/pbkdf2.js', @@ -41,6 +40,8 @@ module.exports = function(config) { 'lib/sjcl.js', 'lib/ios-imagefile-megapixel/megapix-image.js', 'lib/qrcode-decoder-js/lib/qrcode-decoder.min.js', + + 'lib/bitcore.js', 'js/copayBundle.js', //App-specific Code @@ -54,10 +55,6 @@ module.exports = function(config) { 'js/translations.js', 'js/init.js', - //Test-Specific Code - 'lib/chai/chai.js', - 'test/lib/chai-should.js', - 'test/lib/chai-expect.js', 'test/mocks/FakeWallet.js', 'test/mocks/FakeBlockchainSocket.js', 'test/mocks/FakePayProServer.js', @@ -66,7 +63,8 @@ module.exports = function(config) { 'test/mocha.conf.js', //test files - 'test/test.*.js', + 'karma/setup.js', + 'test/models/*.js', 'test/unit/**/*.js', diff --git a/karma/setup.js b/karma/setup.js new file mode 100644 index 000000000..c66adef61 --- /dev/null +++ b/karma/setup.js @@ -0,0 +1,16 @@ +if (!!window) { + window.bitcore = require('bitcore'); + window.expect = chai.expect; + window.bignum = bitcore.Bignum; + window.should = chai.should(); + + window.copay = require('copay'); + window.copayConfig = require('../config'); + + window.requireMock = function(name) { + return require('./mocks/' + name); + } + + window.is_browser = true; + window._ = require('underscore'); +} diff --git a/package.json b/package.json index 53b470995..658844fb3 100644 --- a/package.json +++ b/package.json @@ -71,10 +71,12 @@ "grunt-shell": "^0.6.4", "istanbul": "^0.2.10", "karma": "^0.12.9", + "karma-chai": "^0.1.0", "karma-chrome-launcher": "^0.1.3", "karma-firefox-launcher": "^0.1", - "karma-mocha": "^0.1.3", + "karma-mocha": "^0.1.9", "karma-phantomjs-launcher": "^0.1.4", + "karma-sinon": "^1.0.3", "load-grunt-tasks": "^0.6.0", "mocha": "^1.18.2", "mocha-lcov-reporter": "^0.0.1", diff --git a/test/mocha.opts b/test/mocha.opts index ec648f252..f009d3996 100644 --- a/test/mocha.opts +++ b/test/mocha.opts @@ -1 +1 @@ --R spec +--require test/mocha_node_setup.js --reporter spec test/models/*.js diff --git a/test/mocha_node_setup.js b/test/mocha_node_setup.js new file mode 100644 index 000000000..0bac889af --- /dev/null +++ b/test/mocha_node_setup.js @@ -0,0 +1,27 @@ +if (!!global) { + global.chai = require('chai'); + global.sinon = require('sinon'); + global.bitcore = require('bitcore'); + global.expect = global.chai.expect; + global.bignum = global.bitcore.Bignum; + global.should = global.chai.should(); + + try { + global.copay = require('copay'); + global.copayConfig = require('config'); + } catch (e) { + global.copay = require('../copay'); + global.copayConfig = require('../config'); + } + + global.requireMock = function(name) { + try { + return require('../mocks/' + name); + } catch (e) { + return require('./mocks/' + name); + } + } + + global.is_browser = typeof process == 'undefined' || typeof process.versions === 'undefined'; + global._ = require('underscore'); +} diff --git a/test/test.HDParams.js b/test/models/HDParams.js similarity index 90% rename from test/test.HDParams.js rename to test/models/HDParams.js index ee7cafd6a..91e51dc9c 100644 --- a/test/test.HDParams.js +++ b/test/models/HDParams.js @@ -1,16 +1,6 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); - -var bitcore = bitcore || require('bitcore'); var Address = bitcore.Address; -var buffertools = bitcore.buffertools; -try { - var copay = require('copay'); //browser -} catch (e) { - var copay = require('../copay'); //node -} var PublicKeyRing = copay.PublicKeyRing; var HDParams = copay.HDParams; var HDPath = copay.HDPath; @@ -106,4 +96,4 @@ describe('HDParams model', function() { merge.should.throw(Error); }) -}); \ No newline at end of file +}); diff --git a/test/test.HDPath.js b/test/models/HDPath.js similarity index 88% rename from test/test.HDPath.js rename to test/models/HDPath.js index d81a8ed7f..e4ee923be 100644 --- a/test/test.HDPath.js +++ b/test/models/HDPath.js @@ -1,14 +1,6 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var bitcore = bitcore || require('bitcore'); -try { - var copay = require('copay'); //browser -} catch (e) { - var copay = require('../copay'); //node -} -var HDPath = require('../js/models/HDPath'); +var HDPath = copay.HDPath; describe('HDPath model', function() { it('should have the correct constants', function() { diff --git a/test/test.Passphrase.js b/test/models/Passphrase.js similarity index 79% rename from test/test.Passphrase.js rename to test/models/Passphrase.js index dd249f283..38811eada 100644 --- a/test/test.Passphrase.js +++ b/test/models/Passphrase.js @@ -1,14 +1,5 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var bitcore = bitcore || require('bitcore'); -var buffertools = bitcore.buffertools; -try { - var copay = require('copay'); //browser -} catch (e) { - var copay = require('../copay'); //node -} var Passphrase = copay.Passphrase; describe('Passphrase model', function() { diff --git a/test/test.PayPro.js b/test/models/PayPro.js similarity index 97% rename from test/test.PayPro.js rename to test/models/PayPro.js index c6fa55d9b..9741225d3 100644 --- a/test/test.PayPro.js +++ b/test/models/PayPro.js @@ -1,30 +1,19 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var sinon = require('sinon'); -var is_browser = typeof process == 'undefined' || typeof process.versions === 'undefined'; -if (is_browser) { - var copay = require('copay'); //browser -} else { - var copay = require('../copay'); //node -} var Wallet = copay.Wallet; var PrivateKey = copay.PrivateKey; -var Network = require('./mocks/FakeNetwork'); -var Blockchain = require('./mocks/FakeBlockchain'); -var bitcore = bitcore || require('bitcore'); +var Network = requireMock('FakeNetwork'); +var Blockchain = requireMock('FakeBlockchain'); var TransactionBuilder = bitcore.TransactionBuilder; var Transaction = bitcore.Transaction; var Address = bitcore.Address; var PayPro = bitcore.PayPro; var bignum = bitcore.Bignum; var startServer = copay.FakePayProServer; // TODO should be require('./mocks/FakePayProServer'); -var localMock = require('./mocks/FakeLocalStorage'); -var sessionMock = require('./mocks/FakeLocalStorage'); +var localMock = requireMock('FakeLocalStorage'); +var sessionMock = requireMock('FakeLocalStorage'); var Storage = copay.Storage; - var server; var walletConfig = { @@ -33,7 +22,7 @@ var walletConfig = { spendUnconfirmed: true, reconnectDelay: 100, networkName: 'testnet', - storage: require('./mocks/FakeLocalStorage').storageParams, + storage: requireMock('FakeLocalStorage').storageParams, }; var getNewEpk = function() { diff --git a/test/test.PrivateKey.js b/test/models/PrivateKey.js similarity index 92% rename from test/test.PrivateKey.js rename to test/models/PrivateKey.js index 3c2c4da8b..d8b32a77b 100644 --- a/test/test.PrivateKey.js +++ b/test/models/PrivateKey.js @@ -1,8 +1,5 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var bitcore = bitcore || require('bitcore'); var Transaction = bitcore.Transaction; var buffertools = bitcore.buffertools; var WalletKey = bitcore.WalletKey; @@ -11,12 +8,7 @@ var bignum = bitcore.Bignum; var networks = bitcore.networks; var Address = bitcore.Address; var BitcorePrivateKey = bitcore.PrivateKey; -try { - var copay = require('copay'); //browser -} catch (e) { - var copay = require('../copay'); //node -} -var PrivateKey = copay.PrivateKey || require('../js/models/PrivateKey'); +var PrivateKey = copay.PrivateKey; var pkConfig = { networkName: 'livenet', diff --git a/test/test.PublicKeyRing.js b/test/models/PublicKeyRing.js similarity index 97% rename from test/test.PublicKeyRing.js rename to test/models/PublicKeyRing.js index c9bb98730..77cd47b88 100644 --- a/test/test.PublicKeyRing.js +++ b/test/models/PublicKeyRing.js @@ -1,18 +1,8 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var bitcore = bitcore || require('bitcore'); var Address = bitcore.Address; -var buffertools = bitcore.buffertools; -var HDPath = require('../js/models/HDPath'); - -try { - var copay = require('copay'); //browser -} catch (e) { - var copay = require('../copay'); //node -} +var HDPath = copay.HDPath; var PrivateKey = copay.PrivateKey; var PublicKeyRing = copay.PublicKeyRing; diff --git a/test/test.Storage.js b/test/models/Storage.js similarity index 96% rename from test/test.Storage.js rename to test/models/Storage.js index 6e76213e3..a528044a8 100644 --- a/test/test.Storage.js +++ b/test/models/Storage.js @@ -1,10 +1,4 @@ 'use strict'; -var chai = chai || require('chai'); -var sinon = require('sinon'); -var _ = require('underscore'); -var should = chai.should(); -var is_browser = typeof process == 'undefined' || typeof process.versions === 'undefined'; -var copay = copay || require('../copay'); var Storage = copay.Storage; var fakeWallet = 'fake-wallet-id'; @@ -14,7 +8,7 @@ describe('Storage model', function() { var s; beforeEach(function() { - s = new Storage(require('./mocks/FakeLocalStorage').storageParams); + s = new Storage(requireMock('FakeLocalStorage').storageParams); s.setPassphrase('mysupercoolpassword'); s.storage.clear(); s.sessionStorage.clear(); @@ -22,11 +16,11 @@ describe('Storage model', function() { it('should create an instance', function() { - var s2 = new Storage(require('./mocks/FakeLocalStorage').storageParams); + var s2 = new Storage(requireMock('FakeLocalStorage').storageParams); should.exist(s2); }); it('should fail when encrypting without a password', function() { - var s2 = new Storage(require('./mocks/FakeLocalStorage').storageParams); + var s2 = new Storage(requireMock('FakeLocalStorage').storageParams); (function() { s2._write(fakeWallet + timeStamp, 1, function() {}); }).should.throw('NOPASSPHRASE'); diff --git a/test/test.TxProposal.js b/test/models/TxProposal.js similarity index 97% rename from test/test.TxProposal.js rename to test/models/TxProposal.js index 78dff1541..4a2d857a0 100644 --- a/test/test.TxProposal.js +++ b/test/models/TxProposal.js @@ -1,10 +1,6 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var bitcore = bitcore || require('bitcore'); var Transaction = bitcore.Transaction; -var buffertools = bitcore.buffertools; var WalletKey = bitcore.WalletKey; var Key = bitcore.Key; var bignum = bitcore.Bignum; @@ -12,15 +8,7 @@ var Script = bitcore.Script; var TransactionBuilder = bitcore.TransactionBuilder; var util = bitcore.util; var networks = bitcore.networks; -var sinon = require('sinon'); -var is_browser = typeof process == 'undefined' || typeof process.versions === 'undefined'; -if (is_browser) { - var copay = require('copay'); //browser -} else { - var copay = require('../copay'); //node -} - -var FakeBuilder = require('./mocks/FakeBuilder'); +var FakeBuilder = requireMock('FakeBuilder'); var TxProposal = copay.TxProposal; var dummyProposal = new TxProposal({ diff --git a/test/test.TxProposals.js b/test/models/TxProposals.js similarity index 91% rename from test/test.TxProposals.js rename to test/models/TxProposals.js index 2cc332e69..c87c141ab 100644 --- a/test/test.TxProposals.js +++ b/test/models/TxProposals.js @@ -1,10 +1,6 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var bitcore = bitcore || require('bitcore'); var Transaction = bitcore.Transaction; -var buffertools = bitcore.buffertools; var WalletKey = bitcore.WalletKey; var Key = bitcore.Key; var bignum = bitcore.Bignum; @@ -12,14 +8,8 @@ var Script = bitcore.Script; var TransactionBuilder = bitcore.TransactionBuilder; var util = bitcore.util; var networks = bitcore.networks; -var sinon = require('sinon'); -try { - var copay = require('copay'); //browser -} catch (e) { - var copay = require('../copay'); //node -} -var FakeBuilder = require('./mocks/FakeBuilder'); +var FakeBuilder = requireMock('FakeBuilder'); var TxProposal = copay.TxProposal; var TxProposals = copay.TxProposals; diff --git a/test/test.Wallet.js b/test/models/Wallet.js similarity index 98% rename from test/test.Wallet.js rename to test/models/Wallet.js index beb20f0bb..89e3c495b 100644 --- a/test/test.Wallet.js +++ b/test/models/Wallet.js @@ -1,23 +1,11 @@ 'use strict'; -var _ = require('underscore'); -var chai = chai || require('chai'); -var should = chai.should(); -var sinon = require('sinon'); -var is_browser = (typeof process == 'undefined' || typeof process.versions === 'undefined'); -if (is_browser) { - var copay = require('copay'); //browser -} else { - var copay = require('../copay'); //node -} -var copayConfig = require('../config'); var Wallet = copay.Wallet; var PrivateKey = copay.PrivateKey; var Storage = copay.Storage; -var Network = require('./mocks/FakeNetwork'); -var Blockchain = require('./mocks/FakeBlockchain'); -var Builder = require('./mocks/FakeBuilder'); -var bitcore = bitcore || require('bitcore'); +var Network = requireMock('FakeNetwork'); +var Blockchain = requireMock('FakeBlockchain'); +var Builder = requireMock('FakeBuilder'); var TransactionBuilder = bitcore.TransactionBuilder; var Transaction = bitcore.Transaction; var Address = bitcore.Address; @@ -28,7 +16,7 @@ var walletConfig = { spendUnconfirmed: true, reconnectDelay: 100, networkName: 'testnet', - storage: require('./mocks/FakeLocalStorage').storageParams, + storage: requireMock('FakeLocalStorage').storageParams, }; var getNewEpk = function() { diff --git a/test/test.WalletFactory.js b/test/models/WalletFactory.js similarity index 98% rename from test/test.WalletFactory.js rename to test/models/WalletFactory.js index 5ecd1008c..0bd5a71c5 100644 --- a/test/test.WalletFactory.js +++ b/test/models/WalletFactory.js @@ -1,22 +1,16 @@ 'use strict'; -var _ = require('underscore'); -var chai = chai || require('chai'); -var should = chai.should(); - -var copay = copay || require('../copay'); -var sinon = require('sinon'); -var FakeNetwork = require('./mocks/FakeNetwork'); -var FakeBlockchain = require('./mocks/FakeBlockchain'); +var FakeNetwork = requireMock('FakeNetwork'); +var FakeBlockchain = requireMock('FakeBlockchain'); var FakeStorage = function FakeStorage() {}; -var WalletFactory = require('../js/models/WalletFactory'); -var Passphrase = require('../js/models/Passphrase'); -var mockLocalStorage = require('./mocks/FakeLocalStorage'); -var mockSessionStorage = require('./mocks/FakeLocalStorage'); +var WalletFactory = copay.WalletFactory; +var Passphrase = copay.Passphrase; +var mockLocalStorage = requireMock('FakeLocalStorage'); +var mockSessionStorage = requireMock('FakeLocalStorage'); -var PERSISTED_PROPERTIES = (copay.Wallet || require('../js/models/Wallet')).PERSISTED_PROPERTIES; +var PERSISTED_PROPERTIES = copay.Wallet.PERSISTED_PROPERTIES; function assertObjectEqual(a, b) { PERSISTED_PROPERTIES.forEach(function(k) { diff --git a/test/test.WalletLock.js b/test/models/WalletLock.js similarity index 86% rename from test/test.WalletLock.js rename to test/models/WalletLock.js index 6b2cb3ee2..6f680c395 100644 --- a/test/test.WalletLock.js +++ b/test/models/WalletLock.js @@ -1,26 +1,15 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var sinon = require('sinon'); -var is_browser = (typeof process == 'undefined' || typeof process.versions === 'undefined'); -if (is_browser) { - var copay = require('copay'); //browser -} else { - var copay = require('../copay'); //node -} -var copayConfig = require('../config'); var WalletLock = copay.WalletLock; var PrivateKey = copay.PrivateKey; var Storage = copay.Storage; - var storage; describe('WalletLock model', function() { beforeEach(function() { - storage = new Storage(require('./mocks/FakeLocalStorage').storageParams); + storage = new Storage(requireMock('FakeLocalStorage').storageParams); storage.setPassphrase('mysupercoolpassword'); storage.storage.clear(); storage.sessionStorage.clear(); diff --git a/test/test.blockchain.Insight.js b/test/models/blockchain.Insight.js similarity index 98% rename from test/test.blockchain.Insight.js rename to test/models/blockchain.Insight.js index 032725f18..386e16bbf 100644 --- a/test/test.blockchain.Insight.js +++ b/test/models/blockchain.Insight.js @@ -1,12 +1,7 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var sinon = require('sinon'); -var bitcore = bitcore || require('bitcore'); -var FakeSocket = require('./mocks/FakeBlockchainSocket'); +var FakeSocket = requireMock('FakeBlockchainSocket'); -var copay = copay || require('../copay'); var Buffer = bitcore.Buffer; var Insight = copay.Insight; diff --git a/test/test.network.Async.js b/test/models/network.Async.js similarity index 97% rename from test/test.network.Async.js rename to test/models/network.Async.js index b7097c61f..0b4f71210 100644 --- a/test/test.network.Async.js +++ b/test/models/network.Async.js @@ -1,11 +1,5 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var expect = chai.expect; -var sinon = sinon || require('sinon'); -var bitcore = bitcore || require('bitcore'); -var copay = copay || require('../copay'); var Async = copay.Async; var EventEmitter = require('events').EventEmitter; diff --git a/test/test.performance.js b/test/models/performance.js similarity index 93% rename from test/test.performance.js rename to test/models/performance.js index 39a6581cb..8f218e24a 100644 --- a/test/test.performance.js +++ b/test/models/performance.js @@ -1,9 +1,7 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var PrivateKey = require('../js/models/PrivateKey'); -var PublicKeyRing = require('../js/models/PublicKeyRing'); +var PrivateKey = copay.PrivateKey; +var PublicKeyRing = copay.PublicKeyRing; var getNewEpk = function() { return new PrivateKey({ diff --git a/test/run.sh b/test/run.sh index c13caa84d..84c97f3fa 100755 --- a/test/run.sh +++ b/test/run.sh @@ -1,5 +1,5 @@ #! /bin/bash -node_modules/.bin/istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && \ +node_modules/.bin/istanbul cover grunt -- mochaTest && \ cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && \ ./node_modules/karma/bin/karma start --browsers Firefox --single-run