219 lines
7.5 KiB
HTML
219 lines
7.5 KiB
HTML
<!DOCTYPE html>
|
|
<!--
|
|
Copyright (C) 2017 The Android Open Source Project
|
|
|
|
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.
|
|
-->
|
|
|
|
<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
|
|
<title>gr-gapi-auth</title>
|
|
|
|
<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
|
|
<script src="../../../bower_components/web-component-tester/browser.js"></script>
|
|
<link rel="import" href="../../../test/common-test-setup.html"/>
|
|
<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
|
|
|
|
<script src="gr-gapi-auth.js"></script>
|
|
|
|
<script>
|
|
suite('gr-rest-api-interface tests', () => {
|
|
let auth;
|
|
let sandbox;
|
|
|
|
setup(() => {
|
|
sandbox = sinon.sandbox.create();
|
|
auth = new GrGapiAuth();
|
|
window.gapi = {
|
|
load: sandbox.stub().callsArg(1),
|
|
config: {
|
|
update: sandbox.stub(),
|
|
},
|
|
auth: {
|
|
init: sandbox.stub().callsArg(0),
|
|
authorize: sandbox.stub(),
|
|
},
|
|
};
|
|
sandbox.stub(window, 'fetch').returns(Promise.resolve({ok: true}));
|
|
});
|
|
|
|
teardown(() => {
|
|
delete window.gapi;
|
|
sandbox.restore();
|
|
});
|
|
|
|
test('exists', () => {
|
|
assert.isOk(auth);
|
|
});
|
|
|
|
test('base url support', () => {
|
|
const baseUrl = 'http://foo';
|
|
sandbox.stub(Gerrit.BaseUrlBehavior, 'getBaseUrl').returns(baseUrl);
|
|
sandbox.stub(auth, '_getAccessToken').returns(Promise.resolve('baz'));
|
|
return auth.fetch(baseUrl + '/url', {bar: 'bar'}).then(() => {
|
|
const [url] = fetch.lastCall.args;
|
|
assert.equal(url, 'http://foo/a/url');
|
|
});
|
|
});
|
|
|
|
test('fetch signed in', () => {
|
|
sandbox.stub(auth, '_getAccessToken').returns(Promise.resolve('foo'));
|
|
return auth.fetch('/url', {bar: 'bar'}).then(() => {
|
|
assert.isTrue(auth._getAccessToken.called);
|
|
const [url, options] = fetch.lastCall.args;
|
|
assert.equal(url, '/a/url');
|
|
assert.equal(options.bar, 'bar');
|
|
assert.equal(options.headers.get('Authorization'), 'Bearer foo');
|
|
});
|
|
});
|
|
|
|
test('fetch not signed in', () => {
|
|
sandbox.stub(auth, '_getAccessToken').returns(Promise.resolve());
|
|
return auth.fetch('/url', {bar: 'bar'}).then(() => {
|
|
assert.isTrue(auth._getAccessToken.called);
|
|
const [url, options] = fetch.lastCall.args;
|
|
assert.equal(url, '/url');
|
|
assert.equal(options.bar, 'bar');
|
|
assert.isUndefined(options.headers);
|
|
});
|
|
});
|
|
|
|
test('_getAccessToken returns valid shared token', () => {
|
|
GrGapiAuth._sharedAuthToken = {access_token: 'foo'};
|
|
sandbox.stub(auth, '_isTokenValid').returns(true);
|
|
return auth._getAccessToken().then(token => {
|
|
assert.equal(token, 'foo');
|
|
});
|
|
});
|
|
|
|
test('_getAccessToken refreshes token', () => {
|
|
const token = {access_token: 'foo'};
|
|
sandbox.stub(auth, '_loadGapi').returns(Promise.resolve());
|
|
sandbox.stub(auth, '_configureOAuthLibrary').returns(Promise.resolve());
|
|
sandbox.stub(auth, '_refreshToken').returns(Promise.resolve(token));
|
|
sandbox.stub(auth, '_isTokenValid').returns(true)
|
|
.onFirstCall().returns(false);
|
|
return auth._getAccessToken().then(token => {
|
|
assert.isTrue(auth._loadGapi.called);
|
|
assert.isTrue(auth._configureOAuthLibrary.called);
|
|
assert.isTrue(auth._refreshToken.called);
|
|
assert.equal(token, 'foo');
|
|
});
|
|
});
|
|
|
|
test('_isTokenValid', () => {
|
|
assert.isFalse(auth._isTokenValid());
|
|
assert.isFalse(auth._isTokenValid({}));
|
|
assert.isFalse(auth._isTokenValid({access_token: 'foo'}));
|
|
assert.isFalse(auth._isTokenValid({
|
|
access_token: 'foo',
|
|
expires_at: Date.now()/1000 - 1,
|
|
}));
|
|
assert.isTrue(auth._isTokenValid({
|
|
access_token: 'foo',
|
|
expires_at: Date.now()/1000 + 1,
|
|
}));
|
|
});
|
|
|
|
test('_configureOAuthLibrary', () => {
|
|
sandbox.stub(auth, '_getOAuthConfig').returns({
|
|
auth_url: 'some_auth_url',
|
|
proxy_url: 'some_proxy_url',
|
|
client_id: 'some_client_id',
|
|
email: 'some_email',
|
|
});
|
|
return auth._configureOAuthLibrary().then(() => {
|
|
assert.isTrue(gapi.load.calledWith('config_min'));
|
|
assert.isTrue(auth._getOAuthConfig.called);
|
|
assert.isTrue(gapi.config.update.calledWith(
|
|
'oauth-flow/authUrl', 'some_auth_url'));
|
|
assert.isTrue(gapi.config.update.calledWith(
|
|
'oauth-flow/proxyUrl', 'some_proxy_url'));
|
|
assert.equal(GrGapiAuth._oauthClientId, 'some_client_id');
|
|
assert.equal(GrGapiAuth._oauthEmail, 'some_email');
|
|
assert.isTrue(gapi.auth.init.called);
|
|
assert.isTrue(gapi.load.calledWith('auth'));
|
|
});
|
|
});
|
|
|
|
test('_refreshToken no token', () => {
|
|
gapi.auth.authorize.callsArgWith(1, null);
|
|
return auth._refreshToken().catch(reason => {
|
|
assert.equal(reason, 'No token returned');
|
|
});
|
|
});
|
|
|
|
test('_refreshToken error', () => {
|
|
gapi.auth.authorize.callsArgWith(1, {error: 'some error'});
|
|
return auth._refreshToken().catch(reason => {
|
|
assert.equal(reason, 'some error');
|
|
});
|
|
});
|
|
|
|
test('_refreshToken', () => {
|
|
const token = {};
|
|
gapi.auth.authorize.callsArgWith(1, token);
|
|
return auth._refreshToken().then(t => {
|
|
assert.strictEqual(token, t);
|
|
});
|
|
});
|
|
|
|
test('_getOAuthConfig', () => {
|
|
const config = {};
|
|
sandbox.stub(auth, '_getResponseObject').returns(config);
|
|
return auth._getOAuthConfig().then(c => {
|
|
const [url, options] = fetch.lastCall.args;
|
|
assert.equal(url, '/accounts/self/oauthconfig');
|
|
assert.equal(options.credentials, 'same-origin');
|
|
assert.equal(options.headers.get('Accept'), 'application/json');
|
|
assert.strictEqual(c, config);
|
|
});
|
|
});
|
|
|
|
test('BaseUrlBehavior', () => {
|
|
sandbox.stub(Gerrit.BaseUrlBehavior, 'getBaseUrl').returns('http://foo');
|
|
sandbox.stub(auth, '_getResponseObject').returns({});
|
|
return auth._getOAuthConfig().then(c => {
|
|
const [url] = fetch.lastCall.args;
|
|
assert.equal(url, 'http://foo/accounts/self/oauthconfig');
|
|
});
|
|
});
|
|
|
|
suite('faster gerrit cors', () => {
|
|
setup(() => {
|
|
window.FASTER_GERRIT_CORS = true;
|
|
});
|
|
|
|
teardown(() => {
|
|
delete window.FASTER_GERRIT_CORS;
|
|
});
|
|
|
|
test('PUT works', () => {
|
|
sandbox.stub(auth, '_getAccessToken').returns(Promise.resolve('foo'));
|
|
const originalOptions = {
|
|
method: 'PUT',
|
|
headers: new Headers({'Content-Type': 'mail/pigeon'}),
|
|
};
|
|
return auth.fetch('/url', originalOptions).then(() => {
|
|
assert.isTrue(auth._getAccessToken.called);
|
|
const [url, options] = fetch.lastCall.args;
|
|
assert.include(url, '$ct=mail%2Fpigeon');
|
|
assert.include(url, '$m=PUT');
|
|
assert.include(url, 'access_token=foo');
|
|
assert.equal(options.method, 'POST');
|
|
assert.equal(options.headers.get('Content-Type'), 'text/plain');
|
|
});
|
|
});
|
|
});
|
|
});
|
|
</script>
|