mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-20 00:28:52 +01:00
84 lines
2.9 KiB
TypeScript
84 lines
2.9 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import * as assert from 'assert';
|
|
import { env, Uri } from 'vscode';
|
|
import * as sinon from 'sinon';
|
|
import { UriHandlerLoopbackClient } from '../loopbackClientAndOpener';
|
|
import { UriEventHandler } from '../../UriEventHandler';
|
|
|
|
suite('UriHandlerLoopbackClient', () => {
|
|
const redirectUri = 'http://localhost';
|
|
let uriHandler: UriEventHandler;
|
|
let client: UriHandlerLoopbackClient;
|
|
let envStub: sinon.SinonStubbedInstance<typeof env>;
|
|
let callbackUri: Uri;
|
|
|
|
setup(async () => {
|
|
callbackUri = await env.asExternalUri(Uri.parse(`${env.uriScheme}://vscode.microsoft-authentication`));
|
|
envStub = sinon.stub(env);
|
|
envStub.openExternal.resolves(true);
|
|
envStub.asExternalUri.callThrough();
|
|
uriHandler = new UriEventHandler();
|
|
client = new UriHandlerLoopbackClient(uriHandler, redirectUri);
|
|
});
|
|
|
|
teardown(() => {
|
|
sinon.restore();
|
|
uriHandler.dispose();
|
|
});
|
|
|
|
suite('openBrowser', () => {
|
|
test('should open browser with correct URL', async () => {
|
|
const testUrl = 'http://example.com?foo=5';
|
|
|
|
await client.openBrowser(testUrl);
|
|
|
|
assert.ok(envStub.asExternalUri.calledOnce);
|
|
assert.ok(envStub.openExternal.calledOnce);
|
|
|
|
const expectedUri = Uri.parse(testUrl + `&state=${encodeURI(callbackUri.toString(true))}`);
|
|
const value = envStub.openExternal.getCalls()[0].args[0];
|
|
assert.strictEqual(value.toString(true), expectedUri.toString(true));
|
|
});
|
|
});
|
|
|
|
suite('getRedirectUri', () => {
|
|
test('should return the redirect URI', () => {
|
|
const result = client.getRedirectUri();
|
|
assert.strictEqual(result, redirectUri);
|
|
});
|
|
});
|
|
|
|
suite('listenForAuthCode', () => {
|
|
test('should return auth code from URL', async () => {
|
|
const code = '1234';
|
|
const state = '5678';
|
|
const testUrl = Uri.parse(`http://example.com?code=${code}&state=${state}`);
|
|
const promise = client.listenForAuthCode();
|
|
uriHandler.handleUri(testUrl);
|
|
const result = await promise;
|
|
|
|
assert.strictEqual(result.code, code);
|
|
assert.strictEqual(result.state, state);
|
|
});
|
|
|
|
test('should return auth error from URL', async () => {
|
|
const error = 'access_denied';
|
|
const errorDescription = 'reason';
|
|
const errorUri = 'uri';
|
|
const testUrl = Uri.parse(`http://example.com?error=${error}&error_description=${errorDescription}&error_uri=${errorUri}`);
|
|
|
|
const promise = client.listenForAuthCode();
|
|
uriHandler.handleUri(testUrl);
|
|
const result = await promise;
|
|
|
|
assert.strictEqual(result.error, 'access_denied');
|
|
assert.strictEqual(result.error_description, 'reason');
|
|
assert.strictEqual(result.error_uri, 'uri');
|
|
});
|
|
});
|
|
});
|