diff --git a/lib/db.js b/lib/db.js index dd0d89b8..ef68db92 100644 --- a/lib/db.js +++ b/lib/db.js @@ -75,6 +75,9 @@ DB.prototype.getTransaction = function(txid, queryMempool, callback) { if(err) { return callback(err); } + if(!txBuffer) { + return callback(new errors.Transaction.NotFound()); + } callback(null, Transaction().fromBuffer(txBuffer)); }); @@ -92,7 +95,7 @@ DB.prototype.getTransactionWithBlockInfo = function(txid, queryMempool, callback callback(null, tx); }); -} +}; DB.prototype.validateBlockData = function(block, callback) { // bitcoind does the validation diff --git a/lib/errors.js b/lib/errors.js index cd6f5334..35e1002d 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -5,4 +5,7 @@ var chainlib = require('chainlib'); var errors = chainlib.errors; +errors.Transaction = createError('Transaction', errors.Error); +errors.Transaction.NotFound = createError('NotFound', errors.Transaction); + module.exports = errors; diff --git a/test/db.unit.js b/test/db.unit.js index 035d23e8..b1790bdb 100644 --- a/test/db.unit.js +++ b/test/db.unit.js @@ -2,13 +2,10 @@ var should = require('chai').should(); var sinon = require('sinon'); -var chainlib = require('chainlib'); -var levelup = chainlib.deps.levelup; var bitcoindjs = require('../'); var DB = bitcoindjs.DB; var blockData = require('./data/livenet-345003.json'); -var bitcore = require('bitcore'); -var EventEmitter = require('events').EventEmitter; +var transactionData = require('./data/bitcoin-transactions.json'); var errors = bitcoindjs.errors; var memdown = require('memdown'); var inherits = require('util').inherits; @@ -17,6 +14,45 @@ var BaseModule = require('../lib/module'); describe('Bitcoin DB', function() { var coinbaseAmount = 50 * 1e8; + describe('#getTransaction', function() { + it('will return a NotFound error', function(done) { + var db = new DB({store: memdown}); + db.bitcoind = { + getTransaction: sinon.stub().callsArgWith(2, null, null) + }; + var txid = '7426c707d0e9705bdd8158e60983e37d0f5d63529086d6672b07d9238d5aa623'; + db.getTransaction(txid, true, function(err) { + err.should.be.instanceof(errors.Transaction.NotFound); + done(); + }); + }); + it('will return an error from bitcoind', function(done) { + var db = new DB({store: memdown}); + db.bitcoind = { + getTransaction: sinon.stub().callsArgWith(2, new Error('test error')) + }; + var txid = '7426c707d0e9705bdd8158e60983e37d0f5d63529086d6672b07d9238d5aa623'; + db.getTransaction(txid, true, function(err) { + err.message.should.equal('test error'); + done(); + }); + }); + it('will return an error from bitcoind', function(done) { + var db = new DB({store: memdown}); + db.bitcoind = { + getTransaction: sinon.stub().callsArgWith(2, null, new Buffer(transactionData[0].hex, 'hex')) + }; + var txid = '7426c707d0e9705bdd8158e60983e37d0f5d63529086d6672b07d9238d5aa623'; + db.getTransaction(txid, true, function(err, tx) { + if (err) { + throw err; + } + should.exist(tx); + done(); + }); + }); + }); + describe('#getBlock', function() { var db = new DB({store: memdown}); db.bitcoind = {