提交 4fbd4cae 编写于 作者: T Tomas Vik

Merge branch '129-prepare-token-and-workspace' into 'main'

Untangle the workspace and token related logic

Closes #239

See merge request gitlab-org/gitlab-vscode-extension!114
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
"--extensionTestsPath=${workspaceRoot}/out/test/integration/", "--extensionTestsPath=${workspaceRoot}/out/test/integration/",
"<paste the last line of `npm run create-test-workspace` output here>" "<paste the last line of `npm run create-test-workspace` output here>"
], ],
"preLaunchTask": "${defaultBuildTask}",
"stopOnEntry": false "stopOnEntry": false
} }
] ]
......
...@@ -3,6 +3,7 @@ const moment = require('moment'); ...@@ -3,6 +3,7 @@ const moment = require('moment');
const gitLabService = require('../gitlab_service'); const gitLabService = require('../gitlab_service');
const { SidebarTreeItem } = require('./sidebar_tree_item'); const { SidebarTreeItem } = require('./sidebar_tree_item');
const ErrorItem = require('./error_item'); const ErrorItem = require('./error_item');
const { getCurrentWorkspaceFolder } = require('../services/workspace_service');
class DataProvider { class DataProvider {
constructor() { constructor() {
...@@ -94,7 +95,7 @@ class DataProvider { ...@@ -94,7 +95,7 @@ class DataProvider {
async getChildren() { async getChildren() {
try { try {
const workspaceFolder = await gitLabService.getCurrenWorkspaceFolder(); const workspaceFolder = await getCurrentWorkspaceFolder();
this.project = await gitLabService.fetchCurrentProject(workspaceFolder); this.project = await gitLabService.fetchCurrentProject(workspaceFolder);
await this.fetchPipeline(workspaceFolder); await this.fetchPipeline(workspaceFolder);
await this.fetchMR(workspaceFolder); await this.fetchMR(workspaceFolder);
......
const vscode = require('vscode'); const vscode = require('vscode');
const openers = require('./openers'); const openers = require('./openers');
const tokenInput = require('./token_input'); const tokenInput = require('./token_input');
const tokenService = require('./token_service'); const { tokenService } = require('./services/token_service');
const tokenServiceWrapper = require('./token_service_wrapper');
const pipelineActionsPicker = require('./pipeline_actions_picker'); const pipelineActionsPicker = require('./pipeline_actions_picker');
const searchInput = require('./search_input'); const searchInput = require('./search_input');
const snippetInput = require('./snippet_input'); const snippetInput = require('./snippet_input');
...@@ -85,6 +86,7 @@ const activate = context => { ...@@ -85,6 +86,7 @@ const activate = context => {
registerCommands(context, outputChannel); registerCommands(context, outputChannel);
webviewController.addDeps(context); webviewController.addDeps(context);
tokenService.init(context); tokenService.init(context);
tokenServiceWrapper.init(context);
}; };
exports.activate = activate; exports.activate = activate;
...@@ -2,10 +2,10 @@ const vscode = require('vscode'); ...@@ -2,10 +2,10 @@ const vscode = require('vscode');
const request = require('request-promise'); const request = require('request-promise');
const fs = require('fs'); const fs = require('fs');
const { GitService } = require('./git_service'); const { GitService } = require('./git_service');
const tokenService = require('./token_service'); const { tokenService } = require('./services/token_service');
const statusBar = require('./status_bar'); const statusBar = require('./status_bar');
const gitlabProjectInput = require('./gitlab_project_input');
const { ApiError, UserFriendlyError } = require('./errors'); const { ApiError, UserFriendlyError } = require('./errors');
const { getCurrentWorkspaceFolder } = require('./services/workspace_service');
const projectCache = []; const projectCache = [];
let versionCache = null; let versionCache = null;
...@@ -24,43 +24,12 @@ const createGitService = workspaceFolder => { ...@@ -24,43 +24,12 @@ const createGitService = workspaceFolder => {
}); });
}; };
async function getCurrentWorkspaceFolder() {
const editor = vscode.window.activeTextEditor;
if (
editor &&
editor.document &&
vscode.workspace.getWorkspaceFolder(editor.document.uri) !== undefined
) {
const workspaceFolder = vscode.workspace.getWorkspaceFolder(editor.document.uri).uri.fsPath;
return workspaceFolder;
}
if (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length === 1) {
return vscode.workspace.workspaceFolders[0].uri.fsPath;
}
return null;
}
async function getCurrentWorkspaceFolderOrSelectOne() {
let workspaceFolder = null;
workspaceFolder = await getCurrentWorkspaceFolder();
if (workspaceFolder == null) {
workspaceFolder = await gitlabProjectInput.show();
}
return workspaceFolder;
}
async function fetch(path, method = 'GET', data = null) { async function fetch(path, method = 'GET', data = null) {
const { ignoreCertificateErrors, ca, cert, certKey } = vscode.workspace.getConfiguration( const { ignoreCertificateErrors, ca, cert, certKey } = vscode.workspace.getConfiguration(
'gitlab', 'gitlab',
); );
const instanceUrl = await createGitService( const instanceUrl = await createGitService(
await getCurrentWorkspaceFolderOrSelectOne(), await getCurrentWorkspaceFolder(),
).fetchCurrentInstanceUrl(); ).fetchCurrentInstanceUrl();
const { proxy } = vscode.workspace.getConfiguration('http'); const { proxy } = vscode.workspace.getConfiguration('http');
const apiRoot = `${instanceUrl}/api/v4`; const apiRoot = `${instanceUrl}/api/v4`;
...@@ -682,8 +651,6 @@ exports.fetchVersion = fetchVersion; ...@@ -682,8 +651,6 @@ exports.fetchVersion = fetchVersion;
exports.fetchDiscussions = fetchDiscussions; exports.fetchDiscussions = fetchDiscussions;
exports.renderMarkdown = renderMarkdown; exports.renderMarkdown = renderMarkdown;
exports.saveNote = saveNote; exports.saveNote = saveNote;
exports.getCurrentWorkspaceFolderOrSelectOne = getCurrentWorkspaceFolderOrSelectOne;
exports.getAllGitlabProjects = getAllGitlabProjects; exports.getAllGitlabProjects = getAllGitlabProjects;
exports.getCurrenWorkspaceFolder = getCurrentWorkspaceFolder;
exports.fetchLabelEvents = fetchLabelEvents; exports.fetchLabelEvents = fetchLabelEvents;
exports.createGitService = createGitService; exports.createGitService = createGitService;
const vscode = require('vscode'); const vscode = require('vscode');
const { GitService } = require('./git_service'); const { GitService } = require('./git_service');
const gitLabService = require('./gitlab_service'); const gitLabService = require('./gitlab_service');
const tokenService = require('./token_service'); const { tokenService } = require('./services/token_service');
const { getCurrentWorkspaceFolderOrSelectOne } = require('./services/workspace_service');
const openUrl = url => vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(url)); const openUrl = url => vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(url));
...@@ -44,12 +45,12 @@ async function openLink(linkTemplate, workspaceFolder) { ...@@ -44,12 +45,12 @@ async function openLink(linkTemplate, workspaceFolder) {
} }
async function showIssues() { async function showIssues() {
const workspaceFolder = await gitLabService.getCurrentWorkspaceFolderOrSelectOne(); const workspaceFolder = await getCurrentWorkspaceFolderOrSelectOne();
await openLink('$projectUrl/issues?assignee_id=$userId', workspaceFolder); await openLink('$projectUrl/issues?assignee_id=$userId', workspaceFolder);
} }
async function showMergeRequests() { async function showMergeRequests() {
const workspaceFolder = await gitLabService.getCurrentWorkspaceFolderOrSelectOne(); const workspaceFolder = await getCurrentWorkspaceFolderOrSelectOne();
await openLink('$projectUrl/merge_requests?assignee_id=$userId', workspaceFolder); await openLink('$projectUrl/merge_requests?assignee_id=$userId', workspaceFolder);
} }
...@@ -95,7 +96,7 @@ async function copyLinkToActiveFile() { ...@@ -95,7 +96,7 @@ async function copyLinkToActiveFile() {
} }
async function openCurrentMergeRequest() { async function openCurrentMergeRequest() {
const workspaceFolder = await gitLabService.getCurrentWorkspaceFolderOrSelectOne(); const workspaceFolder = await getCurrentWorkspaceFolderOrSelectOne();
const mr = await gitLabService.fetchOpenMergeRequestForCurrentBranch(workspaceFolder); const mr = await gitLabService.fetchOpenMergeRequestForCurrentBranch(workspaceFolder);
if (mr) { if (mr) {
...@@ -104,12 +105,12 @@ async function openCurrentMergeRequest() { ...@@ -104,12 +105,12 @@ async function openCurrentMergeRequest() {
} }
async function openCreateNewIssue() { async function openCreateNewIssue() {
const workspaceFolder = await gitLabService.getCurrentWorkspaceFolderOrSelectOne(); const workspaceFolder = await getCurrentWorkspaceFolderOrSelectOne();
openLink('$projectUrl/issues/new', workspaceFolder); openLink('$projectUrl/issues/new', workspaceFolder);
} }
async function openCreateNewMr() { async function openCreateNewMr() {
const workspaceFolder = await gitLabService.getCurrentWorkspaceFolderOrSelectOne(); const workspaceFolder = await getCurrentWorkspaceFolderOrSelectOne();
const project = await gitLabService.fetchCurrentProject(workspaceFolder); const project = await gitLabService.fetchCurrentProject(workspaceFolder);
const branchName = await createGitService(workspaceFolder).fetchTrackingBranchName(); const branchName = await createGitService(workspaceFolder).fetchTrackingBranchName();
...@@ -117,7 +118,7 @@ async function openCreateNewMr() { ...@@ -117,7 +118,7 @@ async function openCreateNewMr() {
} }
async function openProjectPage() { async function openProjectPage() {
const workspaceFolder = await gitLabService.getCurrentWorkspaceFolderOrSelectOne(); const workspaceFolder = await getCurrentWorkspaceFolderOrSelectOne();
openLink('$projectUrl', workspaceFolder); openLink('$projectUrl', workspaceFolder);
} }
...@@ -125,7 +126,7 @@ async function openCurrentPipeline(workspaceFolder) { ...@@ -125,7 +126,7 @@ async function openCurrentPipeline(workspaceFolder) {
if (!workspaceFolder) { if (!workspaceFolder) {
// Temporarily disable eslint to be able to start enforcing stricter rules // Temporarily disable eslint to be able to start enforcing stricter rules
// eslint-disable-next-line no-param-reassign // eslint-disable-next-line no-param-reassign
workspaceFolder = await gitLabService.getCurrentWorkspaceFolderOrSelectOne(); workspaceFolder = await getCurrentWorkspaceFolderOrSelectOne();
} }
const project = await gitLabService.fetchCurrentPipelineProject(workspaceFolder); const project = await gitLabService.fetchCurrentPipelineProject(workspaceFolder);
...@@ -141,7 +142,7 @@ async function openCurrentPipeline(workspaceFolder) { ...@@ -141,7 +142,7 @@ async function openCurrentPipeline(workspaceFolder) {
async function compareCurrentBranch() { async function compareCurrentBranch() {
let project = null; let project = null;
let lastCommitId = null; let lastCommitId = null;
const workspaceFolder = await gitLabService.getCurrentWorkspaceFolderOrSelectOne(); const workspaceFolder = await getCurrentWorkspaceFolderOrSelectOne();
project = await gitLabService.fetchCurrentProject(workspaceFolder); project = await gitLabService.fetchCurrentProject(workspaceFolder);
lastCommitId = await createGitService(workspaceFolder).fetchLastCommitId(); lastCommitId = await createGitService(workspaceFolder).fetchLastCommitId();
......
const vscode = require('vscode'); const vscode = require('vscode');
const gitLabService = require('./gitlab_service'); const gitLabService = require('./gitlab_service');
const openers = require('./openers'); const openers = require('./openers');
const { getCurrentWorkspaceFolderOrSelectOne } = require('./services/workspace_service');
async function showPicker() { async function showPicker() {
const items = [ const items = [
...@@ -22,7 +23,7 @@ async function showPicker() { ...@@ -22,7 +23,7 @@ async function showPicker() {
}, },
]; ];
const workspaceFolder = await gitLabService.getCurrentWorkspaceFolderOrSelectOne(); const workspaceFolder = await getCurrentWorkspaceFolderOrSelectOne();
const selected = await vscode.window.showQuickPick(items); const selected = await vscode.window.showQuickPick(items);
......
const vscode = require('vscode'); const vscode = require('vscode');
const gitLabService = require('./gitlab_service'); const gitLabService = require('./gitlab_service');
const openers = require('./openers'); const openers = require('./openers');
const { getCurrentWorkspaceFolderOrSelectOne } = require('./services/workspace_service');
const parseQuery = (query, noteableType) => { const parseQuery = (query, noteableType) => {
const params = {}; const params = {};
...@@ -94,7 +95,7 @@ async function getSearchInput(description) { ...@@ -94,7 +95,7 @@ async function getSearchInput(description) {
} }
async function showSearchInputFor(noteableType) { async function showSearchInputFor(noteableType) {
const workspaceFolder = await gitLabService.getCurrentWorkspaceFolderOrSelectOne(); const workspaceFolder = await getCurrentWorkspaceFolderOrSelectOne();
const project = await gitLabService.fetchCurrentProject(workspaceFolder); const project = await gitLabService.fetchCurrentProject(workspaceFolder);
const query = await getSearchInput( const query = await getSearchInput(
'Search in title or description. (Check extension page for search with filters)', 'Search in title or description. (Check extension page for search with filters)',
...@@ -113,7 +114,7 @@ async function showMergeRequestSearchInput() { ...@@ -113,7 +114,7 @@ async function showMergeRequestSearchInput() {
} }
async function showProjectAdvancedSearchInput() { async function showProjectAdvancedSearchInput() {
const workspaceFolder = await gitLabService.getCurrentWorkspaceFolderOrSelectOne(); const workspaceFolder = await getCurrentWorkspaceFolderOrSelectOne();
const project = await gitLabService.fetchCurrentProject(workspaceFolder); const project = await gitLabService.fetchCurrentProject(workspaceFolder);
const query = await getSearchInput( const query = await getSearchInput(
'Project Advanced Search. (Check extension page for Advanced Search)', 'Project Advanced Search. (Check extension page for Advanced Search)',
......
import * as assert from 'assert';
import { EventEmitter, ExtensionContext, Event } from 'vscode';
export class TokenService {
context?: ExtensionContext;
private onDidChangeEmitter = new EventEmitter<void>();
init(context: ExtensionContext) {
this.context = context;
}
get onDidChange(): Event<void> {
return this.onDidChangeEmitter.event;
}
private get glTokenMap() {
assert(this.context);
return this.context.globalState.get<Record<string, string>>('glTokens', {});
}
getInstanceUrls() {
return Object.keys(this.glTokenMap);
}
getToken(instanceUrl: string) {
return this.glTokenMap[instanceUrl];
}
setToken(instanceUrl: string, token: string | undefined) {
assert(this.context);
const tokenMap = this.glTokenMap;
if (token) {
tokenMap[instanceUrl] = token;
} else {
delete tokenMap[instanceUrl];
}
this.context.globalState.update('glTokens', tokenMap);
this.onDidChangeEmitter.fire();
}
}
export const tokenService: TokenService = new TokenService();
import * as vscode from 'vscode';
async function getWorkspaceFolderForOpenEditor(): Promise<string | undefined> {
const editor = vscode.window.activeTextEditor;
if (!editor?.document.uri) {
return undefined;
}
const workspaceFolder = vscode.workspace.getWorkspaceFolder(editor.document.uri);
return workspaceFolder?.uri.fsPath;
}
export async function getCurrentWorkspaceFolder(): Promise<string | null> {
const editorFolder = await getWorkspaceFolderForOpenEditor();
if (editorFolder) {
return editorFolder;
}
const { workspaceFolders } = vscode.workspace;
if (workspaceFolders && workspaceFolders.length === 1) {
return workspaceFolders[0].uri.fsPath;
}
return null;
}
export async function getCurrentWorkspaceFolderOrSelectOne(): Promise<string | null> {
const editorFolder = await getWorkspaceFolderForOpenEditor();
if (editorFolder) {
return editorFolder;
}
const { workspaceFolders } = vscode.workspace;
if (!workspaceFolders || workspaceFolders.length === 0) {
return null;
}
if (workspaceFolders.length === 1) {
return workspaceFolders[0].uri.fsPath;
}
const workspaceFolderOptions = workspaceFolders.map(folder => ({
label: folder.name,
uri: folder.uri.fsPath,
}));
const selectedFolder = await vscode.window.showQuickPick(workspaceFolderOptions, {
placeHolder: 'Select a workspace',
});
if (selectedFolder) {
return selectedFolder.uri;
}
return null;
}
...@@ -2,6 +2,7 @@ const vscode = require('vscode'); ...@@ -2,6 +2,7 @@ const vscode = require('vscode');
const openers = require('./openers'); const openers = require('./openers');
const gitLabService = require('./gitlab_service'); const gitLabService = require('./gitlab_service');
const gitlabProjectInput = require('./gitlab_project_input'); const gitlabProjectInput = require('./gitlab_project_input');
const { getCurrentWorkspaceFolder } = require('./services/workspace_service');
const visibilityOptions = [ const visibilityOptions = [
{ {
...@@ -67,7 +68,7 @@ async function showPicker() { ...@@ -67,7 +68,7 @@ async function showPicker() {
let project = null; let project = null;
if (editor) { if (editor) {
workspaceFolder = await gitLabService.getCurrenWorkspaceFolder(); workspaceFolder = await getCurrentWorkspaceFolder();
project = await gitLabService.fetchCurrentProjectSwallowError(workspaceFolder); project = await gitLabService.fetchCurrentProjectSwallowError(workspaceFolder);
if (project == null) { if (project == null) {
......
const vscode = require('vscode'); const vscode = require('vscode');
const openers = require('./openers'); const openers = require('./openers');
const gitLabService = require('./gitlab_service'); const gitLabService = require('./gitlab_service');
const { getCurrentWorkspaceFolder } = require('./services/workspace_service');
const { UserFriendlyError } = require('./errors'); const { UserFriendlyError } = require('./errors');
let context = null; let context = null;
...@@ -51,7 +52,7 @@ async function refreshPipeline() { ...@@ -51,7 +52,7 @@ async function refreshPipeline() {
}; };
try { try {
workspaceFolder = await gitLabService.getCurrenWorkspaceFolder(); workspaceFolder = await getCurrentWorkspaceFolder();
project = await gitLabService.fetchCurrentPipelineProject(workspaceFolder); project = await gitLabService.fetchCurrentPipelineProject(workspaceFolder);
if (project != null) { if (project != null) {
pipeline = await gitLabService.fetchLastPipelineForCurrentBranch(workspaceFolder); pipeline = await gitLabService.fetchLastPipelineForCurrentBranch(workspaceFolder);
...@@ -139,13 +140,12 @@ async function fetchMRIssues(workspaceFolder) { ...@@ -139,13 +140,12 @@ async function fetchMRIssues(workspaceFolder) {
} }
async function fetchBranchMR() { async function fetchBranchMR() {
const editor = vscode.window.activeTextEditor;
let text = '$(git-pull-request) GitLab: No MR.'; let text = '$(git-pull-request) GitLab: No MR.';
let workspaceFolder = null; let workspaceFolder = null;
let project = null; let project = null;
try { try {
workspaceFolder = vscode.workspace.getWorkspaceFolder(editor.document.uri).uri.fsPath; workspaceFolder = await getCurrentWorkspaceFolder();
project = await gitLabService.fetchCurrentProject(workspaceFolder); project = await gitLabService.fetchCurrentProject(workspaceFolder);
if (project != null) { if (project != null) {
mr = await gitLabService.fetchOpenMergeRequestForCurrentBranch(workspaceFolder); mr = await gitLabService.fetchOpenMergeRequestForCurrentBranch(workspaceFolder);
......
const vscode = require('vscode'); const vscode = require('vscode');
const { GITLAB_COM_URL } = require('./constants'); const { GITLAB_COM_URL } = require('./constants');
const tokenService = require('./token_service'); const { tokenService } = require('./services/token_service');
async function showInput() { async function showInput() {
const instance = await vscode.window.showInputBox({ const instance = await vscode.window.showInputBox({
......
...@@ -2,6 +2,7 @@ const vscode = require('vscode'); ...@@ -2,6 +2,7 @@ const vscode = require('vscode');
const { GITLAB_COM_URL } = require('./constants'); const { GITLAB_COM_URL } = require('./constants');
const openers = require('./openers'); const openers = require('./openers');
const statusBar = require('./status_bar'); const statusBar = require('./status_bar');
const { tokenService } = require('./services/token_service');
let context = null; let context = null;
let active = false; let active = false;
...@@ -9,11 +10,7 @@ let active = false; ...@@ -9,11 +10,7 @@ let active = false;
const currentInstanceUrl = () => const currentInstanceUrl = () =>
vscode.workspace.getConfiguration('gitlab').instanceUrl || GITLAB_COM_URL; vscode.workspace.getConfiguration('gitlab').instanceUrl || GITLAB_COM_URL;
const getGlTokenMap = () => context.globalState.get('glTokens', {}); const getToken = (instanceUrl = currentInstanceUrl()) => tokenService.getToken(instanceUrl);
const getToken = (instanceUrl = currentInstanceUrl()) => getGlTokenMap()[instanceUrl];
const getInstanceUrls = () => Object.keys(getGlTokenMap());
const updateExtensionStatus = () => { const updateExtensionStatus = () => {
const tokenExists = !!getToken(); const tokenExists = !!getToken();
...@@ -27,33 +24,6 @@ const updateExtensionStatus = () => { ...@@ -27,33 +24,6 @@ const updateExtensionStatus = () => {
} }
}; };
const setToken = (instanceUrl, token) => {
const tokenMap = getGlTokenMap();
if (token) {
tokenMap[instanceUrl] = token;
} else {
delete tokenMap[instanceUrl];
}
context.globalState.update('glTokens', tokenMap);
updateExtensionStatus();
};
const migrateLegacyToken = () => {
const token = context.globalState.get('glToken');
if (token) {
const instanceUrl = currentInstanceUrl();
if (!getToken(instanceUrl)) {
setToken(instanceUrl, token);
}
context.globalState.update('glToken', null);
}
};
const askForToken = () => { const askForToken = () => {
if (!getToken() && !context.workspaceState.get('askedForToken')) { if (!getToken() && !context.workspaceState.get('askedForToken')) {
const message = const message =
...@@ -86,14 +56,10 @@ const watchConfigurationChanges = () => { ...@@ -86,14 +56,10 @@ const watchConfigurationChanges = () => {
const init = ctx => { const init = ctx => {
context = ctx; context = ctx;
tokenService.onDidChange(() => updateExtensionStatus());
migrateLegacyToken();
askForToken(); askForToken();
updateExtensionStatus(); updateExtensionStatus();
watchConfigurationChanges(); watchConfigurationChanges();
}; };
exports.init = init; exports.init = init;
exports.getToken = getToken;
exports.setToken = setToken;
exports.getInstanceUrls = getInstanceUrls;
const assert = require('assert');
const { TokenService } = require('../../../src/services/token_service');
describe('TokenService', () => {
let tokenService;
beforeEach(() => {
let tokens = {};
const fakeContext = {
globalState: {
get: () => tokens,
update: (_, val) => {
tokens = val;
},
},
};
tokenService = new TokenService();
tokenService.init(fakeContext);
});
it('can set and get one token', async () => {
assert.strictEqual(tokenService.getToken('https://gitlab.com'), undefined);
tokenService.setToken('https://gitlab.com', 'abc');
assert.strictEqual(tokenService.getToken('https://gitlab.com'), 'abc');
});
it('can retrieve all instance URLs', async () => {
tokenService.setToken('https://gitlab.com', 'abc');
tokenService.setToken('https://dev.gitlab.com', 'def');
assert.deepStrictEqual(tokenService.getInstanceUrls(), [
'https://gitlab.com',
'https://dev.gitlab.com',
]);
});
});
const assert = require('assert');
const sinon = require('sinon');
const vscode = require('vscode');
const workspaceService = require('../../../src/services/workspace_service');
describe('workspace_service', () => {
const sandbox = sinon.createSandbox();
describe('one workspace, no open files', () => {
it('getCurrentWorkspaceFolder returns workspace folder', async () => {
const result = await workspaceService.getCurrentWorkspaceFolder();
assert.strictEqual(result, vscode.workspace.workspaceFolders[0].uri.fsPath);
});
it('getCurrentWorkspaceFolderOrSelectOne returns workspace folder', async () => {
const result = await workspaceService.getCurrentWorkspaceFolderOrSelectOne();
assert.strictEqual(result, vscode.workspace.workspaceFolders[0].uri.fsPath);
});
});
describe('multiple workspaces', () => {
const fakeFolders = [
{
name: 'workspace 1',
uri: { fsPath: '/ws1' },
},
{
name: 'workspace 2',
uri: { fsPath: '/ws2' },
},
];
let originalWorkspace;
before(() => {
[originalWorkspace] = vscode.workspace.workspaceFolders;
sandbox.stub(vscode.workspace, 'workspaceFolders').get(() => fakeFolders);
});
after(() => {
sandbox.restore();
});
it('getCurrentWorkspaceFolder returns null', async () => {
const result = await workspaceService.getCurrentWorkspaceFolder();
assert.strictEqual(result, null);
});
it('getCurrentWorkspaceFolderOrSelectOne lets user select a workspace', async () => {
// simulating user selecting second option
sandbox.stub(vscode.window, 'showQuickPick').callsFake(async options => {
return options[1];
});
const result = await workspaceService.getCurrentWorkspaceFolderOrSelectOne();
assert.strictEqual(result, '/ws2');
});
describe('with open editor', () => {
let testFileUri;
beforeEach(async () => {
testFileUri = vscode.Uri.parse(`${originalWorkspace.uri.fsPath}/newfile.js`);
const createFileEdit = new vscode.WorkspaceEdit();
createFileEdit.createFile(testFileUri);
await vscode.workspace.applyEdit(createFileEdit);
await vscode.window.showTextDocument(testFileUri);
});
afterEach(async () => {
const edit = new vscode.WorkspaceEdit();
edit.deleteFile(testFileUri);
await vscode.workspace.applyEdit(edit);
});
it('getCurrentWorkspaceFolder returns workspace folder', async () => {
const result = await workspaceService.getCurrentWorkspaceFolder();
assert.strictEqual(result, originalWorkspace.uri.fsPath);
});
it('getCurrentWorkspaceFolderOrSelectOne returns workspace folder', async () => {
const result = await workspaceService.getCurrentWorkspaceFolderOrSelectOne();
assert.strictEqual(result, originalWorkspace.uri.fsPath);
});
});
});
});
...@@ -2,7 +2,7 @@ const assert = require('assert'); ...@@ -2,7 +2,7 @@ const assert = require('assert');
const sinon = require('sinon'); const sinon = require('sinon');
const vscode = require('vscode'); const vscode = require('vscode');
const statusBar = require('../../src/status_bar'); const statusBar = require('../../src/status_bar');
const tokenService = require('../../src/token_service'); const { tokenService } = require('../../src/services/token_service');
const getServer = require('./test_infrastructure/mock_server'); const getServer = require('./test_infrastructure/mock_server');
const { GITLAB_HOST } = require('./test_infrastructure/constants'); const { GITLAB_HOST } = require('./test_infrastructure/constants');
...@@ -35,6 +35,7 @@ describe('GitLab status bar', () => { ...@@ -35,6 +35,7 @@ describe('GitLab status bar', () => {
after(() => { after(() => {
server.close(); server.close();
tokenService.setToken(`https://${GITLAB_HOST}`, undefined);
}); });
it('shows the correct pipeline item', async () => { it('shows the correct pipeline item', async () => {
......
const assert = require('assert'); const assert = require('assert');
const IssuableDataProvider = require('../../src/data_providers/issuable').DataProvider; const IssuableDataProvider = require('../../src/data_providers/issuable').DataProvider;
const tokenService = require('../../src/token_service'); const { tokenService } = require('../../src/services/token_service');
const getServer = require('./test_infrastructure/mock_server'); const getServer = require('./test_infrastructure/mock_server');
const { GITLAB_HOST } = require('./test_infrastructure/constants'); const { GITLAB_HOST } = require('./test_infrastructure/constants');
...@@ -20,6 +20,7 @@ describe('GitLab tree view', () => { ...@@ -20,6 +20,7 @@ describe('GitLab tree view', () => {
after(() => { after(() => {
server.close(); server.close();
tokenService.setToken(`https://${GITLAB_HOST}`, undefined);
}); });
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册