Merge pull request #2298 from matiaspando/increaseCoverage85

Increase coverage to 83%
This commit is contained in:
Matias Alejo Garcia 2015-01-16 10:07:14 -03:00
commit 93b0a484c8
9 changed files with 423 additions and 81 deletions

View File

@ -19,7 +19,7 @@ angular.module('copayApp.controllers').controller('ReceiveController',
$scope.showAll = false;
var w = $rootScope.wallet;
var lastAddr = _.first(w.getAddressesOrderer());
var lastAddr = _.first(w.getAddressesOrdered());
var balance = w.balanceInfo.balanceByAddr;
$scope.setAddressList();

View File

@ -507,7 +507,7 @@ Identity.prototype.importWalletFromObj = function(obj, opts, cb) {
log.debug('Updating Indexes for wallet:' + w.getName());
w.updateIndexes(function(err) {
log.debug('Adding wallet to profile:' + w.getName());
self.storeWallet(w, function (err) {
self.storeWallet(w, function(err) {
if (err) return cb(err);
self.addWallet(w);

View File

@ -14,8 +14,8 @@ var log = require('../util/log.js');
/*
This class lets interfaces with the blockchain, making general queries and
subscribing to transactions on adressess and blocks.
This class lets interface with the blockchain, making general queries and
subscribing to transactions on addresses and blocks.
Opts:
- url

View File

@ -540,13 +540,13 @@ PublicKeyRing.prototype.getAddresses = function() {
};
/**
* getAddressesOrderer
* {@link Wallet#getAddressesOrderer}
* getAddressesOrdered
* {@link Wallet#getAddressesOrdered}
*
* @param pubkey
* @return {string[]}
*/
PublicKeyRing.prototype.getAddressesOrderer = function(pubkey) {
PublicKeyRing.prototype.getAddressesOrdered = function(pubkey) {
this._checkCache();
var info = _.map(this.cache.addressToPath, function(path, addr) {
@ -559,9 +559,7 @@ PublicKeyRing.prototype.getAddressesOrderer = function(pubkey) {
var l = info.length;
var sortedInfo = _.sortBy(info, function(i) {
var goodness = ( (i.copayerIndex !== copayerIndex) ? 2 * l : 0 )
+ ( i.isChange ? l : 0 )
+ l - i.addressIndex;
var goodness = ((i.copayerIndex !== copayerIndex) ? 2 * l : 0) + (i.isChange ? l : 0) + l - i.addressIndex;
return goodness;
});

View File

@ -2062,13 +2062,13 @@ Wallet.prototype.getAddresses = function() {
/**
* @desc gets the list of addresses, orderder for the caller:
* @desc gets the list of addresses, ordered for the caller:
* 1) himselfs first
* 2) receive address first
* 3) last created first
*/
Wallet.prototype.getAddressesOrderer = function() {
return this.publicKeyRing.getAddressesOrderer(this.publicKey);
Wallet.prototype.getAddressesOrdered = function() {
return this.publicKeyRing.getAddressesOrdered(this.publicKey);
};
/**

View File

@ -146,28 +146,63 @@ describe('Identity model', function() {
});
describe('#open', function(done) {
it.skip('should return last focused wallet', function(done) {
var wallets = [{
id: 'wallet1',
store: sinon.stub().yields(null),
netStart: sinon.stub(),
}, {
id: 'wallet2',
store: sinon.stub().yields(null),
netStart: sinon.stub(),
}, {
id: 'wallet3',
store: sinon.stub().yields(null),
netStart: sinon.stub(),
}];
var args = createIdentity();
Identity.create(args.params, function(err, identity) {
// TODO: Add checks for what is this testing
it('should open a profile', 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, JSON.stringify(iden));
Identity.open(opts, function(err, res) {
should.not.exist(err);
should.exist(res);
res.should.be.deep.equal(iden);
done();
});
});
});
describe('#resendVerificationEmail', function(done) {
it('should resend verification email', function() {
var storage = sinon.stub();
storage.setCredentials = sinon.stub();
storage.resendVerificationEmail = sinon.stub().yields();
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);
iden.resendVerificationEmail(function() {});
storage.resendVerificationEmail.calledOnce.should.be.true;
});
});
describe('#openWallets', function(done) {
it('should emit noWallets', function() {
@ -179,6 +214,57 @@ describe('Identity model', function() {
});
});
describe('#setBackupNeeded', function(done) {
it('should set the flag backupNeeded to true', function() {
var iden = new Identity(getDefaultParams());
iden.verifyChecksum = sinon.stub().yields(null, true);
iden.setBackupNeeded(true);
iden.backupNeeded.should.be.true;
iden.store.calledOnce.should.be.true;
iden.store.getCall(0).args[0].noWallets.should.equal(true);
});
it('should set the flag backupNeeded to false', function() {
var iden = new Identity(getDefaultParams());
iden.verifyChecksum = sinon.stub().yields(null, true);
iden.setBackupNeeded(false);
iden.backupNeeded.should.be.false;
iden.store.calledOnce.should.be.true;
iden.store.getCall(0).args[0].noWallets.should.equal(true);
});
});
describe('#close', function(done) {
it('should store profile', function(done) {
var iden = new Identity(getDefaultParams());
sinon.spy(iden, 'emitAndKeepAlive');
sinon.spy(iden, '_cleanUp');
iden.verifyChecksum = sinon.stub().yields(null, true);
iden.close(function() {
iden._cleanUp.calledOnce.should.be.true;
iden.emitAndKeepAlive.calledOnce.should.be.true;
iden.emitAndKeepAlive.getCall(0).args[0].should.equal('closed');
iden.store.calledOnce.should.be.true;
iden.store.getCall(0).args[0].noWallets.should.equal(true);
done();
});
});
it('should not store profile when out of sync', function(done) {
var iden = new Identity(getDefaultParams());
sinon.spy(iden, 'emitAndKeepAlive');
sinon.spy(iden, '_cleanUp');
iden.verifyChecksum = sinon.stub().yields(null, false);
iden.close(function() {
iden._cleanUp.calledOnce.should.be.true;
iden.emitAndKeepAlive.calledOnce.should.be.true;
iden.emitAndKeepAlive.getCall(0).args[0].should.equal('closed');
iden.store.calledOnce.should.be.false;
done();
});
});
});
describe('#remove', function(done) {
it('should remove empty profile', function(done) {
var storage = sinon.stub();
@ -421,8 +507,6 @@ describe('Identity model', function() {
});
describe('#retrieveWalletFromStorage', function() {
it('should return wallet', function(done) {
var args = createIdentity();
args.storage.getItem.onFirstCall().callsArgWith(1, null, '{"wallet": "fakeData"}');
@ -446,6 +530,56 @@ describe('Identity model', function() {
});
});
describe('#importWalletFromObj', function() {
it('should import a wallet, call the right encryption functions', function(done) {
var args = createIdentity();
args.storage.getItem.onFirstCall().callsArgWith(1, null, '{"wallet": "fakeData"}');
var backup = Wallet.fromUntrustedObj;
args.params.noWallets = true;
sinon.stub().returns(args.wallet);
var fakeCrypto = {
kdf: sinon.stub().returns('passphrase'),
decrypt: sinon.stub().returns('{"walletId":123}'),
};
function getNewWallet2(args) {
var w = sinon.stub();
w.getId = sinon.stub().returns('wid1');
w.getStorageKey = sinon.stub().returns('wkey');
w.toObj = sinon.stub().returns({
obj: 1
});
w.getName = sinon.stub().returns('name');
w.setVersion = sinon.stub();
w.on = sinon.stub();
w.netStart = sinon.stub();
w.updateIndexes = sinon.stub().yields(null),
w.args = args;
return w;
}
var opts = {
importWallet: sinon.stub().returns(getNewWallet2()),
cryptoUtil: fakeCrypto,
};
Identity.create(args.params, function(err, iden) {
iden.importWalletFromObj(getNewWallet2(), opts, function(err) {
should.not.exist(err);
iden.store.restore();
done();
});
});
});
});
// This is implemented in Compatibility
describe.skip('#importWallet', function() {
it('should import a wallet, call the right encryption functions', function(done) {
@ -480,6 +614,60 @@ describe('Identity model', function() {
});
describe('#deleteWallet', function() {
var iden, w;
beforeEach(function() {
var storage = sinon.stub();
storage.setCredentials = sinon.stub();
storage.removeItem = sinon.stub().yields(null);
storage.clear = sinon.stub().yields();
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,
};
iden = new Identity(opts);
w = {
getId: sinon.stub().returns('32'),
getName: sinon.stub().returns('treintaydos'),
close: sinon.stub(),
};
});
it('should not save other wallets', function(done) {
iden.addWallet(w);
iden.storage.getItem = sinon.stub().yields(null, JSON.stringify(iden));
iden.deleteWallet('32', function(err) {
iden.walletIds.should.deep.equal([]);
should.not.exist(_.find(iden.getWallets(), function(w) {
return w.getName() == 'treintaydos';
}));
iden.store.calledOnce.should.be.true;
iden.store.getCall(0).args[0].noWallets.should.equal(true);
done();
});
});
});
describe('#export', function() {
@ -492,12 +680,7 @@ describe('Identity model', function() {
/**
* TODO (eordano): Move this to a different test file
*
describe('#pluginManager', function() {
it('should create a new PluginManager object', function() {
var pm = new PluginManager({plugins: { FakeLocalStorage: true }, pluginsPath: '../../test/mocks/'});
should.exist(pm);
});
});
describe('#Insight', function() {
it('should parse a uri', function() {
@ -623,7 +806,7 @@ describe('Identity model', function() {
describe('add / delete / list Wallets', function() {
var iden, w;
var iden, w, w2;
beforeEach(function() {
var storage = sinon.stub();
storage.setCredentials = sinon.stub();
@ -650,6 +833,12 @@ describe('Identity model', function() {
getName: sinon.stub().returns('treintaydos'),
close: sinon.stub(),
};
w2 = {
getId: sinon.stub().returns('33'),
getName: sinon.stub().returns('treintaytres'),
close: sinon.stub(),
};
});
it('should add wallet', function() {
@ -661,6 +850,48 @@ describe('Identity model', function() {
return w.getName() == 'treintaydos';
}).should.deep.equal(w);
iden.addWallet(w2);
iden.getWalletById('33').getName().should.equal('treintaytres');
iden.walletIds.should.deep.equal(['32', '33']);
});
it('should read and bind wallet', function(done) {
iden.addWallet(w);
iden.storage.getItem = sinon.stub().yields(w, JSON.stringify(iden));
iden.readAndBindWallet('32', function(err) {
iden.getWalletById('32').getName().should.equal('treintaydos');
done();
});
});
it('should open wallet', function() {
iden.addWallet(w);
iden.storage.getItem = sinon.stub().yields(w, JSON.stringify(iden));
iden.readAndBindWallet = sinon.spy();
iden.openWallets();
iden.readAndBindWallet.should.calledOnce;
});
it('should open wallets', function(done) {
var c = 0;
var old = iden.readAndBindWallet;
iden.addWallet(w);
iden.addWallet(w2);
iden.readAndBindWallet = function(wid, myFunction) {
c++;
if (c == 2) {
iden.readAndBindWallet = old;
done();
}
myFunction();
};
iden.openWallets();
});
it('should not add same wallet twice', function() {
@ -831,7 +1062,7 @@ describe('Identity model', function() {
});
it('should return indefined', function() {
it('should return undefined', function() {
expect(iden.getLastFocusedWalletId()).to.be.undefined;
});
@ -891,9 +1122,57 @@ describe('Identity model', function() {
expect(err).to.be.null;
iden.should.not.be.null;
});
});
});
describe('importFromEncryptedFullJson', function() {
var opts;
beforeEach(function() {
var storage = sinon.stub();
storage.setCredentials = sinon.stub();
storage.removeItem = sinon.stub().yields(null);
storage.clear = sinon.stub().yields();
var fakeCrypto = {
kdf: sinon.stub().returns('passphrase'),
decrypt: sinon.stub().returns('{"walletId":123}'),
};
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,
cryptoUtil: fakeCrypto,
};
});
it('should throw error because json is wrong', function() {
Identity.importFromEncryptedFullJson('asdfg', '1', {}, function(c) {
c.should.be.equal('BADSTR');
});
});
it('should throw error because json does not have required fields', function() {
Identity.importFromEncryptedFullJson('{"age":23}', '1', {}, function(c) {
c.should.be.equal('BADSTR');
});
});
it('should create a profile', function() {
var json = '{"networkOpts":{"livenet":{"url":"https://insight.bitpay.com:443","transports":["polling"]},"testnet":{"url":"https://test-insight.bitpay.com:443","transports":["polling"]}},"blockchainOpts":{"livenet":{"url":"https://insight.bitpay.com:443","transports":["polling"]},"testnet":{"url":"https://test-insight.bitpay.com:443","transports":["polling"]}},"fullName":"l@l","email":"l@l","password":"1","storage":{"type":"DB","storeUrl":"https://insight.bitpay.com:443/api/email","iterations":1000,"salt":"jBbYTj8zTrOt6V","email":"l@l","password":"1","_cachedKey":"y4a352k6sM15gGag+PgQwXRdFjzi0yX6aLEGttWaeP+kbU7JeSPDUfbhhzonnQRUicJu/1IMWgDZbDJjWmrKgA=="},"walletDefaults":{"requiredCopayers":2,"totalCopayers":3,"spendUnconfirmed":true,"reconnectDelay":5000,"idleDurationMin":4,"settings":{"unitName":"bits","unitToSatoshi":100,"unitDecimals":2,"alternativeName":"US Dollar","alternativeIsoCode":"USD"}},"version":"0.8.2","walletIds":["15a3ecd34dfb7000","59220d2110461861","bfd6adad419078d9","893dc0c0a776648b","e8ee7218c6ea7f93"],"wallets":{},"focusedTimestamps":{"15a3ecd34dfb7000":1418916813711,"bfd6adad419078d9":1418835855887,"e8ee7218c6ea7f93":1418775999995,"59220d2110461861":1418835858871,"893dc0c0a776648b":1418835763680},"backupNeeded":true,"_events":{}}';
opts.cryptoUtil.decrypt = sinon.stub().returns(json);
Identity.importFromEncryptedFullJson(json, '1', opts, function(err, iden) {
expect(err).to.be.null;
iden.should.not.be.null;
});
});
});
describe('#closeWallet', function() {

View File

@ -137,7 +137,7 @@ describe('PublicKeyRing model', function() {
[true, false].forEach(function(isChange) {
for (var i = 0; i < 2; i++) {
var aStr = w.generateAddress(isChange, k.pub);
var a= new bitcore.Address(aStr);
var a = new bitcore.Address(aStr);
a.isValid().should.equal(true);
a.isScript().should.equal(true);
a.network().name.should.equal('livenet');
@ -161,8 +161,8 @@ describe('PublicKeyRing model', function() {
var setup = getCachedW();
var pubkeyring = setup.w;
var address = pubkeyring.generateAddress(false, setup.pub);
_.indexOf(pubkeyring.getReceiveAddresses(),address).should.be.above(-1);
_.indexOf(pubkeyring.getAddresses(),address).should.be.above(-1);
_.indexOf(pubkeyring.getReceiveAddresses(), address).should.be.above(-1);
_.indexOf(pubkeyring.getAddresses(), address).should.be.above(-1);
});
@ -170,8 +170,8 @@ describe('PublicKeyRing model', function() {
var setup = getCachedW();
var pubkeyring = setup.w;
var address = pubkeyring.generateAddress(true, setup.pub);
_.indexOf(pubkeyring.getReceiveAddresses(),address).should.be.equal(-1);
_.indexOf(pubkeyring.getAddresses(),address).should.be.above(-1);
_.indexOf(pubkeyring.getReceiveAddresses(), address).should.be.equal(-1);
_.indexOf(pubkeyring.getAddresses(), address).should.be.above(-1);
});
it('should generate one address by default', function() {
@ -179,6 +179,8 @@ describe('PublicKeyRing model', function() {
var w = k.w;
var a = w.getAddresses();
a.length.should.equal(1);
var b = w.getAddressesOrdered();
b.length.should.equal(1);
});
it('should generate one address by default', function() {
@ -190,7 +192,7 @@ describe('PublicKeyRing model', function() {
a = w.getAddresses();
a.length.should.equal(1);
});
it('should generate 4+1 addresses', function() {
var k = createW();
@ -546,6 +548,10 @@ describe('PublicKeyRing model', function() {
ret.pubKeys[1].length.should.equal(5);
});
it('#myCopayerId should return first copayerId ', function() {
var w = getCachedW().w;
w.myCopayerId().should.be.equal(w.getCopayerId(0));
});
});

View File

@ -77,6 +77,7 @@ describe('Wallet model', function() {
it('should getNetworkName', function() {
var w = cachedCreateW();
w.getNetworkName().should.equal('testnet');
w.isTestnet().should.be.true;
});
@ -155,6 +156,7 @@ describe('Wallet model', function() {
var w = cachedCreateW();
should.exist(w);
w.publicKeyRing.walletId.should.equal(w.id);
w.getId().should.equal(w.id);
w.txProposals.walletId.should.equal(w.id);
w.requiredCopayers.should.equal(3);
should.exist(w.id);
@ -318,6 +320,7 @@ describe('Wallet model', function() {
var w = cachedCreateW2();
unSpentTestFromWallet(unspentTest[0], w.publicKeyRing.generateAddress(true));
var txp = w._createTxProposal(
'mgGJEugdPnvhmRuFdbdQcFfoFLc1XXeB79',
'123456789',
@ -325,11 +328,13 @@ describe('Wallet model', function() {
unspentTest
);
w.addSeenToTxProposals().should.be.false;
Object.keys(txp.getSignersPubKeys()).length.should.equal(1);
var tx = txp.builder.build();
should.exist(tx);
chai.expect(txp.comment).to.be.null;
tx.isComplete().should.equal(false);
w.addSeenToTxProposals().should.be.false;
Object.keys(txp.seenBy).length.should.equal(1);
Object.keys(txp.signedBy).length.should.equal(1);
});
@ -379,6 +384,14 @@ describe('Wallet model', function() {
wallet.addressIsOwn('mgtUfP9sTJ6vPLoBxZLPEccGpcjNVryaCX').should.equal(false);
});
it('#getAddressesOrdered', function() {
var wallet = cachedCreateW2();
var allAddresses = wallet.getAddressesOrdered();
for (var i = 0; i < allAddresses.length; i++) {
wallet.addressIsOwn(allAddresses[i]).should.equal(true);
}
});
it('#create. Signing with derivate keys', function() {
var w = cachedCreateW2();
@ -760,7 +773,7 @@ describe('Wallet model', function() {
});
it('should exportEncrypted', function() {
it('should exportEncrypted ', function() {
var w = createW2();
var enc = w.exportEncrypted('', {});
enc.length.should.equal(2405);
@ -874,7 +887,9 @@ describe('Wallet model', function() {
}, function(err, ntxid) {
var s = sinon.stub(w, 'getMyCopayerId').returns('213');
Object.keys(w.txProposals.get(ntxid).rejectedBy).length.should.equal(0);
w.addSeenToTxProposals().should.be.true;
w.reject(ntxid);
Object.keys(w.txProposals.get(ntxid).rejectedBy).length.should.equal(1);
w.txProposals.get(ntxid).rejectedBy['213'].should.gt(1);
s.restore();
@ -2053,6 +2068,15 @@ describe('Wallet model', function() {
payload.walletId.should.equal(w.id);
payload.txProposal.should.deep.equal(txp.toObjTrim());
});
it('should be able to sendAllTxProposals since ', function() {
w.txProposals.add(txp);
w.sendAllTxProposals(null, txp.createdTs);
w.network.send.calledOnce.should.equal(true);
var payload = w.network.send.getCall(0).args[1];
payload.type.should.equal('txProposal');
payload.walletId.should.equal(w.id);
payload.txProposal.should.deep.equal(txp.toObjTrim());
});
it('should be able to sendSignature', function() {
w.txProposals.add(txp);
w.sendSignature(txp.getId());
@ -2541,7 +2565,6 @@ describe('Wallet model', function() {
});
});
// TODO
describe.skip('#onPayProPaymentAck', function() {
it('should emit', function() {

View File

@ -128,8 +128,12 @@ describe('Insight model', function() {
sinon.stub(blockchain, "requestPost", function(url, data, cb) {
url.should.be.equal('/api/tx/send');
var res = {statusCode: 200};
var body = {txid: 1234};
var res = {
statusCode: 200
};
var body = {
txid: 1234
};
setTimeout(function() {
cb(null, res, body);
}, 0);
@ -145,11 +149,16 @@ describe('Insight model', function() {
it('should get a transaction by id', function(done) {
var blockchain = new Insight(FAKE_OPTS);
var txid = '123321';
var tx = {txid: txid, more: 'something'};
var tx = {
txid: txid,
more: 'something'
};
sinon.stub(blockchain, "request", function(url, cb) {
url.should.be.equal('/api/tx/' + txid);
var res = {statusCode: 200};
var res = {
statusCode: 200
};
var body = JSON.stringify(tx);
setTimeout(function() {
cb(null, res, body);
@ -171,7 +180,9 @@ describe('Insight model', function() {
sinon.stub(blockchain, "request", function(url, cb) {
url.should.be.equal('/api/tx/' + txid);
var res = {statusCode: 404};
var res = {
statusCode: 404
};
var body = '';
setTimeout(function() {
cb(null, res, body);
@ -191,7 +202,9 @@ describe('Insight model', function() {
sinon.stub(blockchain, "request", function(url, cb) {
url.should.be.equal('/api/tx/' + txid);
var res = {statusCode: 200};
var res = {
statusCode: 200
};
var body = null;
setTimeout(function() {
cb(null, res, body);
@ -211,7 +224,9 @@ describe('Insight model', function() {
sinon.stub(blockchain, "request", function(url, cb) {
url.should.be.equal('/api/tx/' + txid);
var res = {statusCode: 200};
var res = {
statusCode: 200
};
var body = null;
setTimeout(function() {
cb(null, res, body);
@ -233,8 +248,13 @@ describe('Insight model', function() {
url.should.be.equal('/api/addrs/txs?from=0');
data.addrs.should.be.equal('2NATQJnaQe2CUKLyhL1zdNkttJM1dUH9HaM,2NE9hTCffeugo5gQtfB4owq98gyTeWC56yb');
setTimeout(function() {
var res = {statusCode: 200};
var body = { totalItems: 3, items: [1, 2, 3] };
var res = {
statusCode: 200
};
var body = {
totalItems: 3,
items: [1, 2, 3]
};
cb(null, res, body);
}, 0);
});
@ -254,7 +274,9 @@ describe('Insight model', function() {
url.should.be.equal('/api/addrs/utxo');
data.addrs.should.be.equal('2NATQJnaQe2CUKLyhL1zdNkttJM1dUH9HaM,2NE9hTCffeugo5gQtfB4owq98gyTeWC56yb,2N9D5bcCQ2bPWUDByQ6Qb5bMgMtgsk1rw3x');
setTimeout(function() {
var res = {statusCode: 200};
var res = {
statusCode: 200
};
var body = UNSPENT;
cb(null, res, body);
}, 0);
@ -292,27 +314,27 @@ describe('Insight model', function() {
sinon.stub(blockchain, "getTransactions", function(addresses, from, to, cb) {
cb(null, [{
vin: [{
addr: '2NATQJnaQe2CUKLyhL1zdNkttJM1dUH9HaM'
}],
vout: []
}, {
vin: [{
addr: '2NATQJnaQe2CUKLyhL1zdNkttJM1dUH9HaM'
}],
vout: []
}, {
vin: [{
addr: '2N9D5bcCQ2bPWUDByQ6Qb5bMgMtgsk1rw3x'
}],
vout: []
}, {
vin: [],
vout: [{
scriptPubKey: {
addresses: ['2NFjCBFZSsxiwWAD7CKQ3hzWFtf9DcqTucY']
}
}]
vin: [{
addr: '2NATQJnaQe2CUKLyhL1zdNkttJM1dUH9HaM'
}],
vout: []
}, {
vin: [{
addr: '2NATQJnaQe2CUKLyhL1zdNkttJM1dUH9HaM'
}],
vout: []
}, {
vin: [{
addr: '2N9D5bcCQ2bPWUDByQ6Qb5bMgMtgsk1rw3x'
}],
vout: []
}, {
vin: [],
vout: [{
scriptPubKey: {
addresses: ['2NFjCBFZSsxiwWAD7CKQ3hzWFtf9DcqTucY']
}
}]
}]);
});
@ -364,7 +386,9 @@ describe('Insight model', function() {
blockchain.on('connect', function() {
var socket = blockchain.getSocket();
socket.emit('2NFjCBFZSsxiwWAD7CKQ3hzWFtf9DcqTucY', '1123');
setTimeout(function() { done(); }, 20);
setTimeout(function() {
done();
}, 20);
});
blockchain.on('tx', function(ev) {
@ -392,5 +416,17 @@ describe('Insight model', function() {
});
});
});
describe('setCompleteUrl', function() {
it('should check setCompleteUrl', function() {
var url;
expect(Insight.setCompleteUrl(url)).to.be.undefined;
url = '';
Insight.setCompleteUrl(url).should.be.equal(url);
url = 'http://mydomain.com';
Insight.setCompleteUrl(url).should.be.equal('http://mydomain.com:80');
url = 'https://mydomain.com';
Insight.setCompleteUrl(url).should.be.equal('https://mydomain.com:443');
});
});
});