From 3dbad3c6e2b9402d30d26719b4c9bfb6252259d6 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Mon, 9 Mar 2015 20:18:53 -0300 Subject: [PATCH] add parameters to /blocks/ --- api/controllers/blocks.js | 16 +++++++++++++++- api/test/v1/blocks.js | 34 +++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/api/controllers/blocks.js b/api/controllers/blocks.js index af9f6a3f..919f8990 100644 --- a/api/controllers/blocks.js +++ b/api/controllers/blocks.js @@ -53,8 +53,22 @@ Blocks.heightParam = function(req, res, next, height) { * controllers */ +/* + * Returns a list of blocks given certain query options. + * + * from: block height as lower limit (default: 0) + * to: ditto, but for the upper limit, non inclusive (default: 1000000) + * page: for paginating results (default: 0) + * offset: skip the first offset blocks (default: 0) + * limit: max amount of blocks returned (default: 10) + * + */ Blocks.list = function(req, res) { - node.listBlocks() + var from = parseInt(req.query.from || 0); + var to = parseInt(req.query.to || 1e6); + var offset = parseInt(req.query.offset || 0); + var limit = parseInt(req.query.limit || 10); + node.listBlocks(from, to, offset, limit) .then(function(blocks) { res.send(blocks); }); diff --git a/api/test/v1/blocks.js b/api/test/v1/blocks.js index 773533ac..226ff2af 100644 --- a/api/test/v1/blocks.js +++ b/api/test/v1/blocks.js @@ -28,7 +28,13 @@ describe('BitcoreHTTP v1 blocks routes', function() { // mocks var b1 = mockBlocks[Object.keys(mockBlocks)[0]]; + var firstBlock = mockBlocks[Object.keys(mockBlocks).splice(0, 1)[0]]; + var secondBlock = mockBlocks[Object.keys(mockBlocks).splice(1, 1)[0]]; var lastBlock = mockBlocks[Object.keys(mockBlocks).splice(-1)[0]]; + var blockForHash = function(hash) { + return mockBlocks[hash]; + }; + var last3 = Object.keys(mockBlocks).splice(-3).map(blockForHash); var nodeMock, app, agent; var blockList = Object.values(mockBlocks); beforeEach(function() { @@ -37,7 +43,7 @@ describe('BitcoreHTTP v1 blocks routes', function() { var block; if (typeof blockHash === 'number') { var height = blockHash; - block = mockBlocks[Object.keys(mockBlocks)[height]]; + block = mockBlocks[Object.keys(mockBlocks)[height - 100000]]; } else { block = mockBlocks[blockHash]; } @@ -48,10 +54,13 @@ describe('BitcoreHTTP v1 blocks routes', function() { }; nodeMock.getLatestBlock = function() { - return Promise.resolve(mockBlocks[Object.keys(mockBlocks).splice(-1)[0]]); + return Promise.resolve(lastBlock); }; - nodeMock.listBlocks = function() { - return Promise.resolve(blockList); + nodeMock.listBlocks = function(from, to, offset, limit) { + var start = from - 1e5; + var end = to - 1e5; + var section = blockList.slice(start, end); + return Promise.resolve(section.slice(offset, offset + limit)); }; app = new BitcoreHTTP(nodeMock).app; agent = request(app); @@ -63,6 +72,21 @@ describe('BitcoreHTTP v1 blocks routes', function() { .expect(200) .expect(JSON.stringify(blockList), cb); }); + it('works with to/from parameters', function(cb) { + agent.get('/v1/blocks/?from=100000&to=100001') + .expect(200) + .expect(JSON.stringify([firstBlock]), cb); + }); + it('works with limit/offset parameters', function(cb) { + agent.get('/v1/blocks/?limit=1&offset=1') + .expect(200) + .expect(JSON.stringify([secondBlock]), cb); + }); + it('works with all parameters', function(cb) { + agent.get('/v1/blocks/?from=100005&to=100020&limit=3&offset=2') + .expect(200) + .expect(JSON.stringify(last3), cb); + }); }); describe('/blocks/latest', function() { it('returns latest block', function(cb) { @@ -103,7 +127,7 @@ describe('BitcoreHTTP v1 blocks routes', function() { .expect('Block with height 876543 not found', cb); }); it('works with valid height', function(cb) { - agent.get('/v1/blocks/0') + agent.get('/v1/blocks/100000') .expect(200) .expect(b1.toJSON(), cb); });