提交 125af415 编写于 作者: T Tomas Vik

fix: handle disabled pipelines or MRs

The "For current branch" view was completely failing when pipelines
or MRs were disabbled for the current project.
上级 b9269aba
......@@ -3,29 +3,30 @@ const moment = require('moment');
const gitLabService = require('../gitlab_service');
const { ErrorItem } = require('./items/error_item');
const { getCurrentWorkspaceFolder } = require('../services/workspace_service');
const { handleError } = require('../log');
const { handleError, logError } = require('../log');
const { MrItem } = require('./items/mr_item');
const { IssueItem } = require('./items/issue_item');
const { ExternalUrlItem } = require('./items/external_url_item');
class DataProvider {
constructor() {
// Temporarily disable eslint to be able to start enforcing stricter rules
// eslint-disable-next-line no-underscore-dangle
this._onDidChangeTreeData = new vscode.EventEmitter();
// Temporarily disable eslint to be able to start enforcing stricter rules
// eslint-disable-next-line no-underscore-dangle
this.onDidChangeTreeData = this._onDidChangeTreeData.event;
this.eventEmitter = new vscode.EventEmitter();
this.onDidChangeTreeData = this.eventEmitter.event;
this.project = null;
this.mr = null;
}
async fetchPipeline(workspaceFolder) {
const pipeline = await gitLabService.fetchLastPipelineForCurrentBranch(workspaceFolder);
let pipeline;
try {
pipeline = await gitLabService.fetchLastPipelineForCurrentBranch(workspaceFolder);
} catch (e) {
logError(e);
return new ErrorItem('Fetching pipeline failed');
}
if (!pipeline) {
return new vscode.TreeItem('No pipeline found.');
return new vscode.TreeItem('No pipeline found');
}
const statusText = pipeline.status === 'success' ? 'passed' : pipeline.status;
const actions = {
......@@ -46,13 +47,18 @@ class DataProvider {
}
async fetchMR(workspaceFolder) {
const mr = await gitLabService.fetchOpenMergeRequestForCurrentBranch(workspaceFolder);
let mr;
try {
mr = await gitLabService.fetchOpenMergeRequestForCurrentBranch(workspaceFolder);
} catch (e) {
logError(e);
return new ErrorItem('Fetching MR failed');
}
if (mr) {
this.mr = mr;
return new MrItem(this.mr, this.project);
}
return new vscode.TreeItem('No merge request found.');
return new vscode.TreeItem('No merge request found');
}
async fetchClosingIssue(workspaceFolder) {
......@@ -63,7 +69,7 @@ class DataProvider {
return issues.map(issue => new IssueItem(issue, this.project));
}
}
return [new vscode.TreeItem('No closing issue found.')];
return [new vscode.TreeItem('No closing issue found')];
}
async getChildren(item) {
......@@ -81,20 +87,13 @@ class DataProvider {
}
}
// eslint-disable-next-line class-methods-use-this
getParent() {
return null;
}
// eslint-disable-next-line class-methods-use-this
getTreeItem(item) {
return item;
}
refresh() {
// Temporarily disable eslint to be able to start enforcing stricter rules
// eslint-disable-next-line no-underscore-dangle
this._onDidChangeTreeData.fire();
this.eventEmitter.fire();
}
}
......
......@@ -2,7 +2,7 @@ const assert = require('assert');
const CurrentBranchDataProvider = require('../../src/data_providers/current_branch').DataProvider;
const { tokenService } = require('../../src/services/token_service');
const openIssueResponse = require('./fixtures/rest/open_issue.json');
const pipelinesResopnse = require('./fixtures/rest/pipelines.json');
const pipelinesResponse = require('./fixtures/rest/pipelines.json');
const pipelineResponse = require('./fixtures/rest/pipeline.json');
const openMergeRequestResponse = require('./fixtures/rest/open_mr.json');
const {
......@@ -16,36 +16,38 @@ describe('GitLab tree view for current branch', () => {
let server;
let dataProvider;
const pipelinesEndpoint = createQueryJsonEndpoint('/projects/278964/pipelines', {
'?ref=master': pipelinesResponse,
});
const pipelineEndpoint = createJsonEndpoint('/projects/278964/pipelines/47', pipelineResponse);
const mrEndpoint = createQueryJsonEndpoint('/projects/278964/merge_requests', {
'?state=opened&source_branch=master': [openMergeRequestResponse],
});
const issueEndpoint = createJsonEndpoint('/projects/278964/merge_requests/33824/closes_issues', [
openIssueResponse,
]);
before(async () => {
server = getServer([
createQueryJsonEndpoint('/projects/278964/pipelines', {
'?ref=master': pipelinesResopnse,
}),
createJsonEndpoint('/projects/278964/pipelines/47', pipelineResponse),
createQueryJsonEndpoint('/projects/278964/merge_requests', {
'?state=opened&source_branch=master': [openMergeRequestResponse],
}),
createJsonEndpoint('/projects/278964/merge_requests/33824/closes_issues', [
openIssueResponse,
]),
]);
await tokenService.setToken(GITLAB_URL, 'abcd-secret');
});
beforeEach(() => {
server.resetHandlers();
dataProvider = new CurrentBranchDataProvider();
});
after(async () => {
afterEach(() => {
server.close();
});
after(async () => {
await tokenService.setToken(GITLAB_URL, undefined);
});
it('shows pipeline, mr and closing issue for the current branch', async () => {
const forCurrentPipeline = await dataProvider.getChildren();
server = getServer([pipelinesEndpoint, pipelineEndpoint, mrEndpoint, issueEndpoint]);
const forCurrentBranch = await dataProvider.getChildren();
assert.deepStrictEqual(
forCurrentPipeline.map(i => i.label),
forCurrentBranch.map(i => i.label),
[
'Pipeline #47 passed · Finished 4 years ago',
'!33824 · Web IDE - remove unused actions (mappings)',
......@@ -53,4 +55,43 @@ describe('GitLab tree view for current branch', () => {
],
);
});
it('handles error for pipeline API request', async () => {
server = getServer([mrEndpoint, issueEndpoint]);
const forCurrentBranch = await dataProvider.getChildren();
assert.deepStrictEqual(
forCurrentBranch.map(i => i.label),
[
'Fetching pipeline failed',
'!33824 · Web IDE - remove unused actions (mappings)',
'#219925 · Change primary button for editing on files',
],
);
});
it('handles error for MR API request', async () => {
server = getServer([pipelinesEndpoint, pipelineEndpoint]);
const forCurrentBranch = await dataProvider.getChildren();
assert.deepStrictEqual(
forCurrentBranch.map(i => i.label),
[
'Pipeline #47 passed · Finished 4 years ago',
'Fetching MR failed',
'No closing issue found',
],
);
});
it('handles error for issue API request', async () => {
server = getServer([pipelinesEndpoint, pipelineEndpoint, mrEndpoint]);
const forCurrentBranch = await dataProvider.getChildren();
assert.deepStrictEqual(
forCurrentBranch.map(i => i.label),
[
'Pipeline #47 passed · Finished 4 years ago',
'!33824 · Web IDE - remove unused actions (mappings)',
'No closing issue found',
],
);
});
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册