@ariyana/appauth
Version:
A general purpose OAuth client.
124 lines • 18.3 kB
JavaScript
"use strict";
/*
* Copyright 2017 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
var query_string_utils_1 = require("./query_string_utils");
var MOCK_LOCATION_UNDEFINED = 'undefined';
/**
* Useful in the context of writing tests.
*/
var MockLocationLike = /** @class */ (function () {
function MockLocationLike() {
this.hash = MOCK_LOCATION_UNDEFINED;
this.host = MOCK_LOCATION_UNDEFINED;
this.origin = MOCK_LOCATION_UNDEFINED;
this.hostname = MOCK_LOCATION_UNDEFINED;
this.pathname = MOCK_LOCATION_UNDEFINED;
this.port = MOCK_LOCATION_UNDEFINED;
this.protocol = MOCK_LOCATION_UNDEFINED;
this.search = MOCK_LOCATION_UNDEFINED;
this.assign = function () { };
}
MockLocationLike.prototype.setHash = function (hash) {
this.hash = hash;
return this;
};
MockLocationLike.prototype.setHost = function (host) {
this.host = host;
return this;
};
MockLocationLike.prototype.setOrigin = function (origin) {
this.origin = origin;
return this;
};
MockLocationLike.prototype.setHostname = function (hostname) {
this.hostname = hostname;
return this;
};
MockLocationLike.prototype.setPathname = function (pathname) {
this.pathname = pathname;
return this;
};
MockLocationLike.prototype.setPort = function (port) {
this.port = port;
return this;
};
MockLocationLike.prototype.setProtocol = function (protocol) {
this.protocol = protocol;
return this;
};
MockLocationLike.prototype.setSearch = function (search) {
this.search = search;
return this;
};
MockLocationLike.prototype.setAssign = function (assign) {
this.assign = assign;
return this;
};
return MockLocationLike;
}());
describe('Query String Parser Tests', function () {
var locationLike = new MockLocationLike();
var parser = new query_string_utils_1.BasicQueryStringUtils();
it('Empty query string should not blow up.', function () {
locationLike.setSearch('?');
var result = parser.parse(locationLike);
var keys = Object.keys(result);
expect(result).toBeTruthy();
expect(keys.length).toBe(0, 'No query parameters provided');
});
it('Should parse simple query strings.', function () {
locationLike.setSearch(encodeURI('key1=value1&key2=value 2& key3= value 3'));
var result = parser.parse(locationLike);
var keys = Object.keys(result);
expect(result).toBeTruthy();
expect(keys.length).toBe(3, '3 Query parameters should be present');
expect(keys[0]).toBe('key1');
expect(keys[1]).toBe('key2');
expect(keys[2]).toBe(' key3');
expect(result[keys[0]]).toBe('value1', 'Expected value is "value1"');
expect(result[keys[1]]).toBe('value 2', 'Expected value is "value 2"');
expect(result[keys[2]]).toBe(' value 3', 'Expected value is " value 3"');
});
it('Should handle params with no values', function () {
locationLike.setSearch(encodeURI('key1=value1&key2='));
var result = parser.parse(locationLike);
var keys = Object.keys(result);
expect(result).toBeTruthy();
expect(keys.length).toBe(1, '1 Query parameter should be present');
expect(keys[0]).toBe('key1');
expect(result[keys[0]]).toBe('value1', 'Expected value is "value1"');
});
it('Should handle duplicate parameter values', function () {
locationLike.setSearch(encodeURI('key1=value1&key1=value2'));
var result = parser.parse(locationLike);
var keys = Object.keys(result);
expect(result).toBeTruthy();
expect(keys.length).toBe(1, '1 Query parameter should be present');
expect(keys[0]).toBe('key1');
expect(result[keys[0]]).toBe('value2', 'Expected value is "value2"');
});
it('Should be able to deal with escaped # or ? characters', function () {
locationLike.setSearch(encodeURI('key1=value1?&key2=value2 #'));
var result = parser.parse(locationLike);
var keys = Object.keys(result);
expect(result).toBeTruthy();
expect(keys.length).toBe(2, '2 Query parameters should be present');
expect(keys[0]).toBe('key1');
expect(keys[1]).toBe('key2');
expect(result[keys[0]]).toBe('value1?', 'Expected value is "value1?"');
expect(result[keys[1]]).toBe('value2 #', 'Expected value is "value2 #"');
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnlfc3RyaW5nX3V0aWxzX3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcXVlcnlfc3RyaW5nX3V0aWxzX3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7R0FZRzs7QUFFSCwyREFBMkQ7QUFHM0QsSUFBTSx1QkFBdUIsR0FBRyxXQUFXLENBQUM7QUFFNUM7O0dBRUc7QUFDSDtJQVdFO1FBQ0UsSUFBSSxDQUFDLElBQUksR0FBRyx1QkFBdUIsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLHVCQUF1QixDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsdUJBQXVCLENBQUM7UUFDdEMsSUFBSSxDQUFDLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLHVCQUF1QixDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLHVCQUF1QixDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELGtDQUFPLEdBQVAsVUFBUSxJQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGtDQUFPLEdBQVAsVUFBUSxJQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9DQUFTLEdBQVQsVUFBVSxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHNDQUFXLEdBQVgsVUFBWSxRQUFnQjtRQUMxQixJQUFJLENB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Z2h0IDIwMTcgR29vZ2xlIEluYy5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHRcclxuICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlXHJcbiAqIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyXHJcbiAqIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcblxyXG5pbXBvcnQge0Jhc2ljUXVlcnlTdHJpbmdVdGlsc30gZnJvbSAnLi9xdWVyeV9zdHJpbmdfdXRpbHMnO1xyXG5pbXBvcnQge0xvY2F0aW9uTGlrZX0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG5jb25zdCBNT0NLX0xPQ0FUSU9OX1VOREVGSU5FRCA9ICd1bmRlZmluZWQnO1xyXG5cclxuLyoqXHJcbiAqIFVzZWZ1bCBpbiB0aGUgY29udGV4dCBvZiB3cml0aW5nIHRlc3RzLlxyXG4gKi9cclxuY2xhc3MgTW9ja0xvY2F0aW9uTGlrZSBpbXBsZW1lbnRzIExvY2F0aW9uTGlrZSB7XHJcbiAgcHVibGljIGhhc2g6IHN0cmluZztcclxuICBwdWJsaWMgaG9zdDogc3RyaW5nO1xyXG4gIHB1YmxpYyBvcmlnaW46IHN0cmluZztcclxuICBwdWJsaWMgaG9zdG5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgcGF0aG5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgcG9ydDogc3RyaW5nO1xyXG4gIHB1YmxpYyBwcm90b2NvbDogc3RyaW5nO1xyXG4gIHB1YmxpYyBzZWFyY2g6IHN0cmluZztcclxuICBwdWJsaWMgYXNzaWduOiAodXJsOiBzdHJpbmcpID0+IHZvaWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5oYXNoID0gTU9DS19MT0NBVElPTl9VTkRFRklORUQ7XHJcbiAgICB0aGlzLmhvc3QgPSBNT0NLX0xPQ0FUSU9OX1VOREVGSU5FRDtcclxuICAgIHRoaXMub3JpZ2luID0gTU9DS19MT0NBVElPTl9VTkRFRklORUQ7XHJcbiAgICB0aGlzLmhvc3RuYW1lID0gTU9DS19MT0NBVElPTl9VTkRFRklORUQ7XHJcbiAgICB0aGlzLnBhdGhuYW1lID0gTU9DS19MT0NBVElPTl9VTkRFRklORUQ7XHJcbiAgICB0aGlzLnBvcnQgPSBNT0NLX0xPQ0FUSU9OX1VOREVGSU5FRDtcclxuICAgIHRoaXMucHJvdG9jb2wgPSBNT0NLX0xPQ0FUSU9OX1VOREVGSU5FRDtcclxuICAgIHRoaXMuc2VhcmNoID0gTU9DS19MT0NBVElPTl9VTkRFRklORUQ7XHJcbiAgICB0aGlzLmFzc2lnbiA9ICgpID0+IHt9O1xyXG4gIH1cclxuXHJcbiAgc2V0SGFzaChoYXNoOiBzdHJpbmcpOiBNb2NrTG9jYXRpb25MaWtlIHtcclxuICAgIHRoaXMuaGFzaCA9IGhhc2g7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHNldEhvc3QoaG9zdDogc3RyaW5nKTogTW9ja0xvY2F0aW9uTGlrZSB7XHJcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBzZXRPcmlnaW4ob3JpZ2luOiBzdHJpbmcpOiBNb2NrTG9jYXRpb25MaWtlIHtcclxuICAgIHRoaXMub3JpZ2luID0gb3JpZ2luO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBzZXRIb3N0bmFtZShob3N0bmFtZTogc3RyaW5nKTogTW9ja0xvY2F0aW9uTGlrZSB7XHJcbiAgICB0aGlzLmhvc3RuYW1lID0gaG9zdG5hbWU7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHNldFBhdGhuYW1lKHBhdGhuYW1lOiBzdHJpbmcpOiBNb2NrTG9jYXRpb25MaWtlIHtcclxuICAgIHRoaXMucGF0aG5hbWUgPSBwYXRobmFtZTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgc2V0UG9ydChwb3J0OiBzdHJpbmcpOiBNb2NrTG9jYXRpb25MaWtlIHtcclxuICAgIHRoaXMucG9ydCA9IHBvcnQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHNldFByb3RvY29sKHByb3RvY29sOiBzdHJpbmcpOiBNb2NrTG9jYXRpb25MaWtlIHtcclxuICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgc2V0U2VhcmNoKHNlYXJjaDogc3RyaW5nKTogTW9ja0xvY2F0aW9uTGlrZSB7XHJcbiAgICB0aGlzLnNlYXJjaCA9IHNlYXJjaDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgc2V0QXNzaWduKGFzc2lnbjogKCkgPT4gdm9pZCkge1xyXG4gICAgdGhpcy5hc3NpZ24gPSBhc3NpZ247XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbn1cclxuXHJcbmRlc2NyaWJlKCdRdWVyeSBTdHJpbmcgUGFyc2VyIFRlc3RzJywgKCkgPT4ge1xyXG4gIGNvbnN0IGxvY2F0aW9uTGlrZSA9IG5ldyBNb2NrTG9jYXRpb25MaWtlKCk7XHJcbiAgY29uc3QgcGFyc2VyID0gbmV3IEJhc2ljUXVlcnlTdHJpbmdVdGlscygpO1xyXG5cclxuICBpdCgnRW1wdHkgcXVlcnkgc3RyaW5nIHNob3VsZCBub3QgYmxvdyB1cC4nLCAoKSA9PiB7XHJcbiAgICBsb2NhdGlvbkxpa2Uuc2V0U2VhcmNoKCc/Jyk7XHJcbiAgICBsZXQgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKGxvY2F0aW9uTGlrZSk7XHJcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdCk7XHJcbiAgICBleHBlY3QocmVzdWx0KS50b0JlVHJ1dGh5KCk7XHJcbiAgICBleHBlY3Qoa2V5cy5sZW5ndGgpLnRvQmUoMCwgJ05vIHF1ZXJ5IHBhcmFtZXRlcnMgcHJvdmlkZWQnKTtcclxuICB9KTtcclxuXHJcbiAgaXQoJ1Nob3VsZCBwYXJzZSBzaW1wbGUgcXVlcnkgc3RyaW5ncy4nLCAoKSA9PiB7XHJcbiAgICBsb2NhdGlvbkxpa2Uuc2V0U2VhcmNoKGVuY29kZVVSSSgna2V5MT12YWx1ZTEma2V5Mj12YWx1ZSAyJiBrZXkzPSB2YWx1ZSAzJykpO1xyXG4gICAgbGV0IHJlc3VsdCA9IHBhcnNlci5wYXJzZShsb2NhdGlvbkxpa2UpO1xyXG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhyZXN1bHQpO1xyXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZVRydXRoeSgpO1xyXG4gICAgZXhwZWN0KGtleXMubGVuZ3RoKS50b0JlKDMsICczIFF1ZXJ5IHBhcmFtZXRlcnMgc2hvdWxkIGJlIHByZXNlbnQnKTtcclxuICAgIGV4cGVjdChrZXlzWzBdKS50b0JlKCdrZXkxJyk7XHJcbiAgICBleHBlY3Qoa2V5c1sxXSkudG9CZSgna2V5MicpO1xyXG4gICAgZXhwZWN0KGtleXNbMl0pLnRvQmUoJyBrZXkzJyk7XHJcbiAgICBleHBlY3QocmVzdWx0W2tleXNbMF1dKS50b0JlKCd2YWx1ZTEnLCAnRXhwZWN0ZWQgdmFsdWUgaXMgXCJ2YWx1ZTFcIicpO1xyXG4gICAgZXhwZWN0KHJlc3VsdFtrZXlzWzFdXSkudG9CZSgndmFsdWUgMicsICdFeHBlY3RlZCB2YWx1ZSBpcyBcInZhbHVlIDJcIicpO1xyXG4gICAgZXhwZWN0KHJlc3VsdFtrZXlzWzJdXSkudG9CZSgnIHZhbHVlIDMnLCAnRXhwZWN0ZWQgdmFsdWUgaXMgXCIgdmFsdWUgM1wiJyk7XHJcbiAgfSk7XHJcblxyXG4gIGl0KCdTaG91bGQgaGFuZGxlIHBhcmFtcyB3aXRoIG5vIHZhbHVlcycsICgpID0+IHtcclxuICAgIGxvY2F0aW9uTGlrZS5zZXRTZWFyY2goZW5jb2RlVVJJKCdrZXkxPXZhbHVlMSZrZXkyPScpKTtcclxuICAgIGxldCByZXN1bHQgPSBwYXJzZXIucGFyc2UobG9jYXRpb25MaWtlKTtcclxuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocmVzdWx0KTtcclxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVUcnV0aHkoKTtcclxuICAgIGV4cGVjdChrZXlzLmxlbmd0aCkudG9CZSgxLCAnMSBRdWVyeSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHByZXNlbnQnKTtcclxuICAgIGV4cGVjdChrZXlzWzBdKS50b0JlKCdrZXkxJyk7XHJcbiAgICBleHBlY3QocmVzdWx0W2tleXNbMF1dKS50b0JlKCd2YWx1ZTEnLCAnRXhwZWN0ZWQgdmFsdWUgaXMgXCJ2YWx1ZTFcIicpO1xyXG4gIH0pO1xyXG5cclxuICBpdCgnU2hvdWxkIGhhbmRsZSBkdXBsaWNhdGUgcGFyYW1ldGVyIHZhbHVlcycsICgpID0+IHtcclxuICAgIGxvY2F0aW9uTGlrZS5zZXRTZWFyY2goZW5jb2RlVVJJKCdrZXkxPXZhbHVlMSZrZXkxPXZhbHVlMicpKTtcclxuICAgIGxldCByZXN1bHQgPSBwYXJzZXIucGFyc2UobG9jYXRpb25MaWtlKTtcclxuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocmVzdWx0KTtcclxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVUcnV0aHkoKTtcclxuICAgIGV4cGVjdChrZXlzLmxlbmd0aCkudG9CZSgxLCAnMSBRdWVyeSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHByZXNlbnQnKTtcclxuICAgIGV4cGVjdChrZXlzWzBdKS50b0JlKCdrZXkxJyk7XHJcbiAgICBleHBlY3QocmVzdWx0W2tleXNbMF1dKS50b0JlKCd2YWx1ZTInLCAnRXhwZWN0ZWQgdmFsdWUgaXMgXCJ2YWx1ZTJcIicpO1xyXG4gIH0pO1xyXG5cclxuICBpdCgnU2hvdWxkIGJlIGFibGUgdG8gZGVhbCB3aXRoIGVzY2FwZWQgIyBvciA/IGNoYXJhY3RlcnMnLCAoKSA9PiB7XHJcbiAgICBsb2NhdGlvbkxpa2Uuc2V0U2VhcmNoKGVuY29kZVVSSSgna2V5MT12YWx1ZTE/JmtleTI9dmFsdWUyICMnKSk7XHJcbiAgICBsZXQgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKGxvY2F0aW9uTGlrZSk7XHJcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdCk7XHJcbiAgICBleHBlY3QocmVzdWx0KS50b0JlVHJ1dGh5KCk7XHJcbiAgICBleHBlY3Qoa2V5cy5sZW5ndGgpLnRvQmUoMiwgJzIgUXVlcnkgcGFyYW1ldGVycyBzaG91bGQgYmUgcHJlc2VudCcpO1xyXG4gICAgZXhwZWN0KGtleXNbMF0pLnRvQmUoJ2tleTEnKTtcclxuICAgIGV4cGVjdChrZXlzWzFdKS50b0JlKCdrZXkyJyk7XHJcbiAgICBleHBlY3QocmVzdWx0W2tleXNbMF1dKS50b0JlKCd2YWx1ZTE/JywgJ0V4cGVjdGVkIHZhbHVlIGlzIFwidmFsdWUxP1wiJyk7XHJcbiAgICBleHBlY3QocmVzdWx0W2tleXNbMV1dKS50b0JlKCd2YWx1ZTIgIycsICdFeHBlY3RlZCB2YWx1ZSBpcyBcInZhbHVlMiAjXCInKTtcclxuICB9KTtcclxufSk7XHJcbiJdfQ==