add /transactions/send
This commit is contained in:
parent
c86b7c4277
commit
cd2e1d8b8a
@ -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');
|
||||||
|
|||||||
@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user