From 65d73d7bb4b091021988b6115d518cf3914952ed Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Mon, 18 Apr 2016 11:41:29 -0700 Subject: Unify test suites --- README.md | 13 +- package.json | 7 +- test/unit/actions/config_test.js | 43 ++++++ test/unit/actions/restore_vault_test.js | 54 +++++++ test/unit/actions/set_selected_account_test.js | 28 ++++ test/unit/actions/tx_test.js | 168 ++++++++++++++++++++++ test/unit/actions/view_info_test.js | 23 +++ test/unit/actions/warning_test.js | 24 ++++ test/unit/migrations-test.js | 1 - test/unit/util_test.js | 114 +++++++++++++++ ui/test/setup.js | 8 -- ui/test/unit/actions/config_test.js | 43 ------ ui/test/unit/actions/restore_vault_test.js | 54 ------- ui/test/unit/actions/set_selected_account_test.js | 28 ---- ui/test/unit/actions/tx_test.js | 168 ---------------------- ui/test/unit/actions/view_info_test.js | 23 --- ui/test/unit/actions/warning_test.js | 24 ---- ui/test/unit/util_test.js | 114 --------------- 18 files changed, 459 insertions(+), 478 deletions(-) create mode 100644 test/unit/actions/config_test.js create mode 100644 test/unit/actions/restore_vault_test.js create mode 100644 test/unit/actions/set_selected_account_test.js create mode 100644 test/unit/actions/tx_test.js create mode 100644 test/unit/actions/view_info_test.js create mode 100644 test/unit/actions/warning_test.js create mode 100644 test/unit/util_test.js delete mode 100644 ui/test/setup.js delete mode 100644 ui/test/unit/actions/config_test.js delete mode 100644 ui/test/unit/actions/restore_vault_test.js delete mode 100644 ui/test/unit/actions/set_selected_account_test.js delete mode 100644 ui/test/unit/actions/tx_test.js delete mode 100644 ui/test/unit/actions/view_info_test.js delete mode 100644 ui/test/unit/actions/warning_test.js delete mode 100644 ui/test/unit/util_test.js diff --git a/README.md b/README.md index 1d15fa204..1c5508a49 100644 --- a/README.md +++ b/README.md @@ -44,18 +44,11 @@ To enjoy the live-reloading that `gulp dev` offers while working on the `web3-pr ### Running Tests -Currently the tests are split between two suites (we recently merged the UI into the main plugin repository). There are two different test suites to be concerned with: - -Plugin tests, `npm test`. -UI tests, `npm run testUi`. - -You can also run both of these with continuously watching processes, via `npm run watch` and `npm run watchUi`. - -#### UI Testing Particulars - Requires `mocha` installed. Run `npm install -g mocha`. -You can either run the test suite once with `npm testUi`, or you can reload on file changes, by running `mocha watch ui/test/**/**`. +Then just run `npm test`. + +You can also test with a continuously watching process, via `npm run watch`. ### Deploying the UI diff --git a/package.json b/package.json index f6bde2e4e..3981f3058 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,8 @@ "private": true, "scripts": { "start": "gulp dev", - "test": "npm run testUi", - "testPlugin": "mocha --require test/helper.js --compilers js:babel-register --recursive", - "watch": "mocha watch --compilers js:babel-register --recursive", - "testUi": "mocha ui/test/**/**/*test.js", - "watchUi": "mocha watch ui/test/**/*test.js" + "test": "mocha --require test/helper.js --compilers js:babel-register --recursive", + "watch": "mocha watch --compilers js:babel-register --recursive" }, "browserify": { "transform": [ diff --git a/test/unit/actions/config_test.js b/test/unit/actions/config_test.js new file mode 100644 index 000000000..6a0d20f31 --- /dev/null +++ b/test/unit/actions/config_test.js @@ -0,0 +1,43 @@ +var jsdom = require('mocha-jsdom') +var assert = require('assert') +var freeze = require('deep-freeze-strict') +var path = require('path') + +var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) +var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) + +describe ('config view actions', function() { + + var initialState = { + metamask: { + rpcTarget: 'foo', + }, + appState: { + currentView: { + name: 'accounts', + } + } + } + freeze(initialState) + + describe('SHOW_CONFIG_PAGE', function() { + it('should set appState.currentView.name to config', function() { + var result = reducers(initialState, actions.showConfigPage()) + assert.equal(result.appState.currentView.name, 'config') + }) + }) + + describe('SET_RPC_TARGET', function() { + + it('sets the state.metamask.rpcTarget property of the state to the action.value', function() { + const action = { + type: actions.SET_RPC_TARGET, + value: 'bar', + } + + var result = reducers(initialState, action) + assert.equal(result.metamask.rpcTarget, action.value) + }) + }) +}) + diff --git a/test/unit/actions/restore_vault_test.js b/test/unit/actions/restore_vault_test.js new file mode 100644 index 000000000..5873a0181 --- /dev/null +++ b/test/unit/actions/restore_vault_test.js @@ -0,0 +1,54 @@ +var jsdom = require('mocha-jsdom') +var assert = require('assert') +var freeze = require('deep-freeze-strict') +var path = require('path') +var sinon = require('sinon') + +var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) +var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) + +describe('#recoverFromSeed(password, seed)', function() { + + beforeEach(function() { + // sinon allows stubbing methods that are easily verified + this.sinon = sinon.sandbox.create() + }) + + afterEach(function() { + // sinon requires cleanup otherwise it will overwrite context + this.sinon.restore() + }) + + // stub out account manager + actions._setAccountManager({ + recoverFromSeed(pw, seed, cb) { cb() }, + }) + + it('sets metamask.isUnlocked to true', function() { + var initialState = { + metamask: { + isUnlocked: false, + isInitialized: false, + } + } + freeze(initialState) + + const restorePhrase = 'invite heavy among daring outdoor dice jelly coil stable note seat vicious' + const password = 'foo' + const dispatchFunc = actions.recoverFromSeed(password, restorePhrase) + + var dispatchStub = this.sinon.stub() + dispatchStub.withArgs({ TYPE: actions.unlockMetamask() }).onCall(0) + dispatchStub.withArgs({ TYPE: actions.showAccountsPage() }).onCall(1) + + var action + var resultingState = initialState + dispatchFunc((newAction) => { + action = newAction + resultingState = reducers(resultingState, action) + }) + + assert.equal(resultingState.metamask.isUnlocked, true, 'was unlocked') + assert.equal(resultingState.metamask.isInitialized, true, 'was initialized') + }); +}); diff --git a/test/unit/actions/set_selected_account_test.js b/test/unit/actions/set_selected_account_test.js new file mode 100644 index 000000000..0487bc5f0 --- /dev/null +++ b/test/unit/actions/set_selected_account_test.js @@ -0,0 +1,28 @@ +var jsdom = require('mocha-jsdom') +var assert = require('assert') +var freeze = require('deep-freeze-strict') +var path = require('path') + +var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) +var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) + +describe('SET_SELECTED_ACCOUNT', function() { + + it('sets the state.appState.activeAddress property of the state to the action.value', function() { + var initialState = { + appState: { + activeAddress: 'foo', + } + } + freeze(initialState) + + const action = { + type: actions.SET_SELECTED_ACCOUNT, + value: 'bar', + } + freeze(action) + + var resultingState = reducers(initialState, action) + assert.equal(resultingState.appState.activeAddress, action.value) + }); +}); diff --git a/test/unit/actions/tx_test.js b/test/unit/actions/tx_test.js new file mode 100644 index 000000000..b15bee393 --- /dev/null +++ b/test/unit/actions/tx_test.js @@ -0,0 +1,168 @@ +var jsdom = require('mocha-jsdom') +var assert = require('assert') +var freeze = require('deep-freeze-strict') +var path = require('path') + +var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) +var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) + +describe('tx confirmation screen', function() { + var initialState, result + + describe('when there is only one tx', function() { + var firstTxId = 1457634084250832 + + beforeEach(function() { + + initialState = { + appState: { + currentView: { + name: 'confTx', + }, + }, + metamask: { + unconfTxs: { + '1457634084250832': { + id: 1457634084250832, + status: "unconfirmed", + time: 1457634084250, + } + }, + } + } + freeze(initialState) + }) + + describe('cancelTx', function() { + + before(function(done) { + actions._setAccountManager({ + approveTransaction(txId, cb) { cb('An error!') }, + cancelTransaction(txId) { /* noop */ }, + clearSeedWordCache(cb) { cb() }, + }) + + actions.cancelTx({id: firstTxId})(function(action) { + result = reducers(initialState, action) + done() + }) + }) + + it('should transition to the accounts list', function() { + assert.equal(result.appState.currentView.name, 'accounts') + }) + + it('should have no unconfirmed txs remaining', function() { + var count = getUnconfirmedTxCount(result) + assert.equal(count, 0) + }) + }) + + describe('sendTx', function() { + var result + + describe('when there is an error', function() { + + before(function(done) { + alert = () => {/* noop */} + + actions._setAccountManager({ + approveTransaction(txId, cb) { cb('An error!') }, + }) + + actions.sendTx({id: firstTxId})(function(action) { + result = reducers(initialState, action) + done() + }) + }) + + it('should stay on the page', function() { + assert.equal(result.appState.currentView.name, 'confTx') + }) + + it('should set errorMessage on the currentView', function() { + assert(result.appState.currentView.errorMessage) + }) + }) + + describe('when there is success', function() { + before(function(done) { + actions._setAccountManager({ + approveTransaction(txId, cb) { cb() }, + }) + + actions.sendTx({id: firstTxId})(function(action) { + result = reducers(initialState, action) + done() + }) + }) + + it('should navigate away from the tx page', function() { + assert.equal(result.appState.currentView.name, 'accounts') + }) + + it('should clear the tx from the unconfirmed transactions', function() { + assert(!(firstTxId in result.metamask.unconfTxs), 'tx is cleared') + }) + }) + }) + + describe('when there are two pending txs', function() { + var firstTxId = 1457634084250832 + var result, initialState + before(function(done) { + initialState = { + appState: { + currentView: { + name: 'confTx', + }, + }, + metamask: { + unconfTxs: { + '1457634084250832': { + id: 1457634084250832, + status: "unconfirmed", + time: 1457634084250, + }, + '1457634084250833': { + id: 1457634084250833, + status: "unconfirmed", + time: 1457634084255, + }, + }, + } + } + freeze(initialState) + + + actions._setAccountManager({ + approveTransaction(txId, cb) { cb() }, + }) + + actions.sendTx({id: firstTxId})(function(action) { + result = reducers(initialState, action) + done() + }) + }) + + it('should stay on the confTx view', function() { + assert.equal(result.appState.currentView.name, 'confTx') + }) + + it('should transition to the first tx', function() { + assert.equal(result.appState.currentView.context, 0) + }) + + it('should only have one unconfirmed tx remaining', function() { + var count = getUnconfirmedTxCount(result) + assert.equal(count, 1) + }) + }) + }) +}); + +function getUnconfirmedTxCount(state) { + var txs = state.metamask.unconfTxs + var count = Object.keys(txs).length + return count +} diff --git a/test/unit/actions/view_info_test.js b/test/unit/actions/view_info_test.js new file mode 100644 index 000000000..0558c6e42 --- /dev/null +++ b/test/unit/actions/view_info_test.js @@ -0,0 +1,23 @@ +var jsdom = require('mocha-jsdom') +var assert = require('assert') +var freeze = require('deep-freeze-strict') +var path = require('path') + +var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) +var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) + +describe('SHOW_INFO_PAGE', function() { + + it('sets the state.appState.currentView.name property to info', function() { + var initialState = { + appState: { + activeAddress: 'foo', + } + } + freeze(initialState) + + const action = actions.showInfoPage() + var resultingState = reducers(initialState, action) + assert.equal(resultingState.appState.currentView.name, 'info') + }); +}); diff --git a/test/unit/actions/warning_test.js b/test/unit/actions/warning_test.js new file mode 100644 index 000000000..37be9ee85 --- /dev/null +++ b/test/unit/actions/warning_test.js @@ -0,0 +1,24 @@ +var jsdom = require('mocha-jsdom') +var assert = require('assert') +var freeze = require('deep-freeze-strict') +var path = require('path') + +var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js')) +var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js')) + +describe('action DISPLAY_WARNING', function() { + + it('sets appState.warning to provided value', function() { + var initialState = { + appState: {}, + } + freeze(initialState) + + const warningText = 'This is a sample warning message' + + const action = actions.displayWarning(warningText) + const resultingState = reducers(initialState, action) + + assert.equal(resultingState.appState.warning, warningText, 'warning text set') + }); +}); diff --git a/test/unit/migrations-test.js b/test/unit/migrations-test.js index 3429ffb1d..092c0eccd 100644 --- a/test/unit/migrations-test.js +++ b/test/unit/migrations-test.js @@ -1,5 +1,4 @@ var assert = require('assert') -var test = require('tape') var path = require('path') var wallet1 = require(path.join('..', 'lib', 'migrations', '001.json')) diff --git a/test/unit/util_test.js b/test/unit/util_test.js new file mode 100644 index 000000000..7f8103d3b --- /dev/null +++ b/test/unit/util_test.js @@ -0,0 +1,114 @@ +var assert = require('assert') +var sinon = require('sinon') +const ethUtil = require('ethereumjs-util') + +var path = require('path') +var util = require(path.join(__dirname, '..', '..', 'ui', 'app', 'util.js')) + +describe('util', function() { + var ethInWei = '1' + for (var i = 0; i < 18; i++ ) { ethInWei += '0' } + + beforeEach(function() { + this.sinon = sinon.sandbox.create() + }) + + afterEach(function() { + this.sinon.restore() + }) + + describe('numericBalance', function() { + + it('should return a BN 0 if given nothing', function() { + var result = util.numericBalance() + assert.equal(result.toString(10), 0) + }) + + it('should work with hex prefix', function() { + var result = util.numericBalance('0x012') + assert.equal(result.toString(10), '18') + }) + + it('should work with no hex prefix', function() { + var result = util.numericBalance('012') + assert.equal(result.toString(10), '18') + }) + + }) + + describe('#ethToWei', function() { + + it('should take an eth BN, returns wei BN', function() { + var input = new ethUtil.BN(1, 10) + var result = util.ethToWei(input) + assert.equal(result, ethInWei, '18 zeroes') + }) + + }) + + describe('#weiToEth', function() { + + it('should take a wei BN and return an eth BN', function() { + var result = util.weiToEth(new ethUtil.BN(ethInWei)) + assert.equal(result, '1', 'equals 1 eth') + }) + + }) + + describe('#formatBalance', function() { + + it('when given nothing', function() { + var result = util.formatBalance() + assert.equal(result, 'None', 'should return "None"') + }) + + it('should return eth as string followed by ETH', function() { + var input = new ethUtil.BN(ethInWei, 10).toJSON() + var result = util.formatBalance(input) + assert.equal(result, '1.0000 ETH') + }) + + it('should return eth as string followed by ETH', function() { + var input = new ethUtil.BN(ethInWei, 10).div(new ethUtil.BN('2', 10)).toJSON() + var result = util.formatBalance(input) + assert.equal(result, '0.5000 ETH') + }) + + it('should display four decimal points', function() { + var input = "0x128dfa6a90b28000" + var result = util.formatBalance(input) + assert.equal(result, '1.3370 ETH') + }) + + }) + + describe('#normalizeToWei', function() { + it('should convert an eth to the appropriate equivalent values', function() { + var valueTable = { + wei: '1000000000000000000', + kwei: '1000000000000000', + mwei: '1000000000000', + gwei: '1000000000', + szabo: '1000000', + finney:'1000', + ether: '1', + kether:'0.001', + mether:'0.000001', + // AUDIT: We're getting BN numbers on these ones. + // I think they're big enough to ignore for now. + // gether:'0.000000001', + // tether:'0.000000000001', + } + var oneEthBn = new ethUtil.BN(ethInWei, 10) + + for(var currency in valueTable) { + + var value = new ethUtil.BN(valueTable[currency], 10) + var output = util.normalizeToWei(value, currency) + assert.equal(output.toString(10), valueTable.wei, `value of ${output.toString(10)} ${currency} should convert to ${oneEthBn}`) + + } + }) + }) + +}) diff --git a/ui/test/setup.js b/ui/test/setup.js deleted file mode 100644 index 7985e9a00..000000000 --- a/ui/test/setup.js +++ /dev/null @@ -1,8 +0,0 @@ -if (typeof process === 'object') { - // Initialize node environment - global.expect = require('chai').expect - require('mocha-jsdom')() -} else { - window.expect = window.chai.expect - window.require = function () { /* noop */ } -} diff --git a/ui/test/unit/actions/config_test.js b/ui/test/unit/actions/config_test.js deleted file mode 100644 index d38210bfc..000000000 --- a/ui/test/unit/actions/config_test.js +++ /dev/null @@ -1,43 +0,0 @@ -var jsdom = require('mocha-jsdom') -var assert = require('assert') -var freeze = require('deep-freeze-strict') -var path = require('path') - -var actions = require(path.join(__dirname, '..', '..', '..', 'app', 'actions.js')) -var reducers = require(path.join(__dirname, '..', '..', '..', 'app', 'reducers.js')) - -describe ('config view actions', function() { - - var initialState = { - metamask: { - rpcTarget: 'foo', - }, - appState: { - currentView: { - name: 'accounts', - } - } - } - freeze(initialState) - - describe('SHOW_CONFIG_PAGE', function() { - it('should set appState.currentView.name to config', function() { - var result = reducers(initialState, actions.showConfigPage()) - assert.equal(result.appState.currentView.name, 'config') - }) - }) - - describe('SET_RPC_TARGET', function() { - - it('sets the state.metamask.rpcTarget property of the state to the action.value', function() { - const action = { - type: actions.SET_RPC_TARGET, - value: 'bar', - } - - var result = reducers(initialState, action) - assert.equal(result.metamask.rpcTarget, action.value) - }) - }) -}) - diff --git a/ui/test/unit/actions/restore_vault_test.js b/ui/test/unit/actions/restore_vault_test.js deleted file mode 100644 index da0d71ce7..000000000 --- a/ui/test/unit/actions/restore_vault_test.js +++ /dev/null @@ -1,54 +0,0 @@ -var jsdom = require('mocha-jsdom') -var assert = require('assert') -var freeze = require('deep-freeze-strict') -var path = require('path') -var sinon = require('sinon') - -var actions = require(path.join(__dirname, '..', '..', '..', 'app', 'actions.js')) -var reducers = require(path.join(__dirname, '..', '..', '..', 'app', 'reducers.js')) - -describe('#recoverFromSeed(password, seed)', function() { - - beforeEach(function() { - // sinon allows stubbing methods that are easily verified - this.sinon = sinon.sandbox.create() - }) - - afterEach(function() { - // sinon requires cleanup otherwise it will overwrite context - this.sinon.restore() - }) - - // stub out account manager - actions._setAccountManager({ - recoverFromSeed(pw, seed, cb) { cb() }, - }) - - it('sets metamask.isUnlocked to true', function() { - var initialState = { - metamask: { - isUnlocked: false, - isInitialized: false, - } - } - freeze(initialState) - - const restorePhrase = 'invite heavy among daring outdoor dice jelly coil stable note seat vicious' - const password = 'foo' - const dispatchFunc = actions.recoverFromSeed(password, restorePhrase) - - var dispatchStub = this.sinon.stub() - dispatchStub.withArgs({ TYPE: actions.unlockMetamask() }).onCall(0) - dispatchStub.withArgs({ TYPE: actions.showAccountsPage() }).onCall(1) - - var action - var resultingState = initialState - dispatchFunc((newAction) => { - action = newAction - resultingState = reducers(resultingState, action) - }) - - assert.equal(resultingState.metamask.isUnlocked, true, 'was unlocked') - assert.equal(resultingState.metamask.isInitialized, true, 'was initialized') - }); -}); diff --git a/ui/test/unit/actions/set_selected_account_test.js b/ui/test/unit/actions/set_selected_account_test.js deleted file mode 100644 index 1af6c964f..000000000 --- a/ui/test/unit/actions/set_selected_account_test.js +++ /dev/null @@ -1,28 +0,0 @@ -var jsdom = require('mocha-jsdom') -var assert = require('assert') -var freeze = require('deep-freeze-strict') -var path = require('path') - -var actions = require(path.join(__dirname, '..', '..', '..', 'app', 'actions.js')) -var reducers = require(path.join(__dirname, '..', '..', '..', 'app', 'reducers.js')) - -describe('SET_SELECTED_ACCOUNT', function() { - - it('sets the state.appState.activeAddress property of the state to the action.value', function() { - var initialState = { - appState: { - activeAddress: 'foo', - } - } - freeze(initialState) - - const action = { - type: actions.SET_SELECTED_ACCOUNT, - value: 'bar', - } - freeze(action) - - var resultingState = reducers(initialState, action) - assert.equal(resultingState.appState.activeAddress, action.value) - }); -}); diff --git a/ui/test/unit/actions/tx_test.js b/ui/test/unit/actions/tx_test.js deleted file mode 100644 index d83ae16c0..000000000 --- a/ui/test/unit/actions/tx_test.js +++ /dev/null @@ -1,168 +0,0 @@ -var jsdom = require('mocha-jsdom') -var assert = require('assert') -var freeze = require('deep-freeze-strict') -var path = require('path') - -var actions = require(path.join(__dirname, '..', '..', '..', 'app', 'actions.js')) -var reducers = require(path.join(__dirname, '..', '..', '..', 'app', 'reducers.js')) - -describe('tx confirmation screen', function() { - var initialState, result - - describe('when there is only one tx', function() { - var firstTxId = 1457634084250832 - - beforeEach(function() { - - initialState = { - appState: { - currentView: { - name: 'confTx', - }, - }, - metamask: { - unconfTxs: { - '1457634084250832': { - id: 1457634084250832, - status: "unconfirmed", - time: 1457634084250, - } - }, - } - } - freeze(initialState) - }) - - describe('cancelTx', function() { - - before(function(done) { - actions._setAccountManager({ - approveTransaction(txId, cb) { cb('An error!') }, - cancelTransaction(txId) { /* noop */ }, - clearSeedWordCache(cb) { cb() }, - }) - - actions.cancelTx({id: firstTxId})(function(action) { - result = reducers(initialState, action) - done() - }) - }) - - it('should transition to the accounts list', function() { - assert.equal(result.appState.currentView.name, 'accounts') - }) - - it('should have no unconfirmed txs remaining', function() { - var count = getUnconfirmedTxCount(result) - assert.equal(count, 0) - }) - }) - - describe('sendTx', function() { - var result - - describe('when there is an error', function() { - - before(function(done) { - alert = () => {/* noop */} - - actions._setAccountManager({ - approveTransaction(txId, cb) { cb('An error!') }, - }) - - actions.sendTx({id: firstTxId})(function(action) { - result = reducers(initialState, action) - done() - }) - }) - - it('should stay on the page', function() { - assert.equal(result.appState.currentView.name, 'confTx') - }) - - it('should set errorMessage on the currentView', function() { - assert(result.appState.currentView.errorMessage) - }) - }) - - describe('when there is success', function() { - before(function(done) { - actions._setAccountManager({ - approveTransaction(txId, cb) { cb() }, - }) - - actions.sendTx({id: firstTxId})(function(action) { - result = reducers(initialState, action) - done() - }) - }) - - it('should navigate away from the tx page', function() { - assert.equal(result.appState.currentView.name, 'accounts') - }) - - it('should clear the tx from the unconfirmed transactions', function() { - assert(!(firstTxId in result.metamask.unconfTxs), 'tx is cleared') - }) - }) - }) - - describe('when there are two pending txs', function() { - var firstTxId = 1457634084250832 - var result, initialState - before(function(done) { - initialState = { - appState: { - currentView: { - name: 'confTx', - }, - }, - metamask: { - unconfTxs: { - '1457634084250832': { - id: 1457634084250832, - status: "unconfirmed", - time: 1457634084250, - }, - '1457634084250833': { - id: 1457634084250833, - status: "unconfirmed", - time: 1457634084255, - }, - }, - } - } - freeze(initialState) - - - actions._setAccountManager({ - approveTransaction(txId, cb) { cb() }, - }) - - actions.sendTx({id: firstTxId})(function(action) { - result = reducers(initialState, action) - done() - }) - }) - - it('should stay on the confTx view', function() { - assert.equal(result.appState.currentView.name, 'confTx') - }) - - it('should transition to the first tx', function() { - assert.equal(result.appState.currentView.context, 0) - }) - - it('should only have one unconfirmed tx remaining', function() { - var count = getUnconfirmedTxCount(result) - assert.equal(count, 1) - }) - }) - }) -}); - -function getUnconfirmedTxCount(state) { - var txs = state.metamask.unconfTxs - var count = Object.keys(txs).length - return count -} diff --git a/ui/test/unit/actions/view_info_test.js b/ui/test/unit/actions/view_info_test.js deleted file mode 100644 index 888712c67..000000000 --- a/ui/test/unit/actions/view_info_test.js +++ /dev/null @@ -1,23 +0,0 @@ -var jsdom = require('mocha-jsdom') -var assert = require('assert') -var freeze = require('deep-freeze-strict') -var path = require('path') - -var actions = require(path.join(__dirname, '..', '..', '..', 'app', 'actions.js')) -var reducers = require(path.join(__dirname, '..', '..', '..', 'app', 'reducers.js')) - -describe('SHOW_INFO_PAGE', function() { - - it('sets the state.appState.currentView.name property to info', function() { - var initialState = { - appState: { - activeAddress: 'foo', - } - } - freeze(initialState) - - const action = actions.showInfoPage() - var resultingState = reducers(initialState, action) - assert.equal(resultingState.appState.currentView.name, 'info') - }); -}); diff --git a/ui/test/unit/actions/warning_test.js b/ui/test/unit/actions/warning_test.js deleted file mode 100644 index eee198656..000000000 --- a/ui/test/unit/actions/warning_test.js +++ /dev/null @@ -1,24 +0,0 @@ -var jsdom = require('mocha-jsdom') -var assert = require('assert') -var freeze = require('deep-freeze-strict') -var path = require('path') - -var actions = require(path.join(__dirname, '..', '..', '..', 'app', 'actions.js')) -var reducers = require(path.join(__dirname, '..', '..', '..', 'app', 'reducers.js')) - -describe('action DISPLAY_WARNING', function() { - - it('sets appState.warning to provided value', function() { - var initialState = { - appState: {}, - } - freeze(initialState) - - const warningText = 'This is a sample warning message' - - const action = actions.displayWarning(warningText) - const resultingState = reducers(initialState, action) - - assert.equal(resultingState.appState.warning, warningText, 'warning text set') - }); -}); diff --git a/ui/test/unit/util_test.js b/ui/test/unit/util_test.js deleted file mode 100644 index b35d60812..000000000 --- a/ui/test/unit/util_test.js +++ /dev/null @@ -1,114 +0,0 @@ -var assert = require('assert') -var sinon = require('sinon') -const ethUtil = require('ethereumjs-util') - -var path = require('path') -var util = require(path.join(__dirname, '..', '..', 'app', 'util.js')) - -describe('util', function() { - var ethInWei = '1' - for (var i = 0; i < 18; i++ ) { ethInWei += '0' } - - beforeEach(function() { - this.sinon = sinon.sandbox.create() - }) - - afterEach(function() { - this.sinon.restore() - }) - - describe('numericBalance', function() { - - it('should return a BN 0 if given nothing', function() { - var result = util.numericBalance() - assert.equal(result.toString(10), 0) - }) - - it('should work with hex prefix', function() { - var result = util.numericBalance('0x012') - assert.equal(result.toString(10), '18') - }) - - it('should work with no hex prefix', function() { - var result = util.numericBalance('012') - assert.equal(result.toString(10), '18') - }) - - }) - - describe('#ethToWei', function() { - - it('should take an eth BN, returns wei BN', function() { - var input = new ethUtil.BN(1, 10) - var result = util.ethToWei(input) - assert.equal(result, ethInWei, '18 zeroes') - }) - - }) - - describe('#weiToEth', function() { - - it('should take a wei BN and return an eth BN', function() { - var result = util.weiToEth(new ethUtil.BN(ethInWei)) - assert.equal(result, '1', 'equals 1 eth') - }) - - }) - - describe('#formatBalance', function() { - - it('when given nothing', function() { - var result = util.formatBalance() - assert.equal(result, 'None', 'should return "None"') - }) - - it('should return eth as string followed by ETH', function() { - var input = new ethUtil.BN(ethInWei, 10).toJSON() - var result = util.formatBalance(input) - assert.equal(result, '1.0000 ETH') - }) - - it('should return eth as string followed by ETH', function() { - var input = new ethUtil.BN(ethInWei, 10).div(new ethUtil.BN('2', 10)).toJSON() - var result = util.formatBalance(input) - assert.equal(result, '0.5000 ETH') - }) - - it('should display four decimal points', function() { - var input = "0x128dfa6a90b28000" - var result = util.formatBalance(input) - assert.equal(result, '1.3370 ETH') - }) - - }) - - describe('#normalizeToWei', function() { - it('should convert an eth to the appropriate equivalent values', function() { - var valueTable = { - wei: '1000000000000000000', - kwei: '1000000000000000', - mwei: '1000000000000', - gwei: '1000000000', - szabo: '1000000', - finney:'1000', - ether: '1', - kether:'0.001', - mether:'0.000001', - // AUDIT: We're getting BN numbers on these ones. - // I think they're big enough to ignore for now. - // gether:'0.000000001', - // tether:'0.000000000001', - } - var oneEthBn = new ethUtil.BN(ethInWei, 10) - - for(var currency in valueTable) { - - var value = new ethUtil.BN(valueTable[currency], 10) - var output = util.normalizeToWei(value, currency) - assert.equal(output.toString(10), valueTable.wei, `value of ${output.toString(10)} ${currency} should convert to ${oneEthBn}`) - - } - }) - }) - -}) -- cgit