add /transactions/send

This commit is contained in:
Manuel Araoz 2015-03-06 17:50:39 -03:00
parent c86b7c4277
commit cd2e1d8b8a
2 changed files with 84 additions and 2 deletions

View File

@ -36,16 +36,46 @@ Transactions.txHashParam = function(req, res, next, txHash) {
* controllers * controllers
*/ */
/*
* get transaction by its hash
*/
Transactions.get = function(req, res) { Transactions.get = function(req, res) {
$.checkState(req.tx instanceof Transaction); $.checkState(req.tx instanceof Transaction);
res.send(req.tx.toObject()); res.send(req.tx.toObject());
}; };
/**
* send a transaction to the bitcoin network
*/
Transactions.send = function(req, res) { Transactions.send = function(req, res) {
var tx = new Transaction(req.body); var raw = req.body.raw;
node.broadcast(tx); 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) { Transactions.getTxError = function(req, res) {
res.status(422); res.status(422);
res.send('/v1/transactions/ parameter must be a 64 digit hex'); res.send('/v1/transactions/ parameter must be a 64 digit hex');

View File

@ -4,7 +4,11 @@ var chai = require('chai');
var should = chai.should(); var should = chai.should();
var request = require('supertest'); var request = require('supertest');
var bitcore = require('bitcore');
var Transaction = bitcore.Transaction;
var EventEmitter = require('eventemitter2').EventEmitter2; var EventEmitter = require('eventemitter2').EventEmitter2;
var Promise = require('bluebird');
Promise.longStackTraces();
var BitcoreHTTP = require('../../lib/http'); var BitcoreHTTP = require('../../lib/http');
var mockTransactions = require('../data/transactions'); var mockTransactions = require('../data/transactions');
@ -12,12 +16,20 @@ var mockTransactions = require('../data/transactions');
describe('BitcoreHTTP v1 transactions routes', function() { describe('BitcoreHTTP v1 transactions routes', function() {
// mocks // mocks
var mockValidTx = new Transaction();
var t1 = mockTransactions[Object.keys(mockTransactions)[0]];
var nodeMock, app, agent; var nodeMock, app, agent;
beforeEach(function() { beforeEach(function() {
nodeMock = new EventEmitter(); nodeMock = new EventEmitter();
nodeMock.getTransaction = function(txHash) { nodeMock.getTransaction = function(txHash) {
return mockTransactions[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; app = new BitcoreHTTP(nodeMock).app;
agent = request(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);
});
});
}); });