From cb7f2c9343893740596ff0cb4352f3e7cce6daa2 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Thu, 12 Mar 2015 15:58:58 -0300 Subject: [PATCH] add utxos call --- api/controllers/addresses.js | 15 +++++ api/routes/v1.js | 2 +- api/test/data/addresses.js | 126 +++++++++++++++++++++-------------- api/test/v1/addresses.js | 48 +++++++++---- 4 files changed, 125 insertions(+), 66 deletions(-) diff --git a/api/controllers/addresses.js b/api/controllers/addresses.js index 6ae1045a..dbfbf047 100644 --- a/api/controllers/addresses.js +++ b/api/controllers/addresses.js @@ -37,6 +37,10 @@ Addresses.addressParam = function(req, res, next, address) { * controllers */ + +/** + * Gets an address information + */ Addresses.get = function(req, res) { $.checkState(req.address instanceof Address); node.getAddressInfo(req.address) @@ -45,4 +49,15 @@ Addresses.get = function(req, res) { }); }; +/** + * Gets an address utxos + */ +Addresses.utxos = function(req, res) { + $.checkState(req.address instanceof Address); + node.getUTXOs(req.address) + .then(function(utxos) { + res.send(utxos); + }); +}; + module.exports = Addresses; diff --git a/api/routes/v1.js b/api/routes/v1.js index a60b858b..10668b25 100644 --- a/api/routes/v1.js +++ b/api/routes/v1.js @@ -50,7 +50,7 @@ function initRouter(node) { // Address routes router.get('/addresses/:address', Addresses.get); router.get('/addresses/:address/transactions', Transactions.list); - router.get('/addresses/:address/utxos', mockResponse); + router.get('/addresses/:address/utxos', Addresses.utxos); // TODO: check if this is really restful router.get('/addresses/:addresses/utxos', mockResponse); diff --git a/api/test/data/addresses.js b/api/test/data/addresses.js index eebe1541..c707acec 100644 --- a/api/test/data/addresses.js +++ b/api/test/data/addresses.js @@ -2,65 +2,89 @@ var mockAddresses = { '1CT9huFgxMFveRvzZ7zPPJNoaMm2Fo64VH': { - address: '1CT9huFgxMFveRvzZ7zPPJNoaMm2Fo64VH', - transactions: [ - 'b944ef8c77f9b5f4a4276880f17256988bba4d0125abc54391548061a688ae09' - ], - unconfirmed: { - balance: 5000000000, - received: 5000000000, - sent: 0, + summary: { + address: '1CT9huFgxMFveRvzZ7zPPJNoaMm2Fo64VH', + transactions: [ + 'b944ef8c77f9b5f4a4276880f17256988bba4d0125abc54391548061a688ae09' + ], + unconfirmed: { + balance: 5000000000, + received: 5000000000, + sent: 0, + }, + confirmed: { + balance: 5000000000, + received: 5000000000, + sent: 0, + } }, - confirmed: { - balance: 5000000000, - received: 5000000000, - sent: 0, - } + utxos: [{ + satoshis: 5000000000, + script: 'TODO', + txid: 'b944ef8c77f9b5f4a4276880f17256988bba4d0125abc54391548061a688ae09', + index: 0 + }] }, '1HZH6zHri1qc68s34MmE5MwG9xstbkFavo': { - address: '1HZH6zHri1qc68s34MmE5MwG9xstbkFavo', - transactions: [ - '07ebb557e5782d4b9b7180c5b0b299ab1249d28f3454ccc19d4e7bd819e5ec35', - '7b309cef1b87471baee38a533c850ce25350f10e88a64e04da1ee08a69dbbba1', - '0c88e745b5c1dffccc39a96f3e25e9486bcafde82b92441f463859df15685959', - ], - unconfirmed: { - balance: 200000043000, - received: 200000043000, - sent: 0, + summary: { + address: '1HZH6zHri1qc68s34MmE5MwG9xstbkFavo', + transactions: [ + '07ebb557e5782d4b9b7180c5b0b299ab1249d28f3454ccc19d4e7bd819e5ec35', + '7b309cef1b87471baee38a533c850ce25350f10e88a64e04da1ee08a69dbbba1', + '0c88e745b5c1dffccc39a96f3e25e9486bcafde82b92441f463859df15685959', + ], + unconfirmed: { + balance: 200000043000, + received: 200000043000, + sent: 0, + }, + confirmed: { + balance: 200000043000, + received: 200000043000, + sent: 0, + } }, - confirmed: { - balance: 200000043000, - received: 200000043000, - sent: 0, - } + utxos: [{ + satoshis: 5000000000, + script: 'TODO', + txid: 'b944ef8c77f9b5f4a4276880f17256988bba4d0125abc54391548061a688ae09', + index: 0 + }] }, '1CEXio2gSCozXeSuKQJCDMEpgHfaiT48A3': { - address: '1CEXio2gSCozXeSuKQJCDMEpgHfaiT48A3', - transactions: [ - '07ebb557e5782d4b9b7180c5b0b299ab1249d28f3454ccc19d4e7bd819e5ec35', - 'b6025e6835966b31f40a9f0bb4a1717df0976ec23934934d2b2580a884c09b68', - '6ae158f49c25435c472f1533bce7d090f9edeb75b20fc30297ee78c962f4295a', - '35dd6607d21b3b0739fc0696d0633eaaa26f5ab10e2cbb0fa12353c2ccff6f83', - 'f14c1e10e8b0657068df4d53d8d93d1eb6b1f699041f7d505d5c482479c59634', - '9aa72c5b116a12f80b2d38b1f7bb43356d3a4f02637e7ac5abfeebb14862a3f8', - '9a0a957583f5ea390b2b5573ace7d67a876aeb66c59ada5c0d79a6b7affb34f6', - '585d59d3223eef73ccdc3c19b4e85cb0cc66ea818f173cf6d54723785c7210a1', - '2952d4f79d2388c3cb931e92699ded43fe3b92f2a58f03ee0c68a0a5b0d73e46', - 'f4e18bfbd9edc5ac0cfdd5b0869d77ef5cd38908afe106c02d189ac835569c87', - '4fb1495d114e6853acbe95c38f0acad1b8f790f8979148015e8fbfc3d0c394e9', - ], - unconfirmed: { - balance: 93350245, - received: 1230747491, - sent: 1137397246, + summary: { + address: '1CEXio2gSCozXeSuKQJCDMEpgHfaiT48A3', + transactions: [ + '07ebb557e5782d4b9b7180c5b0b299ab1249d28f3454ccc19d4e7bd819e5ec35', + 'b6025e6835966b31f40a9f0bb4a1717df0976ec23934934d2b2580a884c09b68', + '6ae158f49c25435c472f1533bce7d090f9edeb75b20fc30297ee78c962f4295a', + '35dd6607d21b3b0739fc0696d0633eaaa26f5ab10e2cbb0fa12353c2ccff6f83', + 'f14c1e10e8b0657068df4d53d8d93d1eb6b1f699041f7d505d5c482479c59634', + '9aa72c5b116a12f80b2d38b1f7bb43356d3a4f02637e7ac5abfeebb14862a3f8', + '9a0a957583f5ea390b2b5573ace7d67a876aeb66c59ada5c0d79a6b7affb34f6', + '585d59d3223eef73ccdc3c19b4e85cb0cc66ea818f173cf6d54723785c7210a1', + '2952d4f79d2388c3cb931e92699ded43fe3b92f2a58f03ee0c68a0a5b0d73e46', + 'f4e18bfbd9edc5ac0cfdd5b0869d77ef5cd38908afe106c02d189ac835569c87', + '4fb1495d114e6853acbe95c38f0acad1b8f790f8979148015e8fbfc3d0c394e9', + ], + unconfirmed: { + balance: 93350245, + received: 1230747491, + sent: 1137397246, + }, + confirmed: { + balance: 93350245, + received: 1230747491, + sent: 1137397246, + } }, - confirmed: { - balance: 93350245, - received: 1230747491, - sent: 1137397246, - } + utxos: [{ + satoshis: 5000000000, + script: 'TODO', + txid: 'b944ef8c77f9b5f4a4276880f17256988bba4d0125abc54391548061a688ae09', + index: 0 + }] }, }; diff --git a/api/test/v1/addresses.js b/api/test/v1/addresses.js index d6892db6..193ffaea 100644 --- a/api/test/v1/addresses.js +++ b/api/test/v1/addresses.js @@ -11,7 +11,6 @@ var bitcore = require('bitcore'); var _ = bitcore.deps._; var BitcoreHTTP = require('../../lib/http'); -var BitcoreNode = require('../../../'); var mockAddresses = require('../data/addresses'); var mockTransactions = require('../data/transactions'); @@ -20,28 +19,39 @@ describe('BitcoreHTTP v1 addresses routes', function() { // mocks var transactionList = Object.values(mockTransactions); - var nodeMock, app, agent, txs_for_addr; + var nodeMock, app, agent; + var txs_for_addr = function(addr) { + var amount = mockAddresses[addr].summary.transactions.length; + return transactionList.slice(0, amount); + }; + var utxos_for_addr = function(addr) { + return mockAddresses[addr].utxos; + }; + beforeEach(function() { nodeMock = new EventEmitter(); nodeMock.getAddressInfo = function(address) { return Promise.resolve(mockAddresses[address.toString()]); }; - txs_for_addr = function(addr) { - var amount = mockAddresses[addr].transactions.length; - return transactionList.slice(0, amount); - }; nodeMock.listTransactions = function(opts) { return Promise.resolve(txs_for_addr(opts.address)); }; + nodeMock.getUTXOs = function(address) { + return Promise.resolve(utxos_for_addr(address)); + }; app = new BitcoreHTTP(nodeMock).app; agent = request(app); }); - describe('/addresses/:addresss', function() { + var failsWithInvalidAddress = function(agent, url, cb) { + agent.get(url) + .expect(422) + .expect('/v1/addresses/ parameter must be a valid bitcoin address', cb); + }; + + describe('/addresses/:address', function() { it('fails with invalid address', function(cb) { - agent.get('/v1/addresses/1BpbpfLdY7oBS9gK7aDXgvMgr1DpvNH3B2') - .expect(422) - .expect('/v1/addresses/ parameter must be a valid bitcoin address', cb); + failsWithInvalidAddress(agent, '/v1/addresses/1BpbpfLdY7oBS9gK7aDXgvMgr1DpvNH3B2', cb); }); Object.keys(mockAddresses).forEach(function(addr) { var info = mockAddresses[addr]; @@ -52,11 +62,9 @@ describe('BitcoreHTTP v1 addresses routes', function() { }); }); }); - describe('/addresses/:addresss/transactions', function() { + describe('/addresses/:address/transactions', function() { it('fails with invalid address', function(cb) { - agent.get('/v1/addresses/1BpbpfLdY7oBS9gK7aDXgvMgr1DpvNH3B2/transactions') - .expect(422) - .expect('/v1/addresses/ parameter must be a valid bitcoin address', cb); + failsWithInvalidAddress(agent, '/v1/addresses/1BpbpfLdY7oBS9gK7aDXgvMgr1DpvNH3B2/transactions', cb); }); Object.keys(mockAddresses).forEach(function(addr) { it('works with valid address ' + addr, function(cb) { @@ -66,4 +74,16 @@ describe('BitcoreHTTP v1 addresses routes', function() { }); }); }); + describe('/addresses/:address/utxos', function() { + it('fails with invalid address', function(cb) { + failsWithInvalidAddress(agent, '/v1/addresses/1BpbpfLdY7oBS9gK7aDXgvMgr1DpvNH3B2/utxos', cb); + }); + Object.keys(mockAddresses).forEach(function(addr) { + it('works with valid address ' + addr, function(cb) { + agent.get('/v1/addresses/' + addr + '/utxos') + .expect(200) + .expect(JSON.stringify(utxos_for_addr(addr)), cb); + }); + }); + }); });