From 5aba096bd1afe23cf3df491ef67e24858e6efc01 Mon Sep 17 00:00:00 2001 From: Frances Pangilinan Date: Wed, 14 Dec 2016 12:56:53 -0800 Subject: add Test for txManager. As well as fix tests to account for txManager. --- test/integration/lib/keyring-controller-test.js | 4 + test/lib/mock-config-manager.js | 1 + test/unit/config-manager-test.js | 83 +----------- test/unit/idStore-migration-test.js | 4 + test/unit/keyring-controller-test.js | 4 + test/unit/tx-manager-test.js | 169 ++++++++++++++++++++++++ 6 files changed, 185 insertions(+), 80 deletions(-) create mode 100644 test/unit/tx-manager-test.js (limited to 'test') diff --git a/test/integration/lib/keyring-controller-test.js b/test/integration/lib/keyring-controller-test.js index ae5ecc578..2d16e2f95 100644 --- a/test/integration/lib/keyring-controller-test.js +++ b/test/integration/lib/keyring-controller-test.js @@ -20,6 +20,10 @@ QUnit.module('Old Style Vaults', { this.keyringController = new KeyringController({ configManager: this.configManager, getNetwork: () => { return '2' }, + txManager: { + getTxList: () => [], + getUnapprovedTxList: () => [] + }, }) this.ethStore = { diff --git a/test/lib/mock-config-manager.js b/test/lib/mock-config-manager.js index ccd518c68..b79f63090 100644 --- a/test/lib/mock-config-manager.js +++ b/test/lib/mock-config-manager.js @@ -9,6 +9,7 @@ module.exports = function() { function loadData () { var oldData = getOldStyleData() var newData + try { newData = JSON.parse(window.localStorage[STORAGE_KEY]) } catch (e) {} diff --git a/test/unit/config-manager-test.js b/test/unit/config-manager-test.js index 206460ffb..61226d624 100644 --- a/test/unit/config-manager-test.js +++ b/test/unit/config-manager-test.js @@ -215,7 +215,7 @@ describe('config-manager', function() { describe('transactions', function() { beforeEach(function() { - configManager._saveTxList([]) + configManager.setTxList([]) }) describe('#getTxList', function() { @@ -226,90 +226,13 @@ describe('config-manager', function() { }) }) - describe('#_saveTxList', function() { + describe('#setTxList', function() { it('saves the submitted data to the tx list', function() { var target = [{ foo: 'bar' }] - configManager._saveTxList(target) + configManager.setTxList(target) var result = configManager.getTxList() assert.equal(result[0].foo, 'bar') }) }) - - describe('#addTx', function() { - it('adds a tx returned in getTxList', function() { - var tx = { id: 1 } - configManager.addTx(tx) - var result = configManager.getTxList() - assert.ok(Array.isArray(result)) - assert.equal(result.length, 1) - assert.equal(result[0].id, 1) - }) - - it('cuts off early txs beyond a limit', function() { - const limit = configManager.txLimit - for (let i = 0; i < limit + 1; i++) { - let tx = { id: i } - configManager.addTx(tx) - } - var result = configManager.getTxList() - assert.equal(result.length, limit, `limit of ${limit} txs enforced`) - assert.equal(result[0].id, 1, 'early txs truncted') - }) - }) - - describe('#confirmTx', function() { - it('sets the tx status to confirmed', function() { - var tx = { id: 1, status: 'unconfirmed' } - configManager.addTx(tx) - configManager.confirmTx(1) - var result = configManager.getTxList() - assert.ok(Array.isArray(result)) - assert.equal(result.length, 1) - assert.equal(result[0].status, 'confirmed') - }) - }) - - describe('#rejectTx', function() { - it('sets the tx status to rejected', function() { - var tx = { id: 1, status: 'unconfirmed' } - configManager.addTx(tx) - configManager.rejectTx(1) - var result = configManager.getTxList() - assert.ok(Array.isArray(result)) - assert.equal(result.length, 1) - assert.equal(result[0].status, 'rejected') - }) - }) - - describe('#updateTx', function() { - it('replaces the tx with the same id', function() { - configManager.addTx({ id: '1', status: 'unconfirmed' }) - configManager.addTx({ id: '2', status: 'confirmed' }) - configManager.updateTx({ id: '1', status: 'blah', hash: 'foo' }) - var result = configManager.getTx('1') - assert.equal(result.hash, 'foo') - }) - }) - - describe('#unconfirmedTxs', function() { - it('returns unconfirmed txs in a hash', function() { - configManager.addTx({ id: '1', status: 'unconfirmed' }) - configManager.addTx({ id: '2', status: 'confirmed' }) - let result = configManager.unconfirmedTxs() - assert.equal(typeof result, 'object') - assert.equal(result['1'].status, 'unconfirmed') - assert.equal(result['0'], undefined) - assert.equal(result['2'], undefined) - }) - }) - - describe('#getTx', function() { - it('returns a tx with the requested id', function() { - configManager.addTx({ id: '1', status: 'unconfirmed' }) - configManager.addTx({ id: '2', status: 'confirmed' }) - assert.equal(configManager.getTx('1').status, 'unconfirmed') - assert.equal(configManager.getTx('2').status, 'confirmed') - }) - }) }) }) diff --git a/test/unit/idStore-migration-test.js b/test/unit/idStore-migration-test.js index ac8e23d22..639eb0d72 100644 --- a/test/unit/idStore-migration-test.js +++ b/test/unit/idStore-migration-test.js @@ -64,6 +64,10 @@ describe('IdentityStore to KeyringController migration', function() { addAccount(acct) { newAccounts.push(ethUtil.addHexPrefix(acct)) }, del(acct) { delete newAccounts[acct] }, }, + txManager: { + getTxList: () => [], + getUnapprovedTxList: () => [] + }, }) // Stub out the browser crypto for a mock encryptor. diff --git a/test/unit/keyring-controller-test.js b/test/unit/keyring-controller-test.js index 69a57ef52..a2b65a6b5 100644 --- a/test/unit/keyring-controller-test.js +++ b/test/unit/keyring-controller-test.js @@ -23,6 +23,10 @@ describe('KeyringController', function() { keyringController = new KeyringController({ configManager: configManagerGen(), + txManager: { + getTxList: () => [], + getUnapprovedTxList: () => [] + }, ethStore: { addAccount(acct) { accounts.push(ethUtil.addHexPrefix(acct)) }, }, diff --git a/test/unit/tx-manager-test.js b/test/unit/tx-manager-test.js new file mode 100644 index 000000000..0a7c5e83b --- /dev/null +++ b/test/unit/tx-manager-test.js @@ -0,0 +1,169 @@ +const assert = require('assert') +const extend = require('xtend') +const STORAGE_KEY = 'metamask-persistance-key' +const TransactionManager = require('../../app/scripts/transaction-manager') + +describe('Transaction Manager', function() { + let txManager + + const onTxDoneCb = () => true + beforeEach(function() { + txManager = new TransactionManager ({ + TxListFromStore: [], + setTxList: () => {}, + provider: "testnet", + txLimit: 40, + }) + }) + + describe('#getTxList', function() { + it('when new should return empty array', function() { + var result = txManager.getTxList() + assert.ok(Array.isArray(result)) + assert.equal(result.length, 0) + }) + it('should also return transactions from local storage if any', function() { + + }) + }) + + describe('#_saveTxList', function() { + it('saves the submitted data to the tx list', function() { + var target = [{ foo: 'bar' }] + txManager._saveTxList(target) + var result = txManager.getTxList() + assert.equal(result[0].foo, 'bar') + }) + }) + + describe('#addTx', function() { + it('adds a tx returned in getTxList', function() { + var tx = { id: 1 } + txManager.addTx(tx, onTxDoneCb) + var result = txManager.getTxList() + assert.ok(Array.isArray(result)) + assert.equal(result.length, 1) + assert.equal(result[0].id, 1) + }) + + it('cuts off early txs beyond a limit', function() { + const limit = txManager.txLimit + for (let i = 0; i < limit + 1; i++) { + let tx = { id: i, time: new Date()} + txManager.addTx(tx, onTxDoneCb) + } + var result = txManager.getTxList() + assert.equal(result.length, limit, `limit of ${limit} txs enforced`) + assert.equal(result[0].id, 1, 'early txs truncted') + }) + }) + + describe('#setTxStatusSigned', function() { + it('sets the tx status to signed', function() { + var tx = { id: 1, status: 'unapproved' } + txManager.addTx(tx, onTxDoneCb) + txManager.setTxStatusSigned(1) + var result = txManager.getTxList() + assert.ok(Array.isArray(result)) + assert.equal(result.length, 1) + assert.equal(result[0].status, 'signed') + }) + + it('should emit a signed event to signal the exciton of callback', (done) => { + this.timeout(10000) + var tx = { id: 1, status: 'unapproved' } + txManager.on('signed', function (txId) { + var approvalCb = this._unconfTxCbs[txId] + assert(approvalCb(), 'txCb was retrieved') + assert.equal(txId, 1) + assert(true, 'event listener has been triggered') + done() + }) + txManager.addTx(tx, onTxDoneCb) + txManager.setTxStatusSigned(1) + }) + }) + + describe('#setTxStatusRejected', function() { + it('sets the tx status to rejected', function() { + var tx = { id: 1, status: 'unapproved' } + txManager.addTx(tx) + txManager.setTxStatusRejected(1) + var result = txManager.getTxList() + assert.ok(Array.isArray(result)) + assert.equal(result.length, 1) + assert.equal(result[0].status, 'rejected') + }) + + it('should emit a rejected event to signal the exciton of callback', (done) => { + this.timeout(10000) + var tx = { id: 1, status: 'unapproved' } + txManager.on('rejected', function (txId) { + var approvalCb = this._unconfTxCbs[txId] + assert(approvalCb(), 'txCb was retrieved') + assert.equal(txId, 1) + assert(true, 'event listener has been triggered') + done() + }) + txManager.addTx(tx, onTxDoneCb) + txManager.setTxStatusRejected(1) + }) + + }) + + describe('#updateTx', function() { + it('replaces the tx with the same id', function() { + txManager.addTx({ id: '1', status: 'unapproved' }, onTxDoneCb) + txManager.addTx({ id: '2', status: 'confirmed' }, onTxDoneCb) + txManager.updateTx({ id: '1', status: 'blah', hash: 'foo' }) + var result = txManager.getTx('1') + assert.equal(result.hash, 'foo') + }) + }) + + describe('#getUnapprovedTxList', function() { + it('returns unapproved txs in a hash', function() { + txManager.addTx({ id: '1', status: 'unapproved' }, onTxDoneCb) + txManager.addTx({ id: '2', status: 'confirmed' }, onTxDoneCb) + let result = txManager.getUnapprovedTxList() + assert.equal(typeof result, 'object') + assert.equal(result['1'].status, 'unapproved') + assert.equal(result['0'], undefined) + assert.equal(result['2'], undefined) + }) + }) + + describe('#getTx', function() { + it('returns a tx with the requested id', function() { + txManager.addTx({ id: '1', status: 'unapproved' }, onTxDoneCb) + txManager.addTx({ id: '2', status: 'confirmed' }, onTxDoneCb) + assert.equal(txManager.getTx('1').status, 'unapproved') + assert.equal(txManager.getTx('2').status, 'confirmed') + }) + }) + + describe('#getFilterdTxList', function() { + it('returns a tx with the requested data', function() { + var foop = 0 + var zoop = 0 + for (let i = 0; i < 10; ++i ){ + let evryOther = i % 2 + txManager.addTx({ id: i, + status: evryOther ? 'unapproved' : 'confirmed', + txParams: { + from: evryOther ? 'foop' : 'zoop', + to: evryOther ? 'zoop' : 'foop', + } + }, onTxDoneCb) + evryOther ? ++foop : ++zoop + } + assert.equal(txManager.getFilterdTxList({status: 'confirmed', from: 'zoop'}).length, zoop) + assert.equal(txManager.getFilterdTxList({status: 'confirmed', to: 'foop'}).length, zoop) + assert.equal(txManager.getFilterdTxList({status: 'confirmed', from: 'foop'}).length, 0) + assert.equal(txManager.getFilterdTxList({status: 'confirmed'}).length, zoop) + assert.equal(txManager.getFilterdTxList({from: 'foop'}).length, foop) + assert.equal(txManager.getFilterdTxList({from: 'zoop'}).length, zoop) + }) + }) + +}) -- cgit v1.2.3 From 6e78494846c9032fbf1264a0225c0df4df0867cb Mon Sep 17 00:00:00 2001 From: Frances Pangilinan Date: Fri, 16 Dec 2016 10:33:36 -0800 Subject: First pass at revision requests --- test/unit/idStore-test.js | 50 ------------------------ test/unit/metamask-controller-test.js | 2 +- test/unit/tx-manager-test.js | 73 ++++++++++++++++++++++------------- 3 files changed, 48 insertions(+), 77 deletions(-) (limited to 'test') diff --git a/test/unit/idStore-test.js b/test/unit/idStore-test.js index 3ca89cd38..000c58a82 100644 --- a/test/unit/idStore-test.js +++ b/test/unit/idStore-test.js @@ -139,54 +139,4 @@ describe('IdentityStore', function() { }) }) }) - - describe('#addGasBuffer', function() { - it('formats the result correctly', function() { - const idStore = new IdentityStore({ - configManager: configManagerGen(), - ethStore: { - addAccount(acct) { accounts.push(ethUtil.addHexPrefix(acct)) }, - }, - }) - - const gas = '0x01' - const bnGas = new BN(gas, 16) - const bnResult = idStore.addGasBuffer(bnGas) - - assert.ok(bnResult.gt(gas), 'added more gas as buffer.') - }) - - it('buffers 20%', function() { - const idStore = new IdentityStore({ - configManager: configManagerGen(), - ethStore: { - addAccount(acct) { accounts.push(ethUtil.addHexPrefix(acct)) }, - }, - }) - - const gas = '0x04ee59' // Actual estimated gas example - const bnGas = new BN(ethUtil.stripHexPrefix(gas), 16) - const five = new BN('5', 10) - const correctBuffer = bnGas.div(five) - const correct = bnGas.add(correctBuffer) - - const bnResult = idStore.addGasBuffer(bnGas) - - assert(bnResult.gt(bnGas), 'Estimate increased in value.') - assert.equal(bnResult.sub(bnGas).toString(10), correctBuffer.toString(10), 'added 20% gas') - }) - }) - - describe('#checkForDelegateCall', function() { - const idStore = new IdentityStore({ - configManager: configManagerGen(), - ethStore: { - addAccount(acct) { accounts.push(ethUtil.addHexPrefix(acct)) }, - }, - }) - - var result = idStore.checkForDelegateCall(delegateCallCode) - assert.equal(result, true, 'no delegate call in provided code') - }) - }) diff --git a/test/unit/metamask-controller-test.js b/test/unit/metamask-controller-test.js index b87169ca2..414610404 100644 --- a/test/unit/metamask-controller-test.js +++ b/test/unit/metamask-controller-test.js @@ -9,7 +9,7 @@ describe('MetaMaskController', function() { let controller = new MetaMaskController({ showUnconfirmedMessage: noop, unlockAccountMessage: noop, - showUnconfirmedTx: noop, + showUnapprovedTx: noop, setData, loadData, }) diff --git a/test/unit/tx-manager-test.js b/test/unit/tx-manager-test.js index 0a7c5e83b..f09068a72 100644 --- a/test/unit/tx-manager-test.js +++ b/test/unit/tx-manager-test.js @@ -1,5 +1,6 @@ const assert = require('assert') const extend = require('xtend') +const EventEmitter = require('events') const STORAGE_KEY = 'metamask-persistance-key' const TransactionManager = require('../../app/scripts/transaction-manager') @@ -9,10 +10,11 @@ describe('Transaction Manager', function() { const onTxDoneCb = () => true beforeEach(function() { txManager = new TransactionManager ({ - TxListFromStore: [], + txList: [], setTxList: () => {}, provider: "testnet", - txLimit: 40, + txHistoryLimit: 10, + blockTracker: new EventEmitter(), }) }) @@ -38,7 +40,7 @@ describe('Transaction Manager', function() { describe('#addTx', function() { it('adds a tx returned in getTxList', function() { - var tx = { id: 1 } + var tx = { id: 1, status: 'confirmed',} txManager.addTx(tx, onTxDoneCb) var result = txManager.getTxList() assert.ok(Array.isArray(result)) @@ -47,15 +49,41 @@ describe('Transaction Manager', function() { }) it('cuts off early txs beyond a limit', function() { - const limit = txManager.txLimit + const limit = txManager.txHistoryLimit for (let i = 0; i < limit + 1; i++) { - let tx = { id: i, time: new Date()} + let tx = { id: i, time: new Date(), status: 'confirmed'} txManager.addTx(tx, onTxDoneCb) } var result = txManager.getTxList() assert.equal(result.length, limit, `limit of ${limit} txs enforced`) assert.equal(result[0].id, 1, 'early txs truncted') }) + + it('cuts off early txs beyond a limit weather or not it is confirmed or rejected', function() { + const limit = txManager.txHistoryLimit + for (let i = 0; i < limit + 1; i++) { + let tx = { id: i, time: new Date(), status: 'rejected'} + txManager.addTx(tx, onTxDoneCb) + } + var result = txManager.getTxList() + assert.equal(result.length, limit, `limit of ${limit} txs enforced`) + assert.equal(result[0].id, 1, 'early txs truncted') + }) + + it('cuts off early txs beyond a limit but does not cut unapproved txs', function() { + var unconfirmedTx = { id: 0, time: new Date(), status: 'unapproved'} + txManager.addTx(unconfirmedTx, onTxDoneCb) + const limit = txManager.txHistoryLimit + for (let i = 1; i < limit + 1; i++) { + let tx = { id: i, time: new Date(), status: 'confirmed'} + txManager.addTx(tx, onTxDoneCb) + } + var result = txManager.getTxList() + assert.equal(result.length, limit, `limit of ${limit} txs enforced`) + assert.equal(result[0].id, 0, 'first tx should still be their') + assert.equal(result[0].status, 'unapproved', 'first tx should be unapproved') + assert.equal(result[1].id, 2, 'early txs truncted') + }) }) describe('#setTxStatusSigned', function() { @@ -72,13 +100,10 @@ describe('Transaction Manager', function() { it('should emit a signed event to signal the exciton of callback', (done) => { this.timeout(10000) var tx = { id: 1, status: 'unapproved' } - txManager.on('signed', function (txId) { - var approvalCb = this._unconfTxCbs[txId] - assert(approvalCb(), 'txCb was retrieved') - assert.equal(txId, 1) - assert(true, 'event listener has been triggered') + let onTxDoneCb = function (err, txId) { + assert(true, 'event listener has been triggered and onTxDoneCb executed') done() - }) + } txManager.addTx(tx, onTxDoneCb) txManager.setTxStatusSigned(1) }) @@ -87,7 +112,7 @@ describe('Transaction Manager', function() { describe('#setTxStatusRejected', function() { it('sets the tx status to rejected', function() { var tx = { id: 1, status: 'unapproved' } - txManager.addTx(tx) + txManager.addTx(tx, onTxDoneCb) txManager.setTxStatusRejected(1) var result = txManager.getTxList() assert.ok(Array.isArray(result)) @@ -98,13 +123,10 @@ describe('Transaction Manager', function() { it('should emit a rejected event to signal the exciton of callback', (done) => { this.timeout(10000) var tx = { id: 1, status: 'unapproved' } - txManager.on('rejected', function (txId) { - var approvalCb = this._unconfTxCbs[txId] - assert(approvalCb(), 'txCb was retrieved') - assert.equal(txId, 1) - assert(true, 'event listener has been triggered') + let onTxDoneCb = function (err, txId) { + assert(true, 'event listener has been triggered and onTxDoneCb executed') done() - }) + } txManager.addTx(tx, onTxDoneCb) txManager.setTxStatusRejected(1) }) @@ -128,7 +150,6 @@ describe('Transaction Manager', function() { let result = txManager.getUnapprovedTxList() assert.equal(typeof result, 'object') assert.equal(result['1'].status, 'unapproved') - assert.equal(result['0'], undefined) assert.equal(result['2'], undefined) }) }) @@ -142,7 +163,7 @@ describe('Transaction Manager', function() { }) }) - describe('#getFilterdTxList', function() { + describe('#getFilteredTxList', function() { it('returns a tx with the requested data', function() { var foop = 0 var zoop = 0 @@ -157,12 +178,12 @@ describe('Transaction Manager', function() { }, onTxDoneCb) evryOther ? ++foop : ++zoop } - assert.equal(txManager.getFilterdTxList({status: 'confirmed', from: 'zoop'}).length, zoop) - assert.equal(txManager.getFilterdTxList({status: 'confirmed', to: 'foop'}).length, zoop) - assert.equal(txManager.getFilterdTxList({status: 'confirmed', from: 'foop'}).length, 0) - assert.equal(txManager.getFilterdTxList({status: 'confirmed'}).length, zoop) - assert.equal(txManager.getFilterdTxList({from: 'foop'}).length, foop) - assert.equal(txManager.getFilterdTxList({from: 'zoop'}).length, zoop) + assert.equal(txManager.getFilteredTxList({status: 'confirmed', from: 'zoop'}).length, zoop) + assert.equal(txManager.getFilteredTxList({status: 'confirmed', to: 'foop'}).length, zoop) + assert.equal(txManager.getFilteredTxList({status: 'confirmed', from: 'foop'}).length, 0) + assert.equal(txManager.getFilteredTxList({status: 'confirmed'}).length, zoop) + assert.equal(txManager.getFilteredTxList({from: 'foop'}).length, foop) + assert.equal(txManager.getFilteredTxList({from: 'zoop'}).length, zoop) }) }) -- cgit v1.2.3 From fde69ea0baf32b5d2a6932b73f4772e983aef552 Mon Sep 17 00:00:00 2001 From: Frankie Date: Fri, 23 Dec 2016 12:34:12 -0800 Subject: fix some minor spelling mistakes and clean up code --- test/unit/tx-manager-test.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'test') diff --git a/test/unit/tx-manager-test.js b/test/unit/tx-manager-test.js index f09068a72..be16facad 100644 --- a/test/unit/tx-manager-test.js +++ b/test/unit/tx-manager-test.js @@ -80,7 +80,7 @@ describe('Transaction Manager', function() { } var result = txManager.getTxList() assert.equal(result.length, limit, `limit of ${limit} txs enforced`) - assert.equal(result[0].id, 0, 'first tx should still be their') + assert.equal(result[0].id, 0, 'first tx should still be there') assert.equal(result[0].status, 'unapproved', 'first tx should be unapproved') assert.equal(result[1].id, 2, 'early txs truncted') }) @@ -168,15 +168,15 @@ describe('Transaction Manager', function() { var foop = 0 var zoop = 0 for (let i = 0; i < 10; ++i ){ - let evryOther = i % 2 + let everyOther = i % 2 txManager.addTx({ id: i, - status: evryOther ? 'unapproved' : 'confirmed', + status: everyOther ? 'unapproved' : 'confirmed', txParams: { - from: evryOther ? 'foop' : 'zoop', - to: evryOther ? 'zoop' : 'foop', + from: everyOther ? 'foop' : 'zoop', + to: everyOther ? 'zoop' : 'foop', } }, onTxDoneCb) - evryOther ? ++foop : ++zoop + everyOther ? ++foop : ++zoop } assert.equal(txManager.getFilteredTxList({status: 'confirmed', from: 'zoop'}).length, zoop) assert.equal(txManager.getFilteredTxList({status: 'confirmed', to: 'foop'}).length, zoop) -- cgit v1.2.3