From e0d36aebc717f67e90fc44a2256007031ab2f9ba Mon Sep 17 00:00:00 2001 From: Djavid Gabibiyan Date: Fri, 21 Feb 2020 22:16:24 +0500 Subject: [PATCH] feat: handle errors in `getTransaction` endpoints Co-authored-by: Konstantin Shuplenkov Co-authored-by: Ivan Shumkov --- .../core/getTransactionHandlerFactory.js | 11 ++- package-lock.json | 6 +- package.json | 2 +- .../core/getTransactionHandlerFactory.js | 74 +++++++++++++++++++ 4 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 test/functional/grpcServer/handlers/core/getTransactionHandlerFactory.js diff --git a/lib/grpcServer/handlers/core/getTransactionHandlerFactory.js b/lib/grpcServer/handlers/core/getTransactionHandlerFactory.js index fd9aa1ffe..2c23a82b3 100644 --- a/lib/grpcServer/handlers/core/getTransactionHandlerFactory.js +++ b/lib/grpcServer/handlers/core/getTransactionHandlerFactory.js @@ -31,7 +31,16 @@ function getTransactionHandlerFactory(insightAPI) { throw new InvalidArgumentGrpcError('id is not specified'); } - const serializedTransaction = await insightAPI.getRawTransactionById(id); + let serializedTransaction; + try { + serializedTransaction = await insightAPI.getRawTransactionById(id); + } catch (e) { + if (e.statusCode === 404) { + throw new InvalidArgumentGrpcError('Transaction not found'); + } + + throw e; + } const transaction = new Transaction(serializedTransaction); diff --git a/package-lock.json b/package-lock.json index 0d7a59bd9..0add13768 100644 --- a/package-lock.json +++ b/package-lock.json @@ -146,9 +146,9 @@ } }, "@dashevo/dapi-client": { - "version": "0.9.0-dev.5", - "resolved": "https://registry.npmjs.org/@dashevo/dapi-client/-/dapi-client-0.9.0-dev.5.tgz", - "integrity": "sha512-JtdUB1dX+lq/vfBMGCFVnhiKJWN+aSSBpPW5QaNlXhwVIMCIpQHg3AI0DzJ33DNgu1JcN2PKQvPe/up0wlX01Q==", + "version": "0.9.0-dev.6", + "resolved": "https://registry.npmjs.org/@dashevo/dapi-client/-/dapi-client-0.9.0-dev.6.tgz", + "integrity": "sha512-izM1zzp+HDXinQNOx3wIvHiURc80JWJewserwq6ipeLfsAaIIDh6fCN20s/wZ0mLN7THYfR23VwtaMfEkLg1Zw==", "dev": true, "requires": { "@babel/polyfill": "^7.8.3", diff --git a/package.json b/package.json index afae9037d..8b962a3d1 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ }, "devDependencies": { "@dashevo/dp-services-ctl": "~0.11.0-dev.1", - "@dashevo/dapi-client": "~0.9.0-dev.5", + "@dashevo/dapi-client": "~0.9.0-dev.6", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", "dirty-chai": "^2.0.1", diff --git a/test/functional/grpcServer/handlers/core/getTransactionHandlerFactory.js b/test/functional/grpcServer/handlers/core/getTransactionHandlerFactory.js new file mode 100644 index 000000000..885d47137 --- /dev/null +++ b/test/functional/grpcServer/handlers/core/getTransactionHandlerFactory.js @@ -0,0 +1,74 @@ +const startDapi = require('@dashevo/dp-services-ctl/lib/services/startDapi'); + +const { + Transaction, + PrivateKey, +} = require('@dashevo/dashcore-lib'); + +describe('getTransactionHandlerFactor', function main() { + this.timeout(260000); + + let removeDapi; + let dapiClient; + let transaction; + let transactionId; + + beforeEach(async () => { + const { + dapiCore, + dashCore, + remove, + } = await startDapi(); + + removeDapi = remove; + + dapiClient = dapiCore.getApi(); + + const coreAPI = dashCore.getApi(); + + await coreAPI.generate(1000); + + const { result: fromAddress } = await coreAPI.getNewAddress(); + const { result: privateKeyString } = await coreAPI.dumpPrivKey(fromAddress); + const { result: toAddress } = await coreAPI.getNewAddress(); + + const privateKey = new PrivateKey(privateKeyString); + await coreAPI.generate(500); + await coreAPI.sendToAddress(fromAddress, 10); + await coreAPI.generate(10); + + const { items: unspent } = await dapiClient.getUTXO(fromAddress); + + const amount = 10000; + + transaction = new Transaction(); + + transaction.from(unspent) + .to(toAddress, amount) + .change(fromAddress) + .fee(668) + .sign(privateKey); + + ({ result: transactionId } = await coreAPI.sendRawTransaction(transaction.serialize())); + }); + + afterEach(async () => { + await removeDapi(); + }); + + it('should respond with a transaction by it\'s ID', async () => { + const result = await dapiClient.getTransaction(transactionId); + const receivedTx = new Transaction(Buffer.from(result)); + expect(receivedTx.toString('hex')).to.deep.equal(transaction.serialize()); + }); + + it('should respond with an invalid argument error if no transaction were found', async () => { + const nonExistentId = Buffer.alloc(32).toString('hex'); + try { + await dapiClient.getTransaction(nonExistentId); + expect.fail('Error was not thrown'); + } catch (e) { + expect(e.message).to.equal('3 INVALID_ARGUMENT: Invalid argument: Transaction not found'); + } + }); +});