test: coverage for bitcoind getAddressUnspentOutputs
This commit is contained in:
parent
4d1b853fd4
commit
86b1acd0be
|
@ -1064,15 +1064,15 @@ Bitcoin.prototype.getAddressUnspentOutputs = function(addressArg, options, callb
|
||||||
|
|
||||||
for (var i = 0; i < mempoolDeltas.length; i++) {
|
for (var i = 0; i < mempoolDeltas.length; i++) {
|
||||||
var delta = mempoolDeltas[i];
|
var delta = mempoolDeltas[i];
|
||||||
if (delta.satoshis > 0) {
|
if (delta.prevtxid && delta.satoshis <= 0) {
|
||||||
mempoolUnspentOutputs.push(transformUnspentOutput(delta));
|
|
||||||
} else if (delta.satoshis < 0) {
|
|
||||||
if (!spentOutputs[delta.prevtxid]) {
|
if (!spentOutputs[delta.prevtxid]) {
|
||||||
spentOutputs[delta.prevtxid] = [delta.prevout];
|
spentOutputs[delta.prevtxid] = [delta.prevout];
|
||||||
} else {
|
} else {
|
||||||
spentOutputs[delta.prevtxid].push(delta.prevout);
|
spentOutputs[delta.prevtxid].push(delta.prevout);
|
||||||
}
|
}
|
||||||
isSpentOutputs = true;
|
isSpentOutputs = true;
|
||||||
|
} else {
|
||||||
|
mempoolUnspentOutputs.push(transformUnspentOutput(delta));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2169,6 +2169,187 @@ describe('Bitcoin Service', function() {
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it('will update with mempool results with multiple outputs', function(done) {
|
||||||
|
var deltas = [
|
||||||
|
{
|
||||||
|
txid: 'e9dcf22807db77ac0276b03cc2d3a8b03c4837db8ac6650501ef45af1c807cce',
|
||||||
|
satoshis: -7679241,
|
||||||
|
address: '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo',
|
||||||
|
index: 0,
|
||||||
|
timestamp: 1461342707725,
|
||||||
|
prevtxid: '46f24e0c274fc07708b781963576c4c5d5625d926dbb0a17fa865dcd9fe58ea0',
|
||||||
|
prevout: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
txid: 'e9dcf22807db77ac0276b03cc2d3a8b03c4837db8ac6650501ef45af1c807cce',
|
||||||
|
satoshis: -7679241,
|
||||||
|
address: '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo',
|
||||||
|
index: 1,
|
||||||
|
timestamp: 1461342707725,
|
||||||
|
prevtxid: '46f24e0c274fc07708b781963576c4c5d5625d926dbb0a17fa865dcd9fe58ea0',
|
||||||
|
prevout: 2
|
||||||
|
}
|
||||||
|
];
|
||||||
|
var bitcoind = new BitcoinService(baseConfig);
|
||||||
|
var confirmedUtxos = [
|
||||||
|
{
|
||||||
|
address: '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo',
|
||||||
|
txid: '46f24e0c274fc07708b781963576c4c5d5625d926dbb0a17fa865dcd9fe58ea0',
|
||||||
|
outputIndex: 1,
|
||||||
|
script: '76a914f399b4b8894f1153b96fce29f05e6e116eb4c21788ac',
|
||||||
|
satoshis: 7679241,
|
||||||
|
height: 207111
|
||||||
|
},
|
||||||
|
{
|
||||||
|
address: '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo',
|
||||||
|
txid: '46f24e0c274fc07708b781963576c4c5d5625d926dbb0a17fa865dcd9fe58ea0',
|
||||||
|
outputIndex: 2,
|
||||||
|
script: '76a914f399b4b8894f1153b96fce29f05e6e116eb4c21788ac',
|
||||||
|
satoshis: 7679241,
|
||||||
|
height: 207111
|
||||||
|
}
|
||||||
|
];
|
||||||
|
bitcoind.nodes.push({
|
||||||
|
client: {
|
||||||
|
getAddressUtxos: sinon.stub().callsArgWith(1, null, {
|
||||||
|
result: confirmedUtxos
|
||||||
|
}),
|
||||||
|
getAddressMempool: sinon.stub().callsArgWith(1, null, {
|
||||||
|
result: deltas
|
||||||
|
})
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var options = {
|
||||||
|
queryMempool: true
|
||||||
|
};
|
||||||
|
var address = '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo';
|
||||||
|
bitcoind.getAddressUnspentOutputs(address, options, function(err, utxos) {
|
||||||
|
if (err) {
|
||||||
|
return done(err);
|
||||||
|
}
|
||||||
|
utxos.length.should.equal(0);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('will update with mempool results spending zero value output (likely never to happen)', function(done) {
|
||||||
|
var deltas = [
|
||||||
|
{
|
||||||
|
txid: 'e9dcf22807db77ac0276b03cc2d3a8b03c4837db8ac6650501ef45af1c807cce',
|
||||||
|
satoshis: 0,
|
||||||
|
address: '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo',
|
||||||
|
index: 0,
|
||||||
|
timestamp: 1461342707725,
|
||||||
|
prevtxid: '46f24e0c274fc07708b781963576c4c5d5625d926dbb0a17fa865dcd9fe58ea0',
|
||||||
|
prevout: 1
|
||||||
|
}
|
||||||
|
];
|
||||||
|
var bitcoind = new BitcoinService(baseConfig);
|
||||||
|
var confirmedUtxos = [
|
||||||
|
{
|
||||||
|
address: '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo',
|
||||||
|
txid: '46f24e0c274fc07708b781963576c4c5d5625d926dbb0a17fa865dcd9fe58ea0',
|
||||||
|
outputIndex: 1,
|
||||||
|
script: '76a914f399b4b8894f1153b96fce29f05e6e116eb4c21788ac',
|
||||||
|
satoshis: 0,
|
||||||
|
height: 207111
|
||||||
|
}
|
||||||
|
];
|
||||||
|
bitcoind.nodes.push({
|
||||||
|
client: {
|
||||||
|
getAddressUtxos: sinon.stub().callsArgWith(1, null, {
|
||||||
|
result: confirmedUtxos
|
||||||
|
}),
|
||||||
|
getAddressMempool: sinon.stub().callsArgWith(1, null, {
|
||||||
|
result: deltas
|
||||||
|
})
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var options = {
|
||||||
|
queryMempool: true
|
||||||
|
};
|
||||||
|
var address = '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo';
|
||||||
|
bitcoind.getAddressUnspentOutputs(address, options, function(err, utxos) {
|
||||||
|
if (err) {
|
||||||
|
return done(err);
|
||||||
|
}
|
||||||
|
utxos.length.should.equal(0);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('will not filter results if mempool is not spending', function(done) {
|
||||||
|
var deltas = [
|
||||||
|
{
|
||||||
|
txid: 'e9dcf22807db77ac0276b03cc2d3a8b03c4837db8ac6650501ef45af1c807cce',
|
||||||
|
satoshis: 10000,
|
||||||
|
address: '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo',
|
||||||
|
index: 0,
|
||||||
|
timestamp: 1461342707725
|
||||||
|
}
|
||||||
|
];
|
||||||
|
var bitcoind = new BitcoinService(baseConfig);
|
||||||
|
var confirmedUtxos = [
|
||||||
|
{
|
||||||
|
address: '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo',
|
||||||
|
txid: '46f24e0c274fc07708b781963576c4c5d5625d926dbb0a17fa865dcd9fe58ea0',
|
||||||
|
outputIndex: 1,
|
||||||
|
script: '76a914f399b4b8894f1153b96fce29f05e6e116eb4c21788ac',
|
||||||
|
satoshis: 0,
|
||||||
|
height: 207111
|
||||||
|
}
|
||||||
|
];
|
||||||
|
bitcoind.nodes.push({
|
||||||
|
client: {
|
||||||
|
getAddressUtxos: sinon.stub().callsArgWith(1, null, {
|
||||||
|
result: confirmedUtxos
|
||||||
|
}),
|
||||||
|
getAddressMempool: sinon.stub().callsArgWith(1, null, {
|
||||||
|
result: deltas
|
||||||
|
})
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var options = {
|
||||||
|
queryMempool: true
|
||||||
|
};
|
||||||
|
var address = '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo';
|
||||||
|
bitcoind.getAddressUnspentOutputs(address, options, function(err, utxos) {
|
||||||
|
if (err) {
|
||||||
|
return done(err);
|
||||||
|
}
|
||||||
|
utxos.length.should.equal(2);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('it will handle error from getAddressMempool', function(done) {
|
||||||
|
var bitcoind = new BitcoinService(baseConfig);
|
||||||
|
bitcoind.nodes.push({
|
||||||
|
client: {
|
||||||
|
getAddressMempool: sinon.stub().callsArgWith(1, {code: -1, message: 'test'})
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var options = {
|
||||||
|
queryMempool: true
|
||||||
|
};
|
||||||
|
var address = '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo';
|
||||||
|
bitcoind.getAddressUnspentOutputs(address, options, function(err) {
|
||||||
|
err.should.be.instanceOf(Error);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('should set query mempool if undefined', function(done) {
|
||||||
|
var bitcoind = new BitcoinService(baseConfig);
|
||||||
|
var getAddressMempool = sinon.stub().callsArgWith(1, {code: -1, message: 'test'});
|
||||||
|
bitcoind.nodes.push({
|
||||||
|
client: {
|
||||||
|
getAddressMempool: getAddressMempool
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var options = {};
|
||||||
|
var address = '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo';
|
||||||
|
bitcoind.getAddressUnspentOutputs(address, options, function(err) {
|
||||||
|
getAddressMempool.callCount.should.equal(1);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#_getBalanceFromMempool', function() {
|
describe('#_getBalanceFromMempool', function() {
|
||||||
|
|
Loading…
Reference in New Issue