diff --git a/src/data_providers/current_branch.js b/src/data_providers/current_branch.js index 33b3ea34fcff9d5b778a679799c81b8346f759aa..74611a97180bdfa8cc6afe822c3f046ae37f8143 100644 --- a/src/data_providers/current_branch.js +++ b/src/data_providers/current_branch.js @@ -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(); } } diff --git a/test/integration/for_current_branch.test.js b/test/integration/for_current_branch.test.js index ba86d037ef2d422a888c450cd7fde6cfb5c535d5..aa57f3b084baae51ce5efca8bf803ea7e3fcebcf 100644 --- a/test/integration/for_current_branch.test.js +++ b/test/integration/for_current_branch.test.js @@ -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', + ], + ); + }); });