mirror of https://github.com/BTCPrivate/copay.git
Merge pull request #2408 from matiaspando/increaseCoverage90
Increase coverage to 90%
This commit is contained in:
commit
f76099c5b4
|
@ -379,8 +379,14 @@ Identity.prototype.setBackupNeeded = function(backupNeeded) {
|
||||||
self.backupNeeded = !!backupNeeded;
|
self.backupNeeded = !!backupNeeded;
|
||||||
|
|
||||||
self.verifyChecksum(function(err, match) {
|
self.verifyChecksum(function(err, match) {
|
||||||
if (err) return cb(err);
|
if (err) {
|
||||||
if (!match) return cb('The profile is out of sync. Please re-login to get the latest changes.');
|
log.error(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!match) {
|
||||||
|
log.error('The profile is out of sync. Please re-login to get the latest changes.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
self.store({
|
self.store({
|
||||||
noWallets: true
|
noWallets: true
|
||||||
|
|
|
@ -154,12 +154,6 @@ TxProposal.prototype._check = function() {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
TxProposal.prototype.trimForStorage = function() {
|
|
||||||
// TODO (remove builder / builderObj. utxos, etc)
|
|
||||||
//
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
TxProposal.prototype.addMerchantData = function(merchantData) {
|
TxProposal.prototype.addMerchantData = function(merchantData) {
|
||||||
preconditions.checkArgument(merchantData.pr);
|
preconditions.checkArgument(merchantData.pr);
|
||||||
preconditions.checkArgument(merchantData.request_url);
|
preconditions.checkArgument(merchantData.request_url);
|
||||||
|
|
345
test/Identity.js
345
test/Identity.js
|
@ -175,8 +175,122 @@ describe('Identity model', function() {
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('should return an error', function(done) {
|
||||||
|
var storage = sinon.stub();
|
||||||
|
storage.setCredentials = sinon.stub();
|
||||||
|
|
||||||
|
var opts = {
|
||||||
|
email: 'test@test.com',
|
||||||
|
password: '123',
|
||||||
|
network: {
|
||||||
|
testnet: {
|
||||||
|
url: 'https://test-insight.bitpay.com:443'
|
||||||
|
},
|
||||||
|
livenet: {
|
||||||
|
url: 'https://insight.bitpay.com:443'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
storage: storage,
|
||||||
|
};
|
||||||
|
|
||||||
|
var iden = new Identity(opts);
|
||||||
|
|
||||||
|
storage.getItem = sinon.stub().yields('error', JSON.stringify(iden));
|
||||||
|
|
||||||
|
Identity.open(opts, function(err, res) {
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return an error because data has bad format', function(done) {
|
||||||
|
var storage = sinon.stub();
|
||||||
|
storage.setCredentials = sinon.stub();
|
||||||
|
|
||||||
|
var opts = {
|
||||||
|
email: 'test@test.com',
|
||||||
|
password: '123',
|
||||||
|
network: {
|
||||||
|
testnet: {
|
||||||
|
url: 'https://test-insight.bitpay.com:443'
|
||||||
|
},
|
||||||
|
livenet: {
|
||||||
|
url: 'https://insight.bitpay.com:443'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
storage: storage,
|
||||||
|
};
|
||||||
|
|
||||||
|
var iden = new Identity(opts);
|
||||||
|
|
||||||
|
storage.getItem = sinon.stub().yields(null, '{badformat'); //bad format of object
|
||||||
|
|
||||||
|
Identity.open(opts, function(err, res) {
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
describe('#verifyChecksum', function(done) {
|
||||||
|
it('should return an error', function(done) {
|
||||||
|
var storage = sinon.stub();
|
||||||
|
storage.setCredentials = sinon.stub();
|
||||||
|
|
||||||
|
var opts = {
|
||||||
|
email: 'test@test.com',
|
||||||
|
password: '123',
|
||||||
|
network: {
|
||||||
|
testnet: {
|
||||||
|
url: 'https://test-insight.bitpay.com:443'
|
||||||
|
},
|
||||||
|
livenet: {
|
||||||
|
url: 'https://insight.bitpay.com:443'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
storage: storage,
|
||||||
|
};
|
||||||
|
|
||||||
|
var iden = new Identity(opts);
|
||||||
|
storage.getItem = sinon.stub().yields('error', null);
|
||||||
|
iden.verifyChecksum(function(err, res) {
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return an error bad object format', function(done) {
|
||||||
|
var storage = sinon.stub();
|
||||||
|
storage.setCredentials = sinon.stub();
|
||||||
|
|
||||||
|
var opts = {
|
||||||
|
email: 'test@test.com',
|
||||||
|
password: '123',
|
||||||
|
network: {
|
||||||
|
testnet: {
|
||||||
|
url: 'https://test-insight.bitpay.com:443'
|
||||||
|
},
|
||||||
|
livenet: {
|
||||||
|
url: 'https://insight.bitpay.com:443'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
storage: storage,
|
||||||
|
};
|
||||||
|
|
||||||
|
var iden = new Identity(opts);
|
||||||
|
storage.getItem = sinon.stub().yields(null, '{badformat');
|
||||||
|
iden.verifyChecksum(function(err, res) {
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
describe('#resendVerificationEmail', function(done) {
|
describe('#resendVerificationEmail', function(done) {
|
||||||
it('should resend verification email', function() {
|
it('should resend verification email', function() {
|
||||||
var storage = sinon.stub();
|
var storage = sinon.stub();
|
||||||
|
@ -233,6 +347,20 @@ describe('Identity model', function() {
|
||||||
iden.store.calledOnce.should.be.true;
|
iden.store.calledOnce.should.be.true;
|
||||||
iden.store.getCall(0).args[0].noWallets.should.equal(true);
|
iden.store.getCall(0).args[0].noWallets.should.equal(true);
|
||||||
});
|
});
|
||||||
|
it('should not set the flag backupNeeded ', function() {
|
||||||
|
var iden = new Identity(getDefaultParams());
|
||||||
|
iden.verifyChecksum = sinon.stub().yields('error', true);
|
||||||
|
iden.setBackupNeeded(false);
|
||||||
|
iden.backupNeeded.should.be.false;
|
||||||
|
iden.store.calledOnce.should.be.false;
|
||||||
|
});
|
||||||
|
it('should not set the flag backupNeeded match returns false', function() {
|
||||||
|
var iden = new Identity(getDefaultParams());
|
||||||
|
iden.verifyChecksum = sinon.stub().yields(null, false);
|
||||||
|
iden.setBackupNeeded(false);
|
||||||
|
iden.backupNeeded.should.be.false;
|
||||||
|
iden.store.calledOnce.should.be.false;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#close', function(done) {
|
describe('#close', function(done) {
|
||||||
|
@ -481,6 +609,30 @@ describe('Identity model', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return error', function(done) {
|
||||||
|
args.storage.getItem = sinon.stub().yields(null, JSON.stringify(iden));
|
||||||
|
args.storage.setItem = sinon.stub();
|
||||||
|
iden.verifyChecksum = sinon.stub().yields('error');
|
||||||
|
iden.createWallet({
|
||||||
|
walletClass: walletClass,
|
||||||
|
}, function(err, w) {
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return error because verifyChecksum returns false', function(done) {
|
||||||
|
args.storage.getItem = sinon.stub().yields(null, JSON.stringify(iden));
|
||||||
|
args.storage.setItem = sinon.stub();
|
||||||
|
iden.verifyChecksum = sinon.stub().yields(null, false);
|
||||||
|
iden.createWallet({
|
||||||
|
walletClass: walletClass,
|
||||||
|
}, function(err, w) {
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('should be able to create wallets with random pk', function(done) {
|
it('should be able to create wallets with random pk', function(done) {
|
||||||
args.storage.getItem = sinon.stub().yields(null, JSON.stringify(iden));
|
args.storage.getItem = sinon.stub().yields(null, JSON.stringify(iden));
|
||||||
args.storage.setItem = sinon.stub();
|
args.storage.setItem = sinon.stub();
|
||||||
|
@ -528,11 +680,61 @@ describe('Identity model', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it('should return error', function(done) {
|
||||||
|
var args = createIdentity();
|
||||||
|
args.storage.getItem.onFirstCall().callsArgWith(1, null, '{"walletError');
|
||||||
|
var backup = Wallet.fromUntrustedObj;
|
||||||
|
args.params.noWallets = true;
|
||||||
|
sinon.stub().returns(args.wallet);
|
||||||
|
|
||||||
|
var opts = {
|
||||||
|
importWallet: sinon.stub().returns(getNewWallet()),
|
||||||
|
};
|
||||||
|
|
||||||
|
Identity.create(args.params, function(err, iden) {
|
||||||
|
iden.retrieveWalletFromStorage('dummy', opts, function(err, wallet) {
|
||||||
|
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
describe('#importWalletFromObj', function() {
|
describe('#importWalletFromObj', function() {
|
||||||
|
it('should return an error', function(done) {
|
||||||
|
var iden = new Identity(getDefaultParams());
|
||||||
|
iden.verifyChecksum = sinon.stub().yields('error', true);
|
||||||
|
iden.importWalletFromObj({}, {}, function(err) {
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('should return an error case 2', function(done) {
|
||||||
|
var iden = new Identity(getDefaultParams());
|
||||||
|
iden.verifyChecksum = sinon.stub().yields(null, false);
|
||||||
|
iden.importWalletFromObj({}, {}, function(err) {
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return an error case 3', function(done) {
|
||||||
|
var iden = new Identity(getDefaultParams());
|
||||||
|
iden.verifyChecksum = sinon.stub().yields(null, true);
|
||||||
|
iden.importWalletFromObj({}, {
|
||||||
|
importWallet: function() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}, function(err) {
|
||||||
|
console.log(err);
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('should import a wallet, call the right encryption functions', function(done) {
|
it('should import a wallet, call the right encryption functions', function(done) {
|
||||||
var args = createIdentity();
|
var args = createIdentity();
|
||||||
args.storage.getItem.onFirstCall().callsArgWith(1, null, '{"wallet": "fakeData"}');
|
args.storage.getItem.onFirstCall().callsArgWith(1, null, '{"wallet": "fakeData"}');
|
||||||
|
@ -659,6 +861,34 @@ describe('Identity model', function() {
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return an error ', function(done) {
|
||||||
|
iden.addWallet(w);
|
||||||
|
iden.storage.getItem = sinon.stub().yields('error', JSON.stringify(iden));
|
||||||
|
iden.deleteWallet('32', function(err) {
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return an checksum error ', function(done) {
|
||||||
|
iden.addWallet(w);
|
||||||
|
iden.verifyChecksum = sinon.stub().yields(null, false);
|
||||||
|
iden.deleteWallet('32', function(err) {
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return an error because of removeItem ', function(done) {
|
||||||
|
iden.addWallet(w);
|
||||||
|
iden.storage.getItem = sinon.stub().yields(null, JSON.stringify(iden));
|
||||||
|
iden.storage.removeItem = sinon.stub().yields('error', JSON.stringify(iden));
|
||||||
|
iden.deleteWallet('32', function(err) {
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -690,6 +920,58 @@ describe('Identity model', function() {
|
||||||
});
|
});
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
describe('#bindWallet', function() {
|
||||||
|
var opts = {
|
||||||
|
secret: '8WtTuiFTkhP5ao7AF2QErSwV39Cbur6pdMebKzQXFqL59RscXM',
|
||||||
|
nickname: 'test',
|
||||||
|
password: 'pass'
|
||||||
|
};
|
||||||
|
var iden = null;
|
||||||
|
var args = null;
|
||||||
|
var net = null;
|
||||||
|
|
||||||
|
beforeEach(function() {
|
||||||
|
args = createIdentity();
|
||||||
|
args.params.Async = net = sinon.stub();
|
||||||
|
net.cleanUp = sinon.spy();
|
||||||
|
net.on = sinon.stub();
|
||||||
|
net.start = sinon.spy();
|
||||||
|
var old = Identity.prototype.createWallet;
|
||||||
|
Identity.create(args.params, function(err, res) {
|
||||||
|
iden = res;
|
||||||
|
iden.store.restore();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should bindWallet', function() {
|
||||||
|
var net = sinon.stub();
|
||||||
|
|
||||||
|
net.greet = sinon.stub();
|
||||||
|
net.cleanUp = sinon.stub();
|
||||||
|
net.start = sinon.stub().yields(null);
|
||||||
|
net.on = sinon.stub();
|
||||||
|
net.on.withArgs('data').yields('senderId', {
|
||||||
|
type: 'walletId',
|
||||||
|
networkName: 'aWeirdNetworkName',
|
||||||
|
opts: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
opts.privHex = undefined;
|
||||||
|
opts.Async = net;
|
||||||
|
|
||||||
|
var w = {
|
||||||
|
on: sinon.stub(),
|
||||||
|
getId: sinon.stub().returns('1'),
|
||||||
|
getName: sinon.stub().returns('wName')
|
||||||
|
}
|
||||||
|
iden.getWalletById = sinon.stub().returns(true);
|
||||||
|
iden.emitAndKeepAlive = sinon.spy();
|
||||||
|
iden.bindWallet(w);
|
||||||
|
iden.emitAndKeepAlive.calledOnce.should.be.true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
describe('#joinWallet', function() {
|
describe('#joinWallet', function() {
|
||||||
var opts = {
|
var opts = {
|
||||||
secret: '8WtTuiFTkhP5ao7AF2QErSwV39Cbur6pdMebKzQXFqL59RscXM',
|
secret: '8WtTuiFTkhP5ao7AF2QErSwV39Cbur6pdMebKzQXFqL59RscXM',
|
||||||
|
@ -734,6 +1016,28 @@ describe('Identity model', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should yield bad secret', function(done) {
|
||||||
|
var net = sinon.stub();
|
||||||
|
|
||||||
|
net.greet = sinon.stub();
|
||||||
|
net.cleanUp = sinon.stub();
|
||||||
|
net.start = sinon.stub().yields(null);
|
||||||
|
net.on = sinon.stub();
|
||||||
|
net.on.withArgs('data').yields('senderId', {
|
||||||
|
type: 'walletId',
|
||||||
|
networkName: 'testnet',
|
||||||
|
opts: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
opts.privHex = undefined;
|
||||||
|
opts.Async = net;
|
||||||
|
iden.decodeSecret = sinon.stub().returns(false);
|
||||||
|
iden.joinWallet(opts, function(err, w) {
|
||||||
|
err.should.equal('badSecret');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
it('should callback with a join error in case of a problem', function(done) {
|
it('should callback with a join error in case of a problem', function(done) {
|
||||||
opts.privHex = undefined;
|
opts.privHex = undefined;
|
||||||
|
@ -1267,6 +1571,47 @@ describe('Identity model', function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
describe('readAndBindWallet', function(done) {
|
||||||
|
var opts;
|
||||||
|
var storage = sinon.stub();
|
||||||
|
beforeEach(function() {
|
||||||
|
|
||||||
|
storage.setCredentials = sinon.stub();
|
||||||
|
storage.getItem = sinon.stub().yields({});
|
||||||
|
|
||||||
|
|
||||||
|
opts = {
|
||||||
|
email: 'test@test.com',
|
||||||
|
password: '123',
|
||||||
|
network: {
|
||||||
|
testnet: {
|
||||||
|
url: 'https://test-insight.bitpay.com:443'
|
||||||
|
},
|
||||||
|
livenet: {
|
||||||
|
url: 'https://insight.bitpay.com:443'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
storage: storage,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
it('should throw error', function(done) {
|
||||||
|
var iden = new Identity(opts);
|
||||||
|
iden.retrieveWalletFromStorage = sinon.stub().yields('error');
|
||||||
|
iden.readAndBindWallet('1', function(err) {
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('should call addWallet', function(done) {
|
||||||
|
var iden = new Identity(opts);
|
||||||
|
iden.retrieveWalletFromStorage = sinon.stub().yields(null);
|
||||||
|
iden.addWallet = sinon.spy();
|
||||||
|
iden.bindWallet = sinon.spy();
|
||||||
|
iden.readAndBindWallet('1', function(err) {
|
||||||
|
iden.addWallet.callCount.should.be.equal(1);
|
||||||
|
iden.bindWallet.callCount.should.be.equal(1);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -349,9 +349,6 @@ describe('TxProposal', function() {
|
||||||
Buffer.isBuffer(info.script.getBuffer()).should.equal(true);
|
Buffer.isBuffer(info.script.getBuffer()).should.equal(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
it('#getSignersPubKeys', function() {
|
it('#getSignersPubKeys', function() {
|
||||||
var txp = dummyProposal();
|
var txp = dummyProposal();
|
||||||
var pubkeys = txp.getSignersPubKeys();
|
var pubkeys = txp.getSignersPubKeys();
|
||||||
|
@ -431,6 +428,17 @@ describe('TxProposal', function() {
|
||||||
it('OK', function() {
|
it('OK', function() {
|
||||||
dummyProposal({})._check();
|
dummyProposal({})._check();
|
||||||
});
|
});
|
||||||
|
it('FAIL Invalid tx proposal', function() {
|
||||||
|
var txp = dummyProposal();
|
||||||
|
var old = txp.builder.signhash;
|
||||||
|
txp.builder.signhash = 'ppp';
|
||||||
|
(function() {
|
||||||
|
txp._check();
|
||||||
|
}).should.throw('Invalid tx proposal');
|
||||||
|
|
||||||
|
txp.builder.signhash = old;
|
||||||
|
});
|
||||||
|
|
||||||
it('FAIL ins', function() {
|
it('FAIL ins', function() {
|
||||||
(function() {
|
(function() {
|
||||||
dummyProposal({
|
dummyProposal({
|
||||||
|
@ -438,6 +446,24 @@ describe('TxProposal', function() {
|
||||||
})._check();
|
})._check();
|
||||||
}).should.throw('no ins');
|
}).should.throw('no ins');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('FAIL txp too big ', function() {
|
||||||
|
var txp = dummyProposal();
|
||||||
|
var old_builder = txp.builder.build;
|
||||||
|
|
||||||
|
var tx = {
|
||||||
|
getSize: function() {
|
||||||
|
return 90000;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
txp.builder.build = sinon.stub().returns(tx);;
|
||||||
|
(function() {
|
||||||
|
txp._check();
|
||||||
|
}).should.throw('BIG: Invalid TX proposal. Too big');
|
||||||
|
txp.builder.build = old_builder;
|
||||||
|
});
|
||||||
|
|
||||||
it('FAIL signhash SINGLE', function() {
|
it('FAIL signhash SINGLE', function() {
|
||||||
var txp = dummyProposal({
|
var txp = dummyProposal({
|
||||||
hashtype: Transaction.SIGHASH_SINGLE
|
hashtype: Transaction.SIGHASH_SINGLE
|
||||||
|
@ -519,12 +545,29 @@ describe('TxProposal', function() {
|
||||||
txp.addMerchantData(md);
|
txp.addMerchantData(md);
|
||||||
}).should.throw('outputs');
|
}).should.throw('outputs');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('NOK OUTS (case 3)', function() {
|
it('NOK OUTS (case 3)', function() {
|
||||||
md.outs = [{}, {}];
|
md.outs = [{}, {}];
|
||||||
(function() {
|
(function() {
|
||||||
txp.addMerchantData(md);
|
txp.addMerchantData(md);
|
||||||
}).should.throw('outputs');
|
}).should.throw('outputs');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('NOK OUTS (case 4)', function() {
|
||||||
|
txp.builder.vanilla.outs = '[1,2]';
|
||||||
|
txp.merchant = {};
|
||||||
|
txp.paymentProtocolURL = txp.merchant.request_url;
|
||||||
|
txp.merchant.total = 1;
|
||||||
|
txp.merchant.outs = [{
|
||||||
|
amountSatStr: '1',
|
||||||
|
address: '2NDJbzwzsmRgD2o5HHXPhuq5g6tkKTjYkd6'
|
||||||
|
}];
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
txp._checkPayPro();
|
||||||
|
}).should.throw('Wrong outs in Tx');
|
||||||
|
});
|
||||||
|
|
||||||
it('NOK Amount', function() {
|
it('NOK Amount', function() {
|
||||||
md.total = undefined;
|
md.total = undefined;
|
||||||
(function() {
|
(function() {
|
||||||
|
@ -688,7 +731,7 @@ describe('TxProposal', function() {
|
||||||
txp.creator.should.equal('creator');
|
txp.creator.should.equal('creator');
|
||||||
txp.createdTs.should.gte(ts);
|
txp.createdTs.should.gte(ts);
|
||||||
txp.seenBy['creator'].should.equal(txp.createdTs);
|
txp.seenBy['creator'].should.equal(txp.createdTs);
|
||||||
})
|
});
|
||||||
it("New tx should have only 1 signature", function() {
|
it("New tx should have only 1 signature", function() {
|
||||||
var txp = dummyProposal();
|
var txp = dummyProposal();
|
||||||
var ts = Date.now();
|
var ts = Date.now();
|
||||||
|
@ -705,7 +748,7 @@ describe('TxProposal', function() {
|
||||||
'creator2': 1
|
'creator2': 1
|
||||||
});
|
});
|
||||||
}).should.throw('only 1');
|
}).should.throw('only 1');
|
||||||
})
|
});
|
||||||
|
|
||||||
it("if signed, should not change ts", function() {
|
it("if signed, should not change ts", function() {
|
||||||
var txp = dummyProposal();
|
var txp = dummyProposal();
|
||||||
|
@ -724,7 +767,8 @@ describe('TxProposal', function() {
|
||||||
txp.creator.should.equal('creator');
|
txp.creator.should.equal('creator');
|
||||||
txp.signedBy['creator'].should.equal(1);
|
txp.signedBy['creator'].should.equal(1);
|
||||||
txp.signedBy['pepe'].should.gte(ts);
|
txp.signedBy['pepe'].should.gte(ts);
|
||||||
})
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -2081,12 +2081,12 @@ describe('Wallet model', function() {
|
||||||
o.type.should.equal('publicKeyRing');
|
o.type.should.equal('publicKeyRing');
|
||||||
});
|
});
|
||||||
|
|
||||||
// For some unknown reason this test times out on
|
|
||||||
// the Travis server, so we skip it for now.
|
it('should lock incomming connections', function() {
|
||||||
it.skip('should lock incomming connections', function() {
|
|
||||||
var obj = JSON.parse(pkr);
|
var obj = JSON.parse(pkr);
|
||||||
sinon.stub(w.network, 'send').returns();
|
sinon.stub(w, 'subscribeToAddresses').returns();
|
||||||
sinon.stub(w.network, 'lockIncommingConnections').returns();
|
sinon.stub(w, '_lockIncomming').returns();
|
||||||
|
sinon.stub(w, 'emitAndKeepAlive').returns();
|
||||||
|
|
||||||
obj.requiredCopayers = 3;
|
obj.requiredCopayers = 3;
|
||||||
obj.totalCopayers = 5;
|
obj.totalCopayers = 5;
|
||||||
|
@ -2096,8 +2096,10 @@ describe('Wallet model', function() {
|
||||||
w._onPublicKeyRing('sender', {
|
w._onPublicKeyRing('sender', {
|
||||||
publicKeyRing: obj,
|
publicKeyRing: obj,
|
||||||
});
|
});
|
||||||
w.network.send.calledOnce.should.equal(false); // wasComplete
|
w.subscribeToAddresses.calledOnce.should.equal(true);
|
||||||
w.network.lockIncommingConnections.calledOnce.should.equal(true);
|
w._lockIncomming.calledOnce.should.equal(true);
|
||||||
|
w.emitAndKeepAlive.calledOnce.should.equal(true);
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -291,6 +291,7 @@ describe('Insight model', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
describe('getActivity', function() {
|
describe('getActivity', function() {
|
||||||
it('should get activity for an innactive address', function(done) {
|
it('should get activity for an innactive address', function(done) {
|
||||||
var blockchain = new Insight(FAKE_OPTS);
|
var blockchain = new Insight(FAKE_OPTS);
|
||||||
|
@ -309,6 +310,19 @@ describe('Insight model', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should not get activity because of error', function(done) {
|
||||||
|
var blockchain = new Insight(FAKE_OPTS);
|
||||||
|
|
||||||
|
sinon.stub(blockchain, "getTransactions", function(addresses, from, to, cb) {
|
||||||
|
cb('error', []);
|
||||||
|
});
|
||||||
|
|
||||||
|
blockchain.getActivity(ADDRESSES, function(err, actives) {
|
||||||
|
chai.expect(err).to.be.not.null;
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('should get activity for active addresses', function(done) {
|
it('should get activity for active addresses', function(done) {
|
||||||
var blockchain = new Insight(FAKE_OPTS);
|
var blockchain = new Insight(FAKE_OPTS);
|
||||||
|
|
||||||
|
|
|
@ -138,6 +138,59 @@ describe('Network / Async', function() {
|
||||||
n2._deletePeer.calledOnce.should.equal(false);
|
n2._deletePeer.calledOnce.should.equal(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should ignore messages', function() {
|
||||||
|
var n1 = createN(pk1);
|
||||||
|
var n2 = createN(pk2);
|
||||||
|
n2._deletePeer = sinon.spy();
|
||||||
|
|
||||||
|
var message = {
|
||||||
|
type: 'hello',
|
||||||
|
copayerId: cid1,
|
||||||
|
secretNumber: 'mySecret',
|
||||||
|
ts: 1
|
||||||
|
};
|
||||||
|
var enc = n1.encode(cid2, message);
|
||||||
|
|
||||||
|
enc.ts = 1;
|
||||||
|
n2.ignoreMessageFromTs = 1;
|
||||||
|
n2._onMessage(enc);
|
||||||
|
n2._deletePeer.calledOnce.should.equal(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('should delete peer if copayer does not belong', function() {
|
||||||
|
var n1 = createN(pk1);
|
||||||
|
var n2 = createN(pk2);
|
||||||
|
n2.lockIncommingConnections([cid3]);
|
||||||
|
n2._deletePeer = sinon.spy();
|
||||||
|
|
||||||
|
var message = {
|
||||||
|
type: 'hello',
|
||||||
|
copayerId: cid1,
|
||||||
|
secretNumber: 'mySecret',
|
||||||
|
};
|
||||||
|
var enc = n1.encode(cid2, message);
|
||||||
|
|
||||||
|
n2._onMessage(enc);
|
||||||
|
n2._deletePeer.calledOnce.should.equal(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should emit data', function() {
|
||||||
|
var n1 = createN(pk1);
|
||||||
|
var n2 = createN(pk2);
|
||||||
|
n2.emit = sinon.spy();
|
||||||
|
|
||||||
|
var message = {
|
||||||
|
type: 'helloxxx',
|
||||||
|
copayerId: cid1,
|
||||||
|
secretNumber: 'mySecret',
|
||||||
|
};
|
||||||
|
var enc = n1.encode(cid2, message);
|
||||||
|
|
||||||
|
n2._onMessage(enc);
|
||||||
|
n2.emit.calledOnce.should.equal(true);
|
||||||
|
});
|
||||||
|
|
||||||
it('should reject data sent from a peer with hijacked pubkey', function() {
|
it('should reject data sent from a peer with hijacked pubkey', function() {
|
||||||
var n = createN(pk2);
|
var n = createN(pk2);
|
||||||
|
|
||||||
|
@ -396,6 +449,13 @@ describe('Network / Async', function() {
|
||||||
var n = createN();
|
var n = createN();
|
||||||
n.getCopayerIds().length.should.be.equal(1);
|
n.getCopayerIds().length.should.be.equal(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return the allowed copayer ids', function() {
|
||||||
|
var n = createN();
|
||||||
|
var lockIds = ['abc001', 'abc002'];
|
||||||
|
n.lockIncommingConnections(lockIds);
|
||||||
|
n.getCopayerIds().length.should.be.equal(2);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#isOnline', function() {
|
describe('#isOnline', function() {
|
||||||
|
@ -449,4 +509,41 @@ describe('Network / Async', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#_onError', function() {
|
||||||
|
it('should set criticalError ', function() {
|
||||||
|
var n = createN();
|
||||||
|
expect(n.criticalError).to.be.undefined;
|
||||||
|
var myError = {
|
||||||
|
message: 'Some error'
|
||||||
|
};
|
||||||
|
n._onError(myError);
|
||||||
|
n.criticalError.should.be.equal('Some error');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#_setInboundPeerAuth', function() {
|
||||||
|
it('should set isInboundPeerAuth ', function() {
|
||||||
|
var n = createN();
|
||||||
|
expect(n.isInboundPeerAuth['1']).to.be.undefined;
|
||||||
|
|
||||||
|
n._setInboundPeerAuth('1');
|
||||||
|
n.isInboundPeerAuth['1'].should.be.true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#start', function() {
|
||||||
|
it('should not start ', function(done) {
|
||||||
|
var n = createN();
|
||||||
|
var opts = {
|
||||||
|
privkey: 'fb23b9074ca5e7163719b86b41c7ce8348cf3d2839bb5f6125ef6efd5d40d7d3',
|
||||||
|
copayerId: '0311a10109320efb3646c832d3e140c6d9c4f69b16e73fc3f0c23b3d014ec77828'
|
||||||
|
};
|
||||||
|
n.started = 1;
|
||||||
|
|
||||||
|
n.start(opts, function() {
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue