Browse Source

fix tests

activeAddress
Ivan Socolsky 9 years ago
parent
commit
0ab57133fd
  1. 43
      lib/server.js
  2. 43
      lib/storage.js
  3. 6
      test/integration/helpers.js
  4. 61
      test/integration/server.js

43
lib/server.js

@ -1007,10 +1007,11 @@ WalletService.prototype.getBalance = function(opts, cb) {
// Update cache
var addressIndex = _.indexBy(addresses, 'address');
var freshAddresses = _.map(_.pluck(balance.byAddress, 'address'), function(addrStr) {
var active = _.map(_.pluck(balance.byAddress, 'address'), function(addrStr) {
return addressIndex[addrStr];
});
self.storage.storeCacheData(self.walletId, 'freshAddresses', freshAddresses, function(err) {
self.storage.storeActiveAddresses(self.walletId, active, function(err) {
if (err) {
log.warn('Could not update wallet cache', err);
}
@ -1021,6 +1022,36 @@ WalletService.prototype.getBalance = function(opts, cb) {
};
WalletService.prototype._getActiveAddresses = function(cb) {
var self = this;
self.storage.fetchActiveAddresses(self.walletId, function(err, active) {
if (err) {
log.warn('Could not fetch active addresses from cache', err);
return cb(null, []);
}
active = _.pluck(active, 'address');
self.storage.fetchAddresses(self.walletId, function(err, allAddresses) {
if (err) return cb(err);
var now = Math.floor(Date.now() / 1000);
var recent = _.pluck(_.filter(allAddresses, function(address) {
return address.createdOn > (now - 24 * 3600);
}), 'address');
var result = _.union(active, recent);
// HACK: translate result into Address objects, TODO!! should work with strings
var index = _.indexBy(allAddresses, 'address');
result = _.map(result, function(r) {
return index[r];
});
return cb(null, result);
});
});
};
/**
* Get wallet balance.
* @param {Object} opts
@ -1029,17 +1060,19 @@ WalletService.prototype.getBalance = function(opts, cb) {
WalletService.prototype.getBalance2Steps = function(opts, cb) {
var self = this;
self.storage.fetchCacheData(self.walletId, 'freshAddresses', function(err, freshAddresses) {
if (err || _.isEmpty(freshAddresses)) {
self._getActiveAddresses(function(err, activeAddresses) {
if (err) return cb(err);
if (_.isEmpty(activeAddresses)) {
return self.getBalance(opts, cb);
} else {
self._getBalanceFromAddresses(freshAddresses, function(err, partialBalance) {
self._getBalanceFromAddresses(activeAddresses, function(err, partialBalance) {
if (err) return cb(err);
cb(null, partialBalance);
setTimeout(function() {
self.getBalance(opts, function(err, fullBalance) {
if (err) return;
if (!_.isEqual(partialBalance, fullBalance)) {
log.debug('Cache miss: balance in active addresses differs from final balance');
self._notify('BalanceUpdated', fullBalance);
}
});

43
lib/storage.js

@ -59,6 +59,7 @@ Storage.prototype._createIndexes = function() {
});
this.db.collection(collections.CACHE).createIndex({
walletId: 1,
type: 1,
key: 1,
});
};
@ -230,7 +231,7 @@ Storage.prototype.fetchLastTxs = function(walletId, creatorId, limit, cb) {
Storage.prototype.fetchPendingTxs = function(walletId, cb) {
var self = this;
this.db.collection(collections.TXS).find({
self.db.collection(collections.TXS).find({
walletId: walletId,
isPending: true,
}).sort({
@ -506,34 +507,38 @@ Storage.prototype.fetchEmailByNotification = function(notificationId, cb) {
});
};
Storage.prototype.storeCacheData = function(walletId, key, value, cb) {
Storage.prototype.storeActiveAddresses = function(walletId, addresses, cb) {
var self = this;
var record = {
walletId: walletId,
key: key,
data: value
};
self.db.collection(collections.CACHE).update({
walletId: walletId,
key: key,
}, record, {
w: 1,
upsert: true,
async.each(addresses, function(address, next) {
var record = {
walletId: walletId,
type: 'activeAddresses',
key: address.address,
value: address,
};
self.db.collection(collections.CACHE).update({
walletId: record.walletId,
type: record.type,
key: record.key,
}, record, {
w: 1,
upsert: true,
}, next);
}, cb);
};
Storage.prototype.fetchCacheData = function(walletId, key, cb) {
Storage.prototype.fetchActiveAddresses = function(walletId, cb) {
var self = this;
self.db.collection(collections.CACHE).findOne({
self.db.collection(collections.CACHE).find({
walletId: walletId,
key: key,
}, function(err, result) {
type: 'activeAddresses',
}).toArray(function(err, result) {
if (err) return cb(err);
if (!result) return cb();
if (!result || _.isEmpty(result)) return cb(null, []);
return cb(null, result.data);
return cb(null, _.pluck(result, 'value'));
});
};

6
test/integration/helpers.js

@ -475,16 +475,16 @@ helpers.createProposalOpts = function(type, outputs, signingKey, moreOpts, input
return opts;
};
helpers.createAddresses = function(server, wallet, main, change, cb) {
var clock = sinon.useFakeTimers(Date.now(), 'Date');
// var clock = sinon.useFakeTimers('Date');
async.mapSeries(_.range(main + change), function(i, next) {
clock.tick(1000);
// clock.tick(1000);
var address = wallet.createAddress(i >= main);
server.storage.storeAddressAndWallet(wallet, address, function(err) {
next(err, address);
});
}, function(err, addresses) {
should.not.exist(err);
clock.restore();
// clock.restore();
return cb(_.take(addresses, main), _.takeRight(addresses, change));
});
};

61
test/integration/server.js

@ -1504,15 +1504,20 @@ describe('Wallet service', function() {
});
});
describe.only('#getBalance 2 steps', function() {
var server, wallet;
describe('#getBalance 2 steps', function() {
var server, wallet, clock;
beforeEach(function(done) {
clock = sinon.useFakeTimers(Date.now(), 'Date');
helpers.createAndJoinWallet(1, 1, function(s, w) {
server = s;
wallet = w;
done();
});
});
afterEach(function() {
clock.restore();
});
it('should get balance', function(done) {
helpers.stubUtxos(server, wallet, [1, 'u2', 3], function() {
@ -1532,21 +1537,28 @@ describe('Wallet service', function() {
balance.byAddress.length.should.equal(2);
balance.byAddress[0].amount.should.equal(helpers.toSatoshi(4));
balance.byAddress[1].amount.should.equal(helpers.toSatoshi(2));
done();
setTimeout(done, 100);
});
});
});
it('should trigger notification when balance of non-prioritary addresses is updated', function(done) {
var addresses;
var oldAddrs, newAddrs;
async.series([
function(next) {
helpers.createAddresses(server, wallet, 4, 0, function(addrs) {
addresses = addrs;
helpers.createAddresses(server, wallet, 2, 0, function(addrs) {
oldAddrs = addrs;
next();
});
},
function(next) {
clock.tick(7 * 24 * 3600 * 1000);
helpers.createAddresses(server, wallet, 2, 0, function(addrs) {
newAddrs = addrs;
helpers.stubUtxos(server, wallet, [1, 2], {
addresses: _.take(addresses, 2),
addresses: [oldAddrs[0], newAddrs[0]],
}, function() {
next();
});
@ -1556,13 +1568,24 @@ describe('Wallet service', function() {
server.getBalance2Steps({}, function(err, balance) {
should.not.exist(err);
should.exist(balance);
balance.totalAmount.should.equal(helpers.toSatoshi(3));
balance.totalAmount.should.equal(helpers.toSatoshi(2));
next();
});
},
function(next) {
setTimeout(next, 100);
},
function(next) {
server._getActiveAddresses(function(err, active) {
should.not.exist(err);
should.exist(active);
active.length.should.equal(3);
next();
});
},
function(next) {
helpers.stubUtxos(server, wallet, 0.5, {
addresses: addresses[2],
addresses: oldAddrs[1],
keepUtxos: true,
}, function() {
next();
@ -1596,15 +1619,22 @@ describe('Wallet service', function() {
});
it('should not trigger notification when only balance of prioritary addresses is updated', function(done) {
var addresses;
var oldAddrs, newAddrs;
async.series([
function(next) {
helpers.createAddresses(server, wallet, 4, 0, function(addrs) {
addresses = addrs;
helpers.createAddresses(server, wallet, 2, 0, function(addrs) {
oldAddrs = addrs;
next();
});
},
function(next) {
clock.tick(7 * 24 * 3600 * 1000);
helpers.createAddresses(server, wallet, 2, 0, function(addrs) {
newAddrs = addrs;
helpers.stubUtxos(server, wallet, [1, 2], {
addresses: _.take(addresses, 2),
addresses: newAddrs,
}, function() {
next();
});
@ -1618,9 +1648,12 @@ describe('Wallet service', function() {
next();
});
},
function(next) {
setTimeout(next, 100);
},
function(next) {
helpers.stubUtxos(server, wallet, 0.5, {
addresses: addresses[0],
addresses: newAddrs[0],
keepUtxos: true,
}, function() {
next();

Loading…
Cancel
Save