Browse Source

support bitcoincash: protocolhandler

master
matiu 7 years ago
parent
commit
fa8e1346e0
  1. 4
      lib/uri.js
  2. 64
      test/uri.js

4
lib/uri.js

@ -110,7 +110,7 @@ URI.isValid = function(arg, knownParams) {
URI.parse = function(uri) { URI.parse = function(uri) {
var info = URL.parse(uri, true); var info = URL.parse(uri, true);
if (info.protocol !== 'bitcoin:') { if (info.protocol !== 'bitcoincash:') {
throw new TypeError('Invalid bitcoin URI'); throw new TypeError('Invalid bitcoin URI');
} }
@ -205,7 +205,7 @@ URI.prototype.toString = function() {
_.extend(query, this.extras); _.extend(query, this.extras);
return URL.format({ return URL.format({
protocol: 'bitcoin:', protocol: 'bitcoincash:',
host: this.address, host: this.address,
query: query query: query
}); });

64
test/uri.js

@ -16,22 +16,22 @@ describe('URI', function() {
URI.parse.bind(URI, 'badURI').should.throw(TypeError); URI.parse.bind(URI, 'badURI').should.throw(TypeError);
uri = URI.parse('bitcoin:'); uri = URI.parse('bitcoincash:');
expect(uri.address).to.be.undefined(); expect(uri.address).to.be.undefined();
expect(uri.amount).to.be.undefined(); expect(uri.amount).to.be.undefined();
expect(uri.otherParam).to.be.undefined(); expect(uri.otherParam).to.be.undefined();
uri = URI.parse('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'); uri = URI.parse('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk');
uri.address.should.equal('CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'); uri.address.should.equal('CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk');
expect(uri.amount).to.be.undefined(); expect(uri.amount).to.be.undefined();
expect(uri.otherParam).to.be.undefined(); expect(uri.otherParam).to.be.undefined();
uri = URI.parse('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=123.22'); uri = URI.parse('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=123.22');
uri.address.should.equal('CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'); uri.address.should.equal('CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk');
uri.amount.should.equal('123.22'); uri.amount.should.equal('123.22');
expect(uri.otherParam).to.be.undefined(); expect(uri.otherParam).to.be.undefined();
uri = URI.parse('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=123.22' + uri = URI.parse('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=123.22' +
'&other-param=something&req-extra=param'); '&other-param=something&req-extra=param');
uri.address.should.equal('CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'); uri.address.should.equal('CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk');
uri.amount.should.equal('123.22'); uri.amount.should.equal('123.22');
@ -41,24 +41,24 @@ describe('URI', function() {
// TODO: Split this and explain tests // TODO: Split this and explain tests
it('URIs can be validated statically (test vector)', function() { it('URIs can be validated statically (test vector)', function() {
URI.isValid('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk').should.equal(true); URI.isValid('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk').should.equal(true);
URI.isValid('bitcoin:mkYY5NRvikVBY1EPtaq9fAFgquesdjqECw').should.equal(true); URI.isValid('bitcoincash:mkYY5NRvikVBY1EPtaq9fAFgquesdjqECw').should.equal(true);
URI.isValid('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.2') URI.isValid('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.2')
.should.equal(true); .should.equal(true);
URI.isValid('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.2&other=param') URI.isValid('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.2&other=param')
.should.equal(true); .should.equal(true);
URI.isValid('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.2&req-other=param', URI.isValid('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.2&req-other=param',
['req-other']).should.equal(true); ['req-other']).should.equal(true);
URI.isValid('bitcoin:mmrqEBJxUCf42vdb3oozZtyz5mKr3Vb2Em?amount=0.1&' + URI.isValid('bitcoincash:mmrqEBJxUCf42vdb3oozZtyz5mKr3Vb2Em?amount=0.1&' +
'r=https%3A%2F%2Ftest.bitpay.com%2Fi%2F6DKgf8cnJC388irbXk5hHu').should.equal(true); 'r=https%3A%2F%2Ftest.bitpay.com%2Fi%2F6DKgf8cnJC388irbXk5hHu').should.equal(true);
URI.isValid('bitcoin:').should.equal(false); URI.isValid('bitcoincash:').should.equal(false);
URI.isValid('bitcoin:badUri').should.equal(false); URI.isValid('bitcoincash:badUri').should.equal(false);
URI.isValid('bitcoin:1DP69gMMvSuYhbnxsi4EJEFufUAbDrEQfk?amount=bad').should.equal(false); URI.isValid('bitcoincash:1DP69gMMvSuYhbnxsi4EJEFufUAbDrEQfk?amount=bad').should.equal(false);
URI.isValid('bitcoin:1DP69gMMvSuYhbnxsi4EJEFufUAbDrEQfk?amount=1.2&req-other=param') URI.isValid('bitcoincash:1DP69gMMvSuYhbnxsi4EJEFufUAbDrEQfk?amount=1.2&req-other=param')
.should.equal(false); .should.equal(false);
URI.isValid('bitcoin:?r=https%3A%2F%2Ftest.bitpay.com%2Fi%2F6DKgf8cnJC388irbXk5hHu') URI.isValid('bitcoincash:?r=https%3A%2F%2Ftest.bitpay.com%2Fi%2F6DKgf8cnJC388irbXk5hHu')
.should.equal(false); .should.equal(false);
}); });
@ -69,7 +69,7 @@ describe('URI', function() {
}); });
it('do not need new keyword', function() { it('do not need new keyword', function() {
var uri = URI('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'); var uri = URI('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk');
uri.should.be.instanceof(URI); uri.should.be.instanceof(URI);
}); });
@ -78,26 +78,26 @@ describe('URI', function() {
var uri; var uri;
it('parses address', function() { it('parses address', function() {
uri = new URI('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'); uri = new URI('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk');
uri.address.should.be.instanceof(bitcore.Address); uri.address.should.be.instanceof(bitcore.Address);
uri.network.should.equal(Networks.livenet); uri.network.should.equal(Networks.livenet);
}); });
it('parses amount', function() { it('parses amount', function() {
uri = URI.fromString('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=123.22'); uri = URI.fromString('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=123.22');
uri.address.toString().should.equal('CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'); uri.address.toString().should.equal('CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk');
uri.amount.should.equal(12322000000); uri.amount.should.equal(12322000000);
expect(uri.otherParam).to.be.undefined(); expect(uri.otherParam).to.be.undefined();
}); });
it('parses a testnet address', function() { it('parses a testnet address', function() {
uri = new URI('bitcoin:mkYY5NRvikVBY1EPtaq9fAFgquesdjqECw'); uri = new URI('bitcoincash:mkYY5NRvikVBY1EPtaq9fAFgquesdjqECw');
uri.address.should.be.instanceof(bitcore.Address); uri.address.should.be.instanceof(bitcore.Address);
uri.network.should.equal(Networks.testnet); uri.network.should.equal(Networks.testnet);
}); });
it('stores unknown parameters as "extras"', function() { it('stores unknown parameters as "extras"', function() {
uri = new URI('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.2&other=param'); uri = new URI('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.2&other=param');
uri.address.should.be.instanceof(bitcore.Address); uri.address.should.be.instanceof(bitcore.Address);
expect(uri.other).to.be.undefined(); expect(uri.other).to.be.undefined();
uri.extras.other.should.equal('param'); uri.extras.other.should.equal('param');
@ -105,12 +105,12 @@ describe('URI', function() {
it('throws error when a required feature is not supported', function() { it('throws error when a required feature is not supported', function() {
(function() { (function() {
return new URI('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.2&other=param&req-required=param'); return new URI('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.2&other=param&req-required=param');
}).should.throw(Error); }).should.throw(Error);
}); });
it('has no false negative when checking supported features', function() { it('has no false negative when checking supported features', function() {
uri = new URI('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.2&other=param&' + uri = new URI('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.2&other=param&' +
'req-required=param', ['req-required']); 'req-required=param', ['req-required']);
uri.address.should.be.instanceof(bitcore.Address); uri.address.should.be.instanceof(bitcore.Address);
uri.amount.should.equal(120000000); uri.amount.should.equal(120000000);
@ -166,12 +166,12 @@ describe('URI', function() {
}); });
it('should support double slash scheme', function() { it('should support double slash scheme', function() {
var uri = new URI('bitcoin://CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'); var uri = new URI('bitcoincash://CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk');
uri.address.toString().should.equal('CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'); uri.address.toString().should.equal('CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk');
}); });
it('should input/output String', function() { it('should input/output String', function() {
var str = 'bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?' + var str = 'bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?' +
'message=Donation%20for%20project%20xyz&label=myLabel&other=xD'; 'message=Donation%20for%20project%20xyz&label=myLabel&other=xD';
URI.fromString(str).toString().should.equal(str); URI.fromString(str).toString().should.equal(str);
}); });
@ -187,12 +187,12 @@ describe('URI', function() {
}); });
it('should support numeric amounts', function() { it('should support numeric amounts', function() {
var uri = new URI('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=12.10001'); var uri = new URI('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=12.10001');
expect(uri.amount).to.be.equal(1210001000); expect(uri.amount).to.be.equal(1210001000);
}); });
it('should support extra arguments', function() { it('should support extra arguments', function() {
var uri = new URI('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?' + var uri = new URI('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?' +
'message=Donation%20for%20project%20xyz&label=myLabel&other=xD'); 'message=Donation%20for%20project%20xyz&label=myLabel&other=xD');
should.exist(uri.message); should.exist(uri.message);
@ -209,7 +209,7 @@ describe('URI', function() {
new URI({ new URI({
address: 'CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk', address: 'CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk',
}).toString().should.equal( }).toString().should.equal(
'bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk' 'bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'
); );
new URI({ new URI({
@ -218,27 +218,27 @@ describe('URI', function() {
message: 'Hello World', message: 'Hello World',
something: 'else' something: 'else'
}).toString().should.equal( }).toString().should.equal(
'bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.10001&message=Hello%20World&something=else' 'bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk?amount=1.10001&message=Hello%20World&something=else'
); );
}); });
it('should be case insensitive to protocol', function() { it('should be case insensitive to protocol', function() {
var uri1 = new URI('bItcOin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'); var uri1 = new URI('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk');
var uri2 = new URI('bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'); var uri2 = new URI('bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk');
uri1.address.toString().should.equal(uri2.address.toString()); uri1.address.toString().should.equal(uri2.address.toString());
}); });
it('writes correctly the "r" parameter on string serialization', function() { it('writes correctly the "r" parameter on string serialization', function() {
var originalString = 'bitcoin:mmrqEBJxUCf42vdb3oozZtyz5mKr3Vb2Em?amount=0.1&' + var originalString = 'bitcoincash:mmrqEBJxUCf42vdb3oozZtyz5mKr3Vb2Em?amount=0.1&' +
'r=https%3A%2F%2Ftest.bitpay.com%2Fi%2F6DKgf8cnJC388irbXk5hHu'; 'r=https%3A%2F%2Ftest.bitpay.com%2Fi%2F6DKgf8cnJC388irbXk5hHu';
var uri = new URI(originalString); var uri = new URI(originalString);
uri.toString().should.equal(originalString); uri.toString().should.equal(originalString);
}); });
it('displays nicely on the console (#inspect)', function() { it('displays nicely on the console (#inspect)', function() {
var uri = 'bitcoin:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk'; var uri = 'bitcoincash:CUqyiihRoVt5bjhPZTP9sjswHbP16vKQWk';
var instance = new URI(uri); var instance = new URI(uri);
instance.inspect().should.equal('<URI: ' + uri + '>'); instance.inspect().should.equal('<URI: ' + uri + '>');
}); });

Loading…
Cancel
Save