diff --git a/lib/expressapp.js b/lib/expressapp.js index a306437..fd92143 100644 --- a/lib/expressapp.js +++ b/lib/expressapp.js @@ -282,7 +282,7 @@ ExpressApp.prototype.start = function(opts, cb) { router.get('/v1/addresses/', function(req, res) { getServerWithAuth(req, res, function(server) { - server.getMainAddresses({}, function(err, addresses) { + server.getMainAddresses(req.body, function(err, addresses) { if (err) return returnError(err, res, req); res.json(addresses); }); diff --git a/lib/server.js b/lib/server.js index 6807e46..e9805f4 100644 --- a/lib/server.js +++ b/lib/server.js @@ -769,17 +769,23 @@ WalletService.prototype.createAddress = function(opts, cb) { /** * Get all addresses. * @param {Object} opts + * @param {Numeric} opts.limit (optional) - Limit the resultset. Return all addresses by default. + * @param {Boolean} [opts.reverse=false] (optional) - Reverse the order of returned addresses. * @returns {Address[]} */ WalletService.prototype.getMainAddresses = function(opts, cb) { var self = this; + opts = opts || {}; self.storage.fetchAddresses(self.walletId, function(err, addresses) { if (err) return cb(err); var onlyMain = _.reject(addresses, { isChange: true }); + if (opts.reverse) onlyMain.reverse(); + if (opts.limit > 0) onlyMain = _.take(onlyMain, opts.limit); + return cb(null, onlyMain); }); }; diff --git a/test/integration/server.js b/test/integration/server.js index f7e31e0..3c29d84 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -315,14 +315,16 @@ helpers.createProposalOpts = function(type, outputs, signingKey, moreOpts) { }; helpers.createAddresses = function(server, wallet, main, change, cb) { + var clock = sinon.useFakeTimers(Date.now(), 'Date'); async.map(_.range(main + change), function(i, next) { + clock.tick(1000); var address = wallet.createAddress(i >= main); server.storage.storeAddressAndWallet(wallet, address, function(err) { - if (err) return next(err); - next(null, address); + next(err, address); }); }, function(err, addresses) { if (err) throw new Error('Could not generate addresses'); + clock.restore(); return cb(_.take(addresses, main), _.takeRight(addresses, change)); }); }; @@ -1777,6 +1779,54 @@ describe('Wallet service', function() { }); }); + describe('#getMainAddresses', function() { + var server, wallet; + + beforeEach(function(done) { + helpers.createAndJoinWallet(2, 2, {}, function(s, w) { + server = s; + wallet = w; + helpers.createAddresses(server, wallet, 5, 0, function() { + done(); + }); + }); + }); + + it('should get all addresses', function(done) { + server.getMainAddresses({}, function(err, addresses) { + should.not.exist(err); + addresses.length.should.equal(5); + addresses[0].path.should.equal('m/0/0'); + addresses[4].path.should.equal('m/0/4'); + done(); + }); + }); + it('should get first N addresses', function(done) { + server.getMainAddresses({ + limit: 3 + }, function(err, addresses) { + should.not.exist(err); + addresses.length.should.equal(3); + addresses[0].path.should.equal('m/0/0'); + addresses[2].path.should.equal('m/0/2'); + done(); + }); + }); + it('should get last N addresses in reverse order', function(done) { + server.getMainAddresses({ + limit: 3, + reverse: true, + }, function(err, addresses) { + should.not.exist(err); + addresses.length.should.equal(3); + addresses[0].path.should.equal('m/0/4'); + addresses[2].path.should.equal('m/0/2'); + done(); + }); + }); + }); + + describe('Preferences', function() { var server, wallet; beforeEach(function(done) {