From 3213a26e2ab835667bd1c1af6a4010692256f63c Mon Sep 17 00:00:00 2001 From: Jackie Fraser Date: Tue, 24 Mar 2020 07:29:08 -0400 Subject: [PATCH 1/3] Migrate ee mr_widget_pipeline_container_spec to Jest --- .../mr_widget_pipeline_container_spec.js | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) rename ee/spec/{javascripts => frontend}/vue_mr_widget/components/mr_widget_pipeline_container_spec.js (84%) diff --git a/ee/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_container_spec.js b/ee/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js similarity index 84% rename from ee/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_container_spec.js rename to ee/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js index a74c2699c8274f..9c0bff9f9e3923 100644 --- a/ee/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_container_spec.js +++ b/ee/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js @@ -1,17 +1,20 @@ -import { mount, createLocalVue } from '@vue/test-utils'; +import { mount, shallowMount, createLocalVue } from '@vue/test-utils'; import MergeTrainPositionIndicator from 'ee/vue_merge_request_widget/components/merge_train_position_indicator.vue'; import VisualReviewAppLink from 'ee/vue_merge_request_widget/components/visual_review_app_link.vue'; -import { mockStore } from 'spec/vue_mr_widget/mock_data'; +import { mockStore } from 'jest/vue_mr_widget/mock_data'; import MrWidgetPipelineContainer from '~/vue_merge_request_widget/components/mr_widget_pipeline_container.vue'; import { MT_MERGE_STRATEGY, MWPS_MERGE_STRATEGY } from '~/vue_merge_request_widget/constants'; +import MockAdapter from 'axios-mock-adapter'; +import axios from '~/lib/utils/axios_utils'; describe('MrWidgetPipelineContainer', () => { let wrapper; + let mock; - const factory = (mrUpdates = {}, provide = {}) => { + const factory = (method = shallowMount, mrUpdates = {}, provide = {}) => { const localVue = createLocalVue(); - wrapper = mount(localVue.extend(MrWidgetPipelineContainer), { + wrapper = method.call(this, localVue.extend(MrWidgetPipelineContainer), { propsData: { mr: Object.assign({}, mockStore, mrUpdates), }, @@ -29,7 +32,7 @@ describe('MrWidgetPipelineContainer', () => { describe('merge train indicator', () => { it('should render the merge train indicator if the MR is open and is on the merge train', () => { - factory({ + factory(shallowMount, { isOpen: true, autoMergeStrategy: MT_MERGE_STRATEGY, }); @@ -38,7 +41,7 @@ describe('MrWidgetPipelineContainer', () => { }); it('should not render the merge train indicator if the MR is closed', () => { - factory({ + factory(shallowMount, { isOpen: false, autoMergeStrategy: MT_MERGE_STRATEGY, }); @@ -47,7 +50,7 @@ describe('MrWidgetPipelineContainer', () => { }); it('should not render the merge train indicator if the MR is not on the merge train', () => { - factory({ + factory(shallowMount, { isOpen: true, autoMergeStrategy: MWPS_MERGE_STRATEGY, }); @@ -58,7 +61,11 @@ describe('MrWidgetPipelineContainer', () => { describe('with anonymous visual review feedback feature flag enabled', () => { beforeEach(() => { + mock = new MockAdapter(axios); + mock.onGet().reply(200, {}); + factory( + mount, { visualReviewAppAvailable: true, appUrl: 'http://gitlab.example.com', @@ -94,7 +101,11 @@ describe('MrWidgetPipelineContainer', () => { describe('with anonymous visual review feedback feature flag disabled', () => { beforeEach(() => { + mock = new MockAdapter(axios); + mock.onGet().reply(200, {}); + factory( + mount, { visualReviewAppAvailable: true, appUrl: 'http://gitlab.example.com', -- GitLab From 89d11eb6e68483fab6269f9ad57fa996f7a89639 Mon Sep 17 00:00:00 2001 From: Paul Slaughter Date: Thu, 9 Apr 2020 17:18:32 -0500 Subject: [PATCH 2/3] Migrate ee mr_widget_options_spec to Jest - waitForPromises() was needed in the afterEach because otherwise mock.restore() happens first and we make a bunch of unmocked requests. --- .../ee_mr_widget_options_spec.js | 138 ++++++++++-------- 1 file changed, 74 insertions(+), 64 deletions(-) rename ee/spec/{javascripts => frontend}/vue_mr_widget/ee_mr_widget_options_spec.js (93%) diff --git a/ee/spec/javascripts/vue_mr_widget/ee_mr_widget_options_spec.js b/ee/spec/frontend/vue_mr_widget/ee_mr_widget_options_spec.js similarity index 93% rename from ee/spec/javascripts/vue_mr_widget/ee_mr_widget_options_spec.js rename to ee/spec/frontend/vue_mr_widget/ee_mr_widget_options_spec.js index 6e61e6673be7c6..4221390c25246b 100644 --- a/ee/spec/javascripts/vue_mr_widget/ee_mr_widget_options_spec.js +++ b/ee/spec/frontend/vue_mr_widget/ee_mr_widget_options_spec.js @@ -3,8 +3,9 @@ import MockAdapter from 'axios-mock-adapter'; import mrWidgetOptions from 'ee/vue_merge_request_widget/mr_widget_options.vue'; import MRWidgetStore from 'ee/vue_merge_request_widget/stores/mr_widget_store'; import filterByKey from 'ee/vue_shared/security_reports/store/utils/filter_by_key'; -import mountComponent from 'spec/helpers/vue_mount_component_helper'; -import { TEST_HOST } from 'spec/test_constants'; +import mountComponent from 'helpers/vue_mount_component_helper'; +import { TEST_HOST } from 'helpers/test_constants'; +import waitForPromises from 'helpers/wait_for_promises'; import mockData, { baseIssues, @@ -13,7 +14,7 @@ import mockData, { headPerformance, parsedBaseIssues, parsedHeadIssues, -} from 'ee_spec/vue_mr_widget/mock_data'; +} from './mock_data'; import { SUCCESS } from '~/vue_merge_request_widget/components/deployment/constants'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; @@ -25,7 +26,7 @@ import { containerScanningDiffSuccessMock, dependencyScanningDiffSuccessMock, secretScanningDiffSuccessMock, -} from 'ee_spec/vue_shared/security_reports/mock_data'; +} from 'ee_jest/vue_shared/security_reports/mock_data'; const SAST_SELECTOR = '.js-sast-widget'; const DAST_SELECTOR = '.js-dast-widget'; @@ -58,9 +59,16 @@ describe('ee merge request widget options', () => { }); afterEach(() => { - vm.$destroy(); - mock.restore(); - gon.features = {}; + // This is needed because the `fetchInitialData` is triggered while + // the `mock.restore` is trying to clean up, causing a bunch of + // unmocked requests... + // This is not ideal and will be cleaned up in + // https://gitlab.com/gitlab-org/gitlab/-/issues/214032 + return waitForPromises().then(() => { + vm.$destroy(); + mock.restore(); + gon.features = {}; + }); }); const findSecurityWidget = () => vm.$el.querySelector('.js-security-widget'); @@ -104,7 +112,7 @@ describe('ee merge request widget options', () => { }); it('should render provided data', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( findSecurityWidget().querySelector( @@ -113,7 +121,7 @@ describe('ee merge request widget options', () => { ), ).toEqual('SAST detected 1 new, and 2 fixed vulnerabilities'); done(); - }, 0); + }); }); }); @@ -126,7 +134,7 @@ describe('ee merge request widget options', () => { }); it('should render provided data', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( findSecurityWidget().querySelector( @@ -135,7 +143,7 @@ describe('ee merge request widget options', () => { ).trim(), ).toEqual('SAST detected no vulnerabilities'); done(); - }, 0); + }); }); }); @@ -148,12 +156,12 @@ describe('ee merge request widget options', () => { }); it('should render error indicator', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine(findSecurityWidget().querySelector(SAST_SELECTOR).textContent), ).toContain('SAST: Loading resulted in an error'); done(); - }, 0); + }); }); }); }); @@ -196,7 +204,7 @@ describe('ee merge request widget options', () => { }); it('should render provided data', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( findSecurityWidget().querySelector( @@ -205,7 +213,7 @@ describe('ee merge request widget options', () => { ), ).toEqual('Dependency scanning detected 2 new, and 1 fixed vulnerabilities'); done(); - }, 0); + }); }); }); @@ -222,7 +230,7 @@ describe('ee merge request widget options', () => { }); it('renders no new vulnerabilities message', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( findSecurityWidget().querySelector( @@ -231,7 +239,7 @@ describe('ee merge request widget options', () => { ), ).toEqual('Dependency scanning detected no new vulnerabilities'); done(); - }, 0); + }); }); }); @@ -244,7 +252,7 @@ describe('ee merge request widget options', () => { }); it('should render provided data', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( findSecurityWidget().querySelector( @@ -253,7 +261,7 @@ describe('ee merge request widget options', () => { ), ).toEqual('Dependency scanning detected no vulnerabilities'); done(); - }, 0); + }); }); }); @@ -265,14 +273,14 @@ describe('ee merge request widget options', () => { }); it('should render error indicator', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( findSecurityWidget().querySelector(DEPENDENCY_SCANNING_SELECTOR).textContent, ), ).toContain('Dependency scanning: Loading resulted in an error'); done(); - }, 0); + }); }); }); }); @@ -320,7 +328,7 @@ describe('ee merge request widget options', () => { vm.mr.codeclimate = gl.mrWidgetData.codeclimate; // mock worker response - spyOn(MRWidgetStore, 'doCodeClimateComparison').and.callFake(() => + jest.spyOn(MRWidgetStore, 'doCodeClimateComparison').mockImplementation(() => Promise.resolve({ newIssues: filterByKey(parsedHeadIssues, parsedBaseIssues, 'fingerprint'), resolvedIssues: filterByKey(parsedBaseIssues, parsedHeadIssues, 'fingerprint'), @@ -329,19 +337,19 @@ describe('ee merge request widget options', () => { }); it('should render provided data', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent, ), ).toEqual('Code quality improved on 1 point and degraded on 1 point'); done(); - }, 0); + }); }); describe('text connector', () => { it('should only render information about fixed issues', done => { - setTimeout(() => { + setImmediate(() => { vm.mr.codeclimateMetrics.newIssues = []; Vue.nextTick(() => { @@ -352,11 +360,11 @@ describe('ee merge request widget options', () => { ).toEqual('Code quality improved on 1 point'); done(); }); - }, 0); + }); }); it('should only render information about added issues', done => { - setTimeout(() => { + setImmediate(() => { vm.mr.codeclimateMetrics.resolvedIssues = []; Vue.nextTick(() => { expect( @@ -366,7 +374,7 @@ describe('ee merge request widget options', () => { ).toEqual('Code quality degraded on 1 point'); done(); }); - }, 0); + }); }); }); }); @@ -384,7 +392,7 @@ describe('ee merge request widget options', () => { vm.mr.codeclimate = gl.mrWidgetData.codeclimate; // mock worker response - spyOn(MRWidgetStore, 'doCodeClimateComparison').and.callFake(() => + jest.spyOn(MRWidgetStore, 'doCodeClimateComparison').mockImplementation(() => Promise.resolve({ newIssues: filterByKey([], [], 'fingerprint'), resolvedIssues: filterByKey([], [], 'fingerprint'), @@ -397,14 +405,14 @@ describe('ee merge request widget options', () => { }); it('should render provided data', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent, ), ).toEqual('No changes to code quality'); done(); - }, 0); + }); }); }); @@ -420,22 +428,22 @@ describe('ee merge request widget options', () => { }); it('should render error indicator', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent, ), ).toContain('Failed to load codeclimate report'); done(); - }, 0); + }); }); it('should render a help icon with more information', done => { - setTimeout(() => { + setImmediate(() => { expect(vm.$el.querySelector('.js-codequality-widget .btn-help')).not.toBeNull(); expect(vm.codequalityPopover.title).toBe('Base pipeline codequality artifact not found'); done(); - }, 0); + }); }); }); @@ -452,18 +460,20 @@ describe('ee merge request widget options', () => { vm.mr.codeclimate = gl.mrWidgetData.codeclimate; // mock worker rejection - spyOn(MRWidgetStore, 'doCodeClimateComparison').and.callFake(() => Promise.reject()); + jest + .spyOn(MRWidgetStore, 'doCodeClimateComparison') + .mockImplementation(() => Promise.reject()); }); it('should render error indicator', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent, ), ).toEqual('Failed to load codeclimate report'); done(); - }, 0); + }); }); }); @@ -481,14 +491,14 @@ describe('ee merge request widget options', () => { }); it('should render error indicator', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent, ), ).toContain('Failed to load codeclimate report'); done(); - }, 0); + }); }); }); }); @@ -536,19 +546,19 @@ describe('ee merge request widget options', () => { }); it('should render provided data', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( vm.$el.querySelector('.js-performance-widget .js-code-text').textContent, ), ).toEqual('Performance metrics improved on 2 points and degraded on 1 point'); done(); - }, 0); + }); }); describe('text connector', () => { it('should only render information about fixed issues', done => { - setTimeout(() => { + setImmediate(() => { vm.mr.performanceMetrics.degraded = []; Vue.nextTick(() => { @@ -559,11 +569,11 @@ describe('ee merge request widget options', () => { ).toEqual('Performance metrics improved on 2 points'); done(); }); - }, 0); + }); }); it('should only render information about added issues', done => { - setTimeout(() => { + setImmediate(() => { vm.mr.performanceMetrics.improved = []; Vue.nextTick(() => { @@ -574,7 +584,7 @@ describe('ee merge request widget options', () => { ).toEqual('Performance metrics degraded on 1 point'); done(); }); - }, 0); + }); }); }); }); @@ -592,7 +602,7 @@ describe('ee merge request widget options', () => { vm.mr.performance = gl.mrWidgetData.performance; // wait for network request from component watch update method - setTimeout(done, 0); + setImmediate(done); }); it('should render provided data', () => { @@ -628,14 +638,14 @@ describe('ee merge request widget options', () => { }); it('should render error indicator', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( vm.$el.querySelector('.js-performance-widget .js-code-text').textContent, ), ).toContain('Failed to load performance report'); done(); - }, 0); + }); }); }); }); @@ -678,7 +688,7 @@ describe('ee merge request widget options', () => { }); it('should render provided data', done => { - setTimeout(() => { + setImmediate(() => { expect( removeBreakLine( findSecurityWidget().querySelector( @@ -687,7 +697,7 @@ describe('ee merge request widget options', () => { ), ).toEqual('Container scanning detected 2 new, and 1 fixed vulnerabilities'); done(); - }, 0); + }); }); }); @@ -700,14 +710,14 @@ describe('ee merge request widget options', () => { }); it('should render error indicator', done => { - setTimeout(() => { + setImmediate(() => { expect( findSecurityWidget() .querySelector(CONTAINER_SCANNING_SELECTOR) .textContent.trim(), ).toContain('Container scanning: Loading resulted in an error'); done(); - }, 0); + }); }); }); }); @@ -750,14 +760,14 @@ describe('ee merge request widget options', () => { }); it('should render provided data', done => { - setTimeout(() => { + setImmediate(() => { expect( findSecurityWidget() .querySelector(`${DAST_SELECTOR} .report-block-list-issue-description`) .textContent.trim(), ).toEqual('DAST detected 1 new, and 2 fixed vulnerabilities'); done(); - }, 0); + }); }); }); @@ -770,14 +780,14 @@ describe('ee merge request widget options', () => { }); it('should render error indicator', done => { - setTimeout(() => { + setImmediate(() => { expect( findSecurityWidget() .querySelector(DAST_SELECTOR) .textContent.trim(), ).toContain('DAST: Loading resulted in an error'); done(); - }, 0); + }); }); }); }); @@ -1024,7 +1034,7 @@ describe('ee merge request widget options', () => { describe('CI widget', () => { it('renders the branch in the pipeline widget', () => { - const sourceBranchLink = 'Link'; + const sourceBranchLink = 'Link'; vm = mountComponent(Component, { mrData: { ...mockData, @@ -1034,7 +1044,7 @@ describe('ee merge request widget options', () => { const ciWidget = vm.$el.querySelector('.mr-state-widget .label-branch'); - expect(ciWidget).toContainHtml(sourceBranchLink); + expect(ciWidget.innerHTML).toBe(sourceBranchLink); }); }); @@ -1076,7 +1086,7 @@ describe('ee merge request widget options', () => { const helperText = getHelperTextElement(); expect(helperText).toExist(); - expect(helperText).toContainText( + expect(helperText.textContent).toContain( 'This merge request will be added to the merge train when pipeline #123 succeeds.', ); }); @@ -1099,7 +1109,7 @@ describe('ee merge request widget options', () => { const helperText = getHelperTextElement(); expect(helperText).toExist(); - expect(helperText).toContainText( + expect(helperText.textContent).toContain( 'This merge request will start a merge train when pipeline #123 succeeds.', ); }); @@ -1122,7 +1132,7 @@ describe('ee merge request widget options', () => { const pipelineLink = getHelperTextElement().querySelector('.js-pipeline-link'); expect(pipelineLink).toExist(); - expect(pipelineLink).toContainText('#123'); + expect(pipelineLink.textContent).toContain('#123'); expect(pipelineLink).toHaveAttr('href', 'path/to/pipeline'); }); @@ -1142,7 +1152,7 @@ describe('ee merge request widget options', () => { const pipelineLink = getHelperTextElement().querySelector('.js-documentation-link'); expect(pipelineLink).toExist(); - expect(pipelineLink).toContainText('More information'); + expect(pipelineLink.textContent).toContain('More information'); expect(pipelineLink).toHaveAttr('href', 'path/to/help'); }); }); @@ -1163,7 +1173,7 @@ describe('ee merge request widget options', () => { }, }); - expect(vm.service).toEqual(jasmine.objectContaining(convertObjectPropsToCamelCase(paths))); + expect(vm.service).toEqual(expect.objectContaining(convertObjectPropsToCamelCase(paths))); }); }); -- GitLab From 29e0f3bc2f601fced00e0f0fb09af03c9c1e1c62 Mon Sep 17 00:00:00 2001 From: Jackie Fraser Date: Mon, 13 Apr 2020 21:35:36 -0400 Subject: [PATCH 3/3] Apply review feedback --- .../mr_widget_pipeline_container_spec.js | 20 ++- .../ee_mr_widget_options_spec.js | 134 ++++++------------ 2 files changed, 56 insertions(+), 98 deletions(-) diff --git a/ee/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js b/ee/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js index 9c0bff9f9e3923..64982880fbe71a 100644 --- a/ee/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js +++ b/ee/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js @@ -1,4 +1,4 @@ -import { mount, shallowMount, createLocalVue } from '@vue/test-utils'; +import { mount, shallowMount } from '@vue/test-utils'; import MergeTrainPositionIndicator from 'ee/vue_merge_request_widget/components/merge_train_position_indicator.vue'; import VisualReviewAppLink from 'ee/vue_merge_request_widget/components/visual_review_app_link.vue'; import { mockStore } from 'jest/vue_mr_widget/mock_data'; @@ -11,23 +11,27 @@ describe('MrWidgetPipelineContainer', () => { let wrapper; let mock; - const factory = (method = shallowMount, mrUpdates = {}, provide = {}) => { - const localVue = createLocalVue(); + beforeEach(() => { + mock = new MockAdapter(axios); + mock.onGet().reply(200, {}); + }); - wrapper = method.call(this, localVue.extend(MrWidgetPipelineContainer), { + const factory = (method = shallowMount, mrUpdates = {}, provide = {}) => { + wrapper = method.call(this, MrWidgetPipelineContainer, { propsData: { mr: Object.assign({}, mockStore, mrUpdates), }, provide: { ...provide, }, - localVue, attachToDocument: true, }); }; afterEach(() => { + mock.restore(); wrapper.destroy(); + wrapper = null; }); describe('merge train indicator', () => { @@ -61,9 +65,6 @@ describe('MrWidgetPipelineContainer', () => { describe('with anonymous visual review feedback feature flag enabled', () => { beforeEach(() => { - mock = new MockAdapter(axios); - mock.onGet().reply(200, {}); - factory( mount, { @@ -101,9 +102,6 @@ describe('MrWidgetPipelineContainer', () => { describe('with anonymous visual review feedback feature flag disabled', () => { beforeEach(() => { - mock = new MockAdapter(axios); - mock.onGet().reply(200, {}); - factory( mount, { diff --git a/ee/spec/frontend/vue_mr_widget/ee_mr_widget_options_spec.js b/ee/spec/frontend/vue_mr_widget/ee_mr_widget_options_spec.js index 4221390c25246b..ad5e1954d2d1a8 100644 --- a/ee/spec/frontend/vue_mr_widget/ee_mr_widget_options_spec.js +++ b/ee/spec/frontend/vue_mr_widget/ee_mr_widget_options_spec.js @@ -6,6 +6,7 @@ import filterByKey from 'ee/vue_shared/security_reports/store/utils/filter_by_ke import mountComponent from 'helpers/vue_mount_component_helper'; import { TEST_HOST } from 'helpers/test_constants'; import waitForPromises from 'helpers/wait_for_promises'; +import { trimText } from 'helpers/text_helper'; import mockData, { baseIssues, @@ -39,13 +40,6 @@ describe('ee merge request widget options', () => { let mock; let Component; - function removeBreakLine(data) { - return data - .replace(/\r?\n|\r/g, '') - .replace(/\s\s+/g, ' ') - .trim(); - } - beforeEach(() => { delete mrWidgetOptions.extends.el; // Prevent component mounting @@ -114,7 +108,7 @@ describe('ee merge request widget options', () => { it('should render provided data', done => { setImmediate(() => { expect( - removeBreakLine( + trimText( findSecurityWidget().querySelector( `${SAST_SELECTOR} .report-block-list-issue-description`, ).textContent, @@ -136,7 +130,7 @@ describe('ee merge request widget options', () => { it('should render provided data', done => { setImmediate(() => { expect( - removeBreakLine( + trimText( findSecurityWidget().querySelector( `${SAST_SELECTOR} .report-block-list-issue-description`, ).textContent, @@ -157,9 +151,9 @@ describe('ee merge request widget options', () => { it('should render error indicator', done => { setImmediate(() => { - expect( - removeBreakLine(findSecurityWidget().querySelector(SAST_SELECTOR).textContent), - ).toContain('SAST: Loading resulted in an error'); + expect(trimText(findSecurityWidget().querySelector(SAST_SELECTOR).textContent)).toContain( + 'SAST: Loading resulted in an error', + ); done(); }); }); @@ -188,9 +182,7 @@ describe('ee merge request widget options', () => { vm = mountComponent(Component, { mrData: gl.mrWidgetData }); expect( - removeBreakLine( - findSecurityWidget().querySelector(DEPENDENCY_SCANNING_SELECTOR).textContent, - ), + trimText(findSecurityWidget().querySelector(DEPENDENCY_SCANNING_SELECTOR).textContent), ).toContain('Dependency scanning is loading'); }); }); @@ -206,7 +198,7 @@ describe('ee merge request widget options', () => { it('should render provided data', done => { setImmediate(() => { expect( - removeBreakLine( + trimText( findSecurityWidget().querySelector( `${DEPENDENCY_SCANNING_SELECTOR} .report-block-list-issue-description`, ).textContent, @@ -232,7 +224,7 @@ describe('ee merge request widget options', () => { it('renders no new vulnerabilities message', done => { setImmediate(() => { expect( - removeBreakLine( + trimText( findSecurityWidget().querySelector( `${DEPENDENCY_SCANNING_SELECTOR} .report-block-list-issue-description`, ).textContent, @@ -254,7 +246,7 @@ describe('ee merge request widget options', () => { it('should render provided data', done => { setImmediate(() => { expect( - removeBreakLine( + trimText( findSecurityWidget().querySelector( `${DEPENDENCY_SCANNING_SELECTOR} .report-block-list-issue-description`, ).textContent, @@ -275,9 +267,7 @@ describe('ee merge request widget options', () => { it('should render error indicator', done => { setImmediate(() => { expect( - removeBreakLine( - findSecurityWidget().querySelector(DEPENDENCY_SCANNING_SELECTOR).textContent, - ), + trimText(findSecurityWidget().querySelector(DEPENDENCY_SCANNING_SELECTOR).textContent), ).toContain('Dependency scanning: Loading resulted in an error'); done(); }); @@ -305,9 +295,9 @@ describe('ee merge request widget options', () => { }; vm.$nextTick(() => { - expect( - removeBreakLine(vm.$el.querySelector('.js-codequality-widget').textContent), - ).toContain('Loading codeclimate report'); + expect(trimText(vm.$el.querySelector('.js-codequality-widget').textContent)).toContain( + 'Loading codeclimate report', + ); done(); }); @@ -328,20 +318,16 @@ describe('ee merge request widget options', () => { vm.mr.codeclimate = gl.mrWidgetData.codeclimate; // mock worker response - jest.spyOn(MRWidgetStore, 'doCodeClimateComparison').mockImplementation(() => - Promise.resolve({ - newIssues: filterByKey(parsedHeadIssues, parsedBaseIssues, 'fingerprint'), - resolvedIssues: filterByKey(parsedBaseIssues, parsedHeadIssues, 'fingerprint'), - }), - ); + jest.spyOn(MRWidgetStore, 'doCodeClimateComparison').mockResolvedValue({ + newIssues: filterByKey(parsedHeadIssues, parsedBaseIssues, 'fingerprint'), + resolvedIssues: filterByKey(parsedBaseIssues, parsedHeadIssues, 'fingerprint'), + }); }); it('should render provided data', done => { setImmediate(() => { expect( - removeBreakLine( - vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent, - ), + trimText(vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent), ).toEqual('Code quality improved on 1 point and degraded on 1 point'); done(); }); @@ -354,9 +340,7 @@ describe('ee merge request widget options', () => { Vue.nextTick(() => { expect( - removeBreakLine( - vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent, - ), + trimText(vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent), ).toEqual('Code quality improved on 1 point'); done(); }); @@ -368,9 +352,7 @@ describe('ee merge request widget options', () => { vm.mr.codeclimateMetrics.resolvedIssues = []; Vue.nextTick(() => { expect( - removeBreakLine( - vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent, - ), + trimText(vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent), ).toEqual('Code quality degraded on 1 point'); done(); }); @@ -392,12 +374,10 @@ describe('ee merge request widget options', () => { vm.mr.codeclimate = gl.mrWidgetData.codeclimate; // mock worker response - jest.spyOn(MRWidgetStore, 'doCodeClimateComparison').mockImplementation(() => - Promise.resolve({ - newIssues: filterByKey([], [], 'fingerprint'), - resolvedIssues: filterByKey([], [], 'fingerprint'), - }), - ); + jest.spyOn(MRWidgetStore, 'doCodeClimateComparison').mockResolvedValue({ + newIssues: filterByKey([], [], 'fingerprint'), + resolvedIssues: filterByKey([], [], 'fingerprint'), + }); }); afterEach(() => { @@ -407,9 +387,7 @@ describe('ee merge request widget options', () => { it('should render provided data', done => { setImmediate(() => { expect( - removeBreakLine( - vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent, - ), + trimText(vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent), ).toEqual('No changes to code quality'); done(); }); @@ -430,9 +408,7 @@ describe('ee merge request widget options', () => { it('should render error indicator', done => { setImmediate(() => { expect( - removeBreakLine( - vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent, - ), + trimText(vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent), ).toContain('Failed to load codeclimate report'); done(); }); @@ -460,17 +436,13 @@ describe('ee merge request widget options', () => { vm.mr.codeclimate = gl.mrWidgetData.codeclimate; // mock worker rejection - jest - .spyOn(MRWidgetStore, 'doCodeClimateComparison') - .mockImplementation(() => Promise.reject()); + jest.spyOn(MRWidgetStore, 'doCodeClimateComparison').mockRejectedValue(); }); it('should render error indicator', done => { setImmediate(() => { expect( - removeBreakLine( - vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent, - ), + trimText(vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent), ).toEqual('Failed to load codeclimate report'); done(); }); @@ -493,9 +465,7 @@ describe('ee merge request widget options', () => { it('should render error indicator', done => { setImmediate(() => { expect( - removeBreakLine( - vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent, - ), + trimText(vm.$el.querySelector('.js-codequality-widget .js-code-text').textContent), ).toContain('Failed to load codeclimate report'); done(); }); @@ -523,9 +493,9 @@ describe('ee merge request widget options', () => { }; vm.$nextTick(() => { - expect( - removeBreakLine(vm.$el.querySelector('.js-performance-widget').textContent), - ).toContain('Loading performance report'); + expect(trimText(vm.$el.querySelector('.js-performance-widget').textContent)).toContain( + 'Loading performance report', + ); done(); }); @@ -548,9 +518,7 @@ describe('ee merge request widget options', () => { it('should render provided data', done => { setImmediate(() => { expect( - removeBreakLine( - vm.$el.querySelector('.js-performance-widget .js-code-text').textContent, - ), + trimText(vm.$el.querySelector('.js-performance-widget .js-code-text').textContent), ).toEqual('Performance metrics improved on 2 points and degraded on 1 point'); done(); }); @@ -563,9 +531,7 @@ describe('ee merge request widget options', () => { Vue.nextTick(() => { expect( - removeBreakLine( - vm.$el.querySelector('.js-performance-widget .js-code-text').textContent, - ), + trimText(vm.$el.querySelector('.js-performance-widget .js-code-text').textContent), ).toEqual('Performance metrics improved on 2 points'); done(); }); @@ -578,9 +544,7 @@ describe('ee merge request widget options', () => { Vue.nextTick(() => { expect( - removeBreakLine( - vm.$el.querySelector('.js-performance-widget .js-code-text').textContent, - ), + trimText(vm.$el.querySelector('.js-performance-widget .js-code-text').textContent), ).toEqual('Performance metrics degraded on 1 point'); done(); }); @@ -607,7 +571,7 @@ describe('ee merge request widget options', () => { it('should render provided data', () => { expect( - removeBreakLine(vm.$el.querySelector('.js-performance-widget .js-code-text').textContent), + trimText(vm.$el.querySelector('.js-performance-widget .js-code-text').textContent), ).toEqual('No changes to performance metrics'); }); @@ -640,9 +604,7 @@ describe('ee merge request widget options', () => { it('should render error indicator', done => { setImmediate(() => { expect( - removeBreakLine( - vm.$el.querySelector('.js-performance-widget .js-code-text').textContent, - ), + trimText(vm.$el.querySelector('.js-performance-widget .js-code-text').textContent), ).toContain('Failed to load performance report'); done(); }); @@ -672,9 +634,7 @@ describe('ee merge request widget options', () => { vm = mountComponent(Component, { mrData: gl.mrWidgetData }); expect( - removeBreakLine( - findSecurityWidget().querySelector(CONTAINER_SCANNING_SELECTOR).textContent, - ), + trimText(findSecurityWidget().querySelector(CONTAINER_SCANNING_SELECTOR).textContent), ).toContain('Container scanning is loading'); }); }); @@ -690,7 +650,7 @@ describe('ee merge request widget options', () => { it('should render provided data', done => { setImmediate(() => { expect( - removeBreakLine( + trimText( findSecurityWidget().querySelector( `${CONTAINER_SCANNING_SELECTOR} .report-block-list-issue-description`, ).textContent, @@ -818,7 +778,7 @@ describe('ee merge request widget options', () => { vm = mountComponent(Component, { mrData: gl.mrWidgetData }); expect( - removeBreakLine(findSecurityWidget().querySelector(SECRET_SCANNING_SELECTOR).textContent), + trimText(findSecurityWidget().querySelector(SECRET_SCANNING_SELECTOR).textContent), ).toContain('Secret scanning is loading'); }); }); @@ -832,16 +792,16 @@ describe('ee merge request widget options', () => { }); it('should render provided data', done => { - setTimeout(() => { + setImmediate(() => { expect( - removeBreakLine( + trimText( findSecurityWidget().querySelector( `${SECRET_SCANNING_SELECTOR} .report-block-list-issue-description`, ).textContent, ), ).toEqual('Secret scanning detected 2 new, and 1 fixed vulnerabilities'); done(); - }, 0); + }); }); }); @@ -854,14 +814,14 @@ describe('ee merge request widget options', () => { }); it('should render error indicator', done => { - setTimeout(() => { + setImmediate(() => { expect( findSecurityWidget() .querySelector(SECRET_SCANNING_SELECTOR) .textContent.trim(), ).toContain('Secret scanning: Loading resulted in an error'); done(); - }, 0); + }); }); }); }); @@ -1173,7 +1133,7 @@ describe('ee merge request widget options', () => { }, }); - expect(vm.service).toEqual(expect.objectContaining(convertObjectPropsToCamelCase(paths))); + expect(vm.service).toMatchObject(convertObjectPropsToCamelCase(paths)); }); }); -- GitLab