From cd2e1d8b8a5063ebc48286a1586c2433f6ea33be Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Fri, 6 Mar 2015 17:50:39 -0300 Subject: [PATCH] add /transactions/send --- api/controllers/transactions.js | 34 +++++++++++++++++++-- api/test/v1/transactions.js | 52 +++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/api/controllers/transactions.js b/api/controllers/transactions.js index 089b05da..70bb0f98 100644 --- a/api/controllers/transactions.js +++ b/api/controllers/transactions.js @@ -36,16 +36,46 @@ Transactions.txHashParam = function(req, res, next, txHash) { * controllers */ +/* + * get transaction by its hash + */ Transactions.get = function(req, res) { $.checkState(req.tx instanceof Transaction); res.send(req.tx.toObject()); }; + +/** + * send a transaction to the bitcoin network + */ Transactions.send = function(req, res) { - var tx = new Transaction(req.body); - node.broadcast(tx); + var raw = req.body.raw; + if (_.isUndefined(raw)) { + Transaction._sendError(res); + return; + } + var tx; + try { + tx = new Transaction(raw); + } catch (e) { + Transaction._sendError(res); + return; + } + node.broadcast(tx) + .then(function() { + res.send('Transaction broadcasted successfully'); + }) + .catch(function(err) { + res.status(422).send(err); + }); }; +Transaction._sendError = function(res) { + res.status(422); + res.send('/v1/transactions/send parameter must be a raw transaction hex'); +}; + + Transactions.getTxError = function(req, res) { res.status(422); res.send('/v1/transactions/ parameter must be a 64 digit hex'); diff --git a/api/test/v1/transactions.js b/api/test/v1/transactions.js index e8cd32fc..1883586f 100644 --- a/api/test/v1/transactions.js +++ b/api/test/v1/transactions.js @@ -4,7 +4,11 @@ var chai = require('chai'); var should = chai.should(); var request = require('supertest'); +var bitcore = require('bitcore'); +var Transaction = bitcore.Transaction; var EventEmitter = require('eventemitter2').EventEmitter2; +var Promise = require('bluebird'); +Promise.longStackTraces(); var BitcoreHTTP = require('../../lib/http'); var mockTransactions = require('../data/transactions'); @@ -12,12 +16,20 @@ var mockTransactions = require('../data/transactions'); describe('BitcoreHTTP v1 transactions routes', function() { // mocks + var mockValidTx = new Transaction(); + var t1 = mockTransactions[Object.keys(mockTransactions)[0]]; var nodeMock, app, agent; beforeEach(function() { nodeMock = new EventEmitter(); nodeMock.getTransaction = function(txHash) { return mockTransactions[txHash]; }; + nodeMock.broadcast = function(tx) { + if (mockTransactions[tx.id]) { + return Promise.reject('some error'); + } + return Promise.resolve(); + }; app = new BitcoreHTTP(nodeMock).app; agent = request(app); }); @@ -50,5 +62,45 @@ describe('BitcoreHTTP v1 transactions routes', function() { }); }); }); + describe('/transactions/send', function() { + it('fails with invalid data type', function(cb) { + agent.post('/v1/transactions/send') + .send('some random data') + .expect(422) + .expect('/v1/transactions/send parameter must be a raw transaction hex', cb); + }); + it('fails with invalid data format', function(cb) { + agent.post('/v1/transactions/send') + .send({ + 1: 2 + }) + .expect(422) + .expect('/v1/transactions/send parameter must be a raw transaction hex', cb); + }); + it('fails with valid data format, invalid raw tx', function(cb) { + agent.post('/v1/transactions/send') + .send({ + raw: '00abad1d3a' + }) + .expect(422) + .expect('/v1/transactions/send parameter must be a raw transaction hex', cb); + }); + it('works with valid tx', function(cb) { + agent.post('/v1/transactions/send') + .send({ + raw: mockValidTx.uncheckedSerialize() + }) + .expect(200) + .expect('Transaction broadcasted successfully', cb); + }); + it('fails with invalid tx', function(cb) { + agent.post('/v1/transactions/send') + .send({ + raw: t1.uncheckedSerialize() + }) + .expect(422) + .expect('some error', cb); + }); + }); });