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
*/
/*
* 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');

View File

@ -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);
});
});
});