mirror of https://github.com/BTCPrivate/copay.git
add preconditions and tests
This commit is contained in:
parent
1457764930
commit
889edf4b92
|
@ -54,8 +54,7 @@ TxProposal.getSentTs = function() {
|
||||||
TxProposal.prototype.merge = function(other) {
|
TxProposal.prototype.merge = function(other) {
|
||||||
var ret = {};
|
var ret = {};
|
||||||
ret.events = this.mergeMetadata(other);
|
ret.events = this.mergeMetadata(other);
|
||||||
ret.hasChanged = this.mergeBuilder(other); // TODO: use this?
|
ret.hasChanged = this.mergeBuilder(other);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -151,6 +150,7 @@ TxProposals.prototype.getNtxids = function() {
|
||||||
};
|
};
|
||||||
|
|
||||||
TxProposals.prototype.toObj = function(onlyThisNtxid) {
|
TxProposals.prototype.toObj = function(onlyThisNtxid) {
|
||||||
|
if (onlyThisNtxid) throw new Error();
|
||||||
var ret = [];
|
var ret = [];
|
||||||
for (var id in this.txps) {
|
for (var id in this.txps) {
|
||||||
|
|
||||||
|
@ -172,14 +172,15 @@ TxProposals.prototype.merge = function(inTxp) {
|
||||||
var myTxps = this.txps;
|
var myTxps = this.txps;
|
||||||
|
|
||||||
var ntxid = inTxp.getID();
|
var ntxid = inTxp.getID();
|
||||||
var ret;
|
var ret = {};
|
||||||
|
ret.events = [];
|
||||||
|
ret.events.hasChanged = false;
|
||||||
|
|
||||||
if (myTxps[ntxid]) {
|
if (myTxps[ntxid]) {
|
||||||
var v0 = myTxps[ntxid];
|
var v0 = myTxps[ntxid];
|
||||||
var v1 = inTxp;
|
var v1 = inTxp;
|
||||||
ret = v0.merge(v1);
|
ret = v0.merge(v1);
|
||||||
} else {
|
} else {
|
||||||
ret.events = {};
|
|
||||||
ret.hasChanged = true;
|
ret.hasChanged = true;
|
||||||
ret.events.push({
|
ret.events.push({
|
||||||
type: 'new',
|
type: 'new',
|
||||||
|
|
|
@ -5,6 +5,7 @@ var imports = require('soop').imports();
|
||||||
var http = require('http');
|
var http = require('http');
|
||||||
var EventEmitter = imports.EventEmitter || require('events').EventEmitter;
|
var EventEmitter = imports.EventEmitter || require('events').EventEmitter;
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
|
var preconditions = require('preconditions').instance();
|
||||||
|
|
||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
var bignum = bitcore.Bignum;
|
var bignum = bitcore.Bignum;
|
||||||
|
@ -126,7 +127,7 @@ Wallet.prototype._handleTxProposal = function(senderId, data) {
|
||||||
|
|
||||||
if (mergeInfo.hasChanged || added) {
|
if (mergeInfo.hasChanged || added) {
|
||||||
this.log('### BROADCASTING txProposals. ');
|
this.log('### BROADCASTING txProposals. ');
|
||||||
this.sendTxProposals(null, inTxp.getID());
|
this.sendTxProposal(inTxp.getID());
|
||||||
}
|
}
|
||||||
|
|
||||||
this.emit('txProposalsUpdated');
|
this.emit('txProposalsUpdated');
|
||||||
|
@ -153,7 +154,7 @@ Wallet.prototype._handleData = function(senderId, data, isInbound) {
|
||||||
break;
|
break;
|
||||||
case 'walletReady':
|
case 'walletReady':
|
||||||
this.sendPublicKeyRing(senderId);
|
this.sendPublicKeyRing(senderId);
|
||||||
this.sendTxProposals(senderId); // send old
|
this.sendAllTxProposals(senderId); // send old txps
|
||||||
break;
|
break;
|
||||||
case 'publicKeyRing':
|
case 'publicKeyRing':
|
||||||
this._handlePublicKeyRing(senderId, data, isInbound);
|
this._handlePublicKeyRing(senderId, data, isInbound);
|
||||||
|
@ -355,12 +356,20 @@ Wallet.prototype.toEncryptedObj = function() {
|
||||||
return this.storage.export(walletObj);
|
return this.storage.export(walletObj);
|
||||||
};
|
};
|
||||||
|
|
||||||
Wallet.prototype.sendTxProposal = function(recipients, ntxid) {
|
Wallet.prototype.sendAllTxProposals = function(recipients) {
|
||||||
this.log('### SENDING txProposals TO:', recipients || 'All', this.txProposals);
|
var ntxids = this.txProposals.getNtxids();
|
||||||
var id = toSend[i];
|
for (var i in ntxids) {
|
||||||
|
var ntxid = ntxids[i];
|
||||||
|
this.sendTxProposal(ntxid, recipients);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Wallet.prototype.sendTxProposal = function(ntxid, recipients) {
|
||||||
|
preconditions.checkArgument(ntxid);
|
||||||
|
this.log('### SENDING txProposal '+ntxid+' TO:', recipients || 'All', this.txProposals);
|
||||||
this.network.send(recipients, {
|
this.network.send(recipients, {
|
||||||
type: 'txProposal',
|
type: 'txProposal',
|
||||||
txProposals: this.txProposals.toObj(id),
|
txProposal: this.txProposals.txps[ntxid].toObj(),
|
||||||
walletId: this.id,
|
walletId: this.id,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -450,7 +459,7 @@ Wallet.prototype.reject = function(ntxid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
txp.rejectedBy[myId] = Date.now();
|
txp.rejectedBy[myId] = Date.now();
|
||||||
this.sendTxProposals(null, ntxid);
|
this.sendTxProposal(ntxid);
|
||||||
this.store();
|
this.store();
|
||||||
this.emit('txProposalsUpdated');
|
this.emit('txProposalsUpdated');
|
||||||
};
|
};
|
||||||
|
@ -475,7 +484,7 @@ Wallet.prototype.sign = function(ntxid, cb) {
|
||||||
var ret = false;
|
var ret = false;
|
||||||
if (b.signaturesAdded > before) {
|
if (b.signaturesAdded > before) {
|
||||||
txp.signedBy[myId] = Date.now();
|
txp.signedBy[myId] = Date.now();
|
||||||
self.sendTxProposals(null, ntxid);
|
self.sendTxProposal(ntxid);
|
||||||
self.store();
|
self.store();
|
||||||
self.emit('txProposalsUpdated');
|
self.emit('txProposalsUpdated');
|
||||||
ret = true;
|
ret = true;
|
||||||
|
@ -503,7 +512,7 @@ Wallet.prototype.sendTx = function(ntxid, cb) {
|
||||||
self.log('BITCOIND txid:', txid);
|
self.log('BITCOIND txid:', txid);
|
||||||
if (txid) {
|
if (txid) {
|
||||||
self.txProposals.setSent(ntxid, txid);
|
self.txProposals.setSent(ntxid, txid);
|
||||||
self.sendTxProposals(null, ntxid);
|
self.sendTxProposal(ntxid);
|
||||||
self.store();
|
self.store();
|
||||||
}
|
}
|
||||||
return cb(txid);
|
return cb(txid);
|
||||||
|
@ -630,7 +639,7 @@ Wallet.prototype.createTx = function(toAddress, amountSatStr, comment, opts, cb)
|
||||||
var ntxid = self.createTxSync(toAddress, amountSatStr, comment, safeUnspent, opts);
|
var ntxid = self.createTxSync(toAddress, amountSatStr, comment, safeUnspent, opts);
|
||||||
if (ntxid) {
|
if (ntxid) {
|
||||||
self.sendIndexes();
|
self.sendIndexes();
|
||||||
self.sendTxProposals(null, ntxid);
|
self.sendTxProposal(ntxid);
|
||||||
self.store();
|
self.store();
|
||||||
self.emit('txProposalsUpdated');
|
self.emit('txProposalsUpdated');
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"mocha": "^1.18.2",
|
"mocha": "^1.18.2",
|
||||||
"mocha-lcov-reporter": "0.0.1"
|
"mocha-lcov-reporter": "0.0.1",
|
||||||
|
"preconditions": "^1.0.7"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -219,7 +219,7 @@ describe('TxProposals model', function() {
|
||||||
(w.txps[ntxid].signedBy[priv.id] - ts > 0).should.equal(true);
|
(w.txps[ntxid].signedBy[priv.id] - ts > 0).should.equal(true);
|
||||||
(w.txps[ntxid].seenBy[priv.id] - ts > 0).should.equal(true);
|
(w.txps[ntxid].seenBy[priv.id] - ts > 0).should.equal(true);
|
||||||
|
|
||||||
var info = w.merge(w.txps[0]);
|
var info = w.merge(w.txps[ntxid]);
|
||||||
info.events.length.should.equal(0);
|
info.events.length.should.equal(0);
|
||||||
|
|
||||||
Object.keys(w.txps).length.should.equal(1);
|
Object.keys(w.txps).length.should.equal(1);
|
||||||
|
@ -293,7 +293,7 @@ describe('TxProposals model', function() {
|
||||||
(w2.txps[ntxid].signedBy[priv.id] - ts > 0).should.equal(true);
|
(w2.txps[ntxid].signedBy[priv.id] - ts > 0).should.equal(true);
|
||||||
(w2.txps[ntxid].seenBy[priv.id] - ts > 0).should.equal(true);
|
(w2.txps[ntxid].seenBy[priv.id] - ts > 0).should.equal(true);
|
||||||
|
|
||||||
var info = w.merge(w2);
|
var info = w.merge(w2.txps[ntxid]);
|
||||||
info.events.length.should.equal(1);
|
info.events.length.should.equal(1);
|
||||||
info.events[0].type.should.equal('signed');
|
info.events[0].type.should.equal('signed');
|
||||||
|
|
||||||
|
@ -401,7 +401,7 @@ describe('TxProposals model', function() {
|
||||||
(w2.txps[ntxid].signedBy[priv.id] - ts > 0).should.equal(true);
|
(w2.txps[ntxid].signedBy[priv.id] - ts > 0).should.equal(true);
|
||||||
(w2.txps[ntxid].seenBy[priv.id] - ts > 0).should.equal(true);
|
(w2.txps[ntxid].seenBy[priv.id] - ts > 0).should.equal(true);
|
||||||
|
|
||||||
var info = w.merge(w2);
|
var info = w.merge(w2.txps[ntxid]);
|
||||||
info.events.length.should.equal(1);
|
info.events.length.should.equal(1);
|
||||||
info.events[0].type.should.equal('signed');
|
info.events[0].type.should.equal('signed');
|
||||||
|
|
||||||
|
@ -431,7 +431,7 @@ describe('TxProposals model', function() {
|
||||||
(w3.txps[ntxid].signedBy[priv2.id] - ts > 0).should.equal(true);
|
(w3.txps[ntxid].signedBy[priv2.id] - ts > 0).should.equal(true);
|
||||||
(w3.txps[ntxid].seenBy[priv2.id] - ts > 0).should.equal(true);
|
(w3.txps[ntxid].seenBy[priv2.id] - ts > 0).should.equal(true);
|
||||||
|
|
||||||
var info = w.merge(w3);
|
var info = w.merge(w3.txps[ntxid]);
|
||||||
info.events.length.should.equal(0);
|
info.events.length.should.equal(0);
|
||||||
|
|
||||||
Object.keys(w.txps).length.should.equal(1);
|
Object.keys(w.txps).length.should.equal(1);
|
||||||
|
@ -522,7 +522,7 @@ describe('TxProposals model', function() {
|
||||||
(w3.txps[ntxid].signedBy[priv3.id] - ts > 0).should.equal(true);
|
(w3.txps[ntxid].signedBy[priv3.id] - ts > 0).should.equal(true);
|
||||||
(w3.txps[ntxid].seenBy[priv3.id] - ts > 0).should.equal(true);
|
(w3.txps[ntxid].seenBy[priv3.id] - ts > 0).should.equal(true);
|
||||||
|
|
||||||
var info = w.merge(w2);
|
var info = w.merge(w2.txps[ntxid]);
|
||||||
info.events.length.should.equal(0);
|
info.events.length.should.equal(0);
|
||||||
|
|
||||||
Object.keys(w.txps).length.should.equal(1);
|
Object.keys(w.txps).length.should.equal(1);
|
||||||
|
@ -535,7 +535,7 @@ describe('TxProposals model', function() {
|
||||||
(w.txps[ntxid].signedBy[priv2.id] - ts > 0).should.equal(true);
|
(w.txps[ntxid].signedBy[priv2.id] - ts > 0).should.equal(true);
|
||||||
|
|
||||||
|
|
||||||
var info = w.merge(w3);
|
var info = w.merge(w3.txps[ntxid]);
|
||||||
info.events.length.should.equal(0);
|
info.events.length.should.equal(0);
|
||||||
|
|
||||||
var tx = w.txps[ntxid].builder.build();
|
var tx = w.txps[ntxid].builder.build();
|
||||||
|
@ -601,7 +601,7 @@ describe('TxProposals model', function() {
|
||||||
should.exist(w2.txps[ntxid].builder);
|
should.exist(w2.txps[ntxid].builder);
|
||||||
should.exist(w2.txps[ntxid].builder.valueInSat);
|
should.exist(w2.txps[ntxid].builder.valueInSat);
|
||||||
|
|
||||||
w2.merge(w);
|
w2.merge(w.txps[ntxid]);
|
||||||
Object.keys(w2.txps).length.should.equal(1);
|
Object.keys(w2.txps).length.should.equal(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,10 @@ describe('Wallet model', function() {
|
||||||
}).should.
|
}).should.
|
||||||
throw();
|
throw();
|
||||||
});
|
});
|
||||||
|
it('should getNetworkName', function() {
|
||||||
|
var w = createW();
|
||||||
|
w.getNetworkName().should.equal('testnet');
|
||||||
|
});
|
||||||
|
|
||||||
var createW = function(netKey, N) {
|
var createW = function(netKey, N) {
|
||||||
|
|
||||||
|
@ -358,8 +362,7 @@ describe('Wallet model', function() {
|
||||||
it('handle network txProposals correctly', function() {
|
it('handle network txProposals correctly', function() {
|
||||||
var w = createW();
|
var w = createW();
|
||||||
var txps = {
|
var txps = {
|
||||||
'txProposals': {
|
'txProposal': {
|
||||||
"txps": [{
|
|
||||||
"seenBy": {
|
"seenBy": {
|
||||||
"undefined": 1402337282806
|
"undefined": 1402337282806
|
||||||
},
|
},
|
||||||
|
@ -398,11 +401,9 @@ describe('Wallet model', function() {
|
||||||
"spendUnconfirmed": false,
|
"spendUnconfirmed": false,
|
||||||
"tx": "0100000001c1cf12ab89729d19d3cdec8ae531b5038d56c741006a105d532b3a7afa65c12a01000000fd40010047304402201aad0ea92f929be21d60afb741b76bfcf2aa9614079cb9da76b15b3a1210f07b02205bc5c1895105da3ee682e532d2d49dfd1214fa6123fb9c9d552336f135c77eff0147304402203f02f15bb4ad4bc7d0ca4612fd9e9ae05a1331f3d62f302cf08dba56695f5dcf0220700110562fe228ebba324b120de64a7bbaddf049d67a313f749e9b32ee88787d014cad5321027da98ce0407138461f4ad803a1fb67afa4246f06ad0e1256a087daeffd82a8642102e7f87f2b094ec322be2fb99d3ca81fd6ac0ab26ce081e51ab18c507f8b6d1d162102ed5d256036e10568c33e0a15021cc1806e04d7d24c8f020aaae23ec2deecb4302103b6f88231bb5a5f4629e4d097492321f86968c6aeb012196a1fe3b217fe4ae0ac2103f6b5e2c1db3124a5058a0e3e83d5d0c412b9a5b50e2ef97e2b7e1c0af57ab3e355aeffffffff0215cd5b07000000001976a91434f8e0c5be216025a52addf18a987543cad23f7a88acdbd53e340000000017a914a09f10bc42b61ecf9d3d09550765c228f1cb808a8700000000"
|
"tx": "0100000001c1cf12ab89729d19d3cdec8ae531b5038d56c741006a105d532b3a7afa65c12a01000000fd40010047304402201aad0ea92f929be21d60afb741b76bfcf2aa9614079cb9da76b15b3a1210f07b02205bc5c1895105da3ee682e532d2d49dfd1214fa6123fb9c9d552336f135c77eff0147304402203f02f15bb4ad4bc7d0ca4612fd9e9ae05a1331f3d62f302cf08dba56695f5dcf0220700110562fe228ebba324b120de64a7bbaddf049d67a313f749e9b32ee88787d014cad5321027da98ce0407138461f4ad803a1fb67afa4246f06ad0e1256a087daeffd82a8642102e7f87f2b094ec322be2fb99d3ca81fd6ac0ab26ce081e51ab18c507f8b6d1d162102ed5d256036e10568c33e0a15021cc1806e04d7d24c8f020aaae23ec2deecb4302103b6f88231bb5a5f4629e4d097492321f86968c6aeb012196a1fe3b217fe4ae0ac2103f6b5e2c1db3124a5058a0e3e83d5d0c412b9a5b50e2ef97e2b7e1c0af57ab3e355aeffffffff0215cd5b07000000001976a91434f8e0c5be216025a52addf18a987543cad23f7a88acdbd53e340000000017a914a09f10bc42b61ecf9d3d09550765c228f1cb808a8700000000"
|
||||||
}
|
}
|
||||||
}],
|
|
||||||
"networkName": "testnet"
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
w._handleTxProposals('senderID', txps, true);
|
w._handleTxProposal('senderID', txps, true);
|
||||||
Object.keys(w.txProposals.txps).length.should.equal(1);
|
Object.keys(w.txProposals.txps).length.should.equal(1);
|
||||||
w.getTxProposals().length.should.equal(1);
|
w.getTxProposals().length.should.equal(1);
|
||||||
});
|
});
|
||||||
|
@ -514,7 +515,6 @@ describe('Wallet model', function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// tx handling
|
// tx handling
|
||||||
|
|
||||||
var createUTXO = function(w) {
|
var createUTXO = function(w) {
|
||||||
|
@ -577,7 +577,6 @@ describe('Wallet model', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('should create & sign & send a transaction', function(done) {
|
it('should create & sign & send a transaction', function(done) {
|
||||||
|
|
||||||
var w = createW2(null, 1);
|
var w = createW2(null, 1);
|
||||||
var utxo = createUTXO(w);
|
var utxo = createUTXO(w);
|
||||||
w.blockchain.fixUnspent(utxo);
|
w.blockchain.fixUnspent(utxo);
|
||||||
|
@ -588,9 +587,17 @@ describe('Wallet model', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('#getNetworkName', function() {
|
it('should send TxProposal', function(done) {
|
||||||
var w = createW();
|
var w = createW2();
|
||||||
w.getNetworkName().should.equal('testnet');
|
var utxo = createUTXO(w);
|
||||||
|
w.blockchain.fixUnspent(utxo);
|
||||||
|
w.createTx(toAddress, amountSatStr, null, function(ntxid) {
|
||||||
|
w.sendTxProposal.should.throw('Illegal Argument.');
|
||||||
|
(function() {
|
||||||
|
w.sendTxProposal(ntxid)
|
||||||
|
}).should.not.throw();
|
||||||
|
done();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
var mockFakeActivity = function(w, f) {
|
var mockFakeActivity = function(w, f) {
|
||||||
|
|
Loading…
Reference in New Issue