diff --git a/package-lock.json b/package-lock.json index 535acda..10a39a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,6 +50,7 @@ "eslint-plugin-prettier": "3.3.1", "eslint-plugin-standard": "4.0.0", "husky": "4.3.8", + "lodash.clonedeep": "^4.5.0", "mocha": "8.2.1", "nyc": "15.1.0", "semantic-release": "17.4.4", @@ -14158,10 +14159,9 @@ }, "node_modules/lodash.clonedeep": { "version": "4.5.0", - "resolved": "http://94.130.170.209:4873/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", @@ -36855,7 +36855,7 @@ }, "lodash.clonedeep": { "version": "4.5.0", - "resolved": "http://94.130.170.209:4873/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, diff --git a/package.json b/package.json index d5fd994..5091a58 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "eslint-plugin-prettier": "3.3.1", "eslint-plugin-standard": "4.0.0", "husky": "4.3.8", + "lodash.clonedeep": "^4.5.0", "mocha": "8.2.1", "nyc": "15.1.0", "semantic-release": "17.4.4", diff --git a/src/use-cases/bch/index.js b/src/use-cases/bch/index.js index eb7d612..f9da57d 100644 --- a/src/use-cases/bch/index.js +++ b/src/use-cases/bch/index.js @@ -50,7 +50,7 @@ class BCHUseCases { data.transactions[0].transactions, sortOrder ) - // console.log(`txsArr: ${JSON.stringify(txsArr, null, 2)}`) + console.log(`txsArr: ${JSON.stringify(txsArr, null, 2)}`) // Paginate the results const pagedResults = this.bchjs.Util.chunk100(txsArr) diff --git a/test/unit/mocks/adapters/index.js b/test/unit/mocks/adapters/index.js index e10114c..5acbfcc 100644 --- a/test/unit/mocks/adapters/index.js +++ b/test/unit/mocks/adapters/index.js @@ -56,7 +56,8 @@ const localdb = { const bchjs = { Electrumx: { transactions: () => {}, - balance: () => {} + balance: () => {}, + sortAllTxs: () => {} }, Utxo: { get: () => {} @@ -69,6 +70,9 @@ const bchjs = { }, encryption: { getPubKey: () => {} + }, + Util: { + chunk100: () => {} } } diff --git a/test/unit/mocks/use-cases/bch/bch.use-cases.mocks.js b/test/unit/mocks/use-cases/bch/bch.use-cases.mocks.js index b983db8..debae70 100644 --- a/test/unit/mocks/use-cases/bch/bch.use-cases.mocks.js +++ b/test/unit/mocks/use-cases/bch/bch.use-cases.mocks.js @@ -1,3 +1,28 @@ /* Mock data for use-cases/bch/index.js unit tests */ + +const fulcrumOut01 = { + success: true, + transactions: [ + { + transactions: [ + { + height: 560430, + tx_hash: + '3e1f3e882be9c03897eeb197224bf87f312be556a89f4308fabeeeabcf9bc851' + }, + { + height: 560534, + tx_hash: + '4ebbeaac51ce141e262964e3a0ce11b96ca72c0dffe9b4127ce80135f503a280' + } + ], + address: 'bitcoincash:qpdh9s677ya8tnx7zdhfrn8qfyvy22wj4qa7nwqa5v' + } + ] +} + +module.exports = { + fulcrumOut01 +} diff --git a/test/unit/use-cases/bch/index-bch.use-case.unit.js b/test/unit/use-cases/bch/index-bch.use-case.unit.js index d8ea64c..64cea40 100644 --- a/test/unit/use-cases/bch/index-bch.use-case.unit.js +++ b/test/unit/use-cases/bch/index-bch.use-case.unit.js @@ -5,18 +5,23 @@ // Public npm libraries const assert = require('chai').assert const sinon = require('sinon') +const clone = require('lodash.clonedeep') // Local support libraries const BCHUseCases = require('../../../../src/use-cases/bch') const adapters = require('../../mocks/adapters') +const mockDataLib = require('../../mocks/use-cases/bch/bch.use-cases.mocks.js') describe('#bch-use-case', () => { let uut let sandbox + let mockData beforeEach(() => { sandbox = sinon.createSandbox() + mockData = clone(mockDataLib) + uut = new BCHUseCases({ adapters }) }) @@ -39,18 +44,82 @@ describe('#bch-use-case', () => { describe('#getTransactions', () => { it('should get transactions for an address', async () => { + // Mock dependencies + sandbox + .stub(uut.bchjs.Electrumx, 'transactions') + .resolves(mockData.fulcrumOut01) + sandbox + .stub(uut.bchjs.Electrumx, 'sortAllTxs') + .resolves(mockData.fulcrumOut01.transactions[0].transactions) + sandbox + .stub(uut.bchjs.Util, 'chunk100') + .returns([mockData.fulcrumOut01.transactions[0].transactions]) + + const address = 'bitcoincash:qpdh9s677ya8tnx7zdhfrn8qfyvy22wj4qa7nwqa5v' const rpcData = { payload: { params: { - addresses: [ - 'bitcoincash:qpdh9s677ya8tnx7zdhfrn8qfyvy22wj4qa7nwqa5v' - ] + address } } } const result = await uut.getTransactions(rpcData) - console.log('result: ', result) + // console.log('result: ', result) + + // Assert expected values and properties. + assert.equal(result.address, address) + assert.equal(result.status, 200) + assert.equal(result.success, true) + assert.isArray(result.txs) + }) + + it('should return error if Fulcrum communication is not possible', async () => { + // Force an error + sandbox + .stub(uut.bchjs.Electrumx, 'transactions') + .resolves({ success: false }) + + const address = 'bitcoincash:qpdh9s677ya8tnx7zdhfrn8qfyvy22wj4qa7nwqa5v' + const rpcData = { + payload: { + params: { + address + } + } + } + + const result = await uut.getTransactions(rpcData) + // console.log('result: ', result) + + assert.equal(result.success, false) + assert.equal(result.status, 422) + assert.equal(result.message, 'Could not query Fulcrum indexer.') + assert.equal(result.endpoint, 'transactions') + }) + + it('should return error if there is an error', async () => { + // Force an error + sandbox + .stub(uut.bchjs.Electrumx, 'transactions') + .rejects(new Error('test error')) + + const address = 'bitcoincash:qpdh9s677ya8tnx7zdhfrn8qfyvy22wj4qa7nwqa5v' + const rpcData = { + payload: { + params: { + address + } + } + } + + const result = await uut.getTransactions(rpcData) + // console.log('result: ', result) + + assert.equal(result.success, false) + assert.equal(result.status, 422) + assert.equal(result.message, 'test error') + assert.equal(result.endpoint, 'transactions') }) }) })