Commit d7525c0e authored by Phil Hughes's avatar Phil Hughes

FIxes karma and EE entity specs

Fixes the JS tests by setting the mrData as a prop
Also fixes some tests by adding in the mock on the
network call
parent ad80dd6d
...@@ -80,10 +80,12 @@ export default { ...@@ -80,10 +80,12 @@ export default {
}, },
}, },
data() { data() {
const store = this.mrData ? new MRWidgetStore(this.mrData) : null;
return { return {
mr: null, mr: store,
state: null, state: store && store.state,
service: null, service: store && this.createService(store),
}; };
}, },
computed: { computed: {
...@@ -131,12 +133,21 @@ export default { ...@@ -131,12 +133,21 @@ export default {
} }
}, },
}, },
created() {},
mounted() { mounted() {
return MRWidgetService.fetchInitialData().then(({ data }) => { return MRWidgetService.fetchInitialData().then(({ data }) => {
if (this.mr) {
this.mr.setData({ ...window.gl.mrWidgetData, ...data });
} else {
this.mr = new MRWidgetStore({ ...window.gl.mrWidgetData, ...data }); this.mr = new MRWidgetStore({ ...window.gl.mrWidgetData, ...data });
}
if (!this.state) {
this.state = this.mr.state; this.state = this.mr.state;
}
if (!this.service) {
this.service = this.createService(this.mr); this.service = this.createService(this.mr);
}
this.setFaviconHelper(); this.setFaviconHelper();
this.initDeploymentsPolling(); this.initDeploymentsPolling();
...@@ -152,8 +163,13 @@ export default { ...@@ -152,8 +163,13 @@ export default {
}, },
beforeDestroy() { beforeDestroy() {
eventHub.$off('mr.discussion.updated', this.checkStatus); eventHub.$off('mr.discussion.updated', this.checkStatus);
if (this.pollingInterval) {
this.pollingInterval.destroy(); this.pollingInterval.destroy();
}
if (this.deploymentsInterval) {
this.deploymentsInterval.destroy(); this.deploymentsInterval.destroy();
}
if (this.postMergeDeploymentsInterval) { if (this.postMergeDeploymentsInterval) {
this.postMergeDeploymentsInterval.destroy(); this.postMergeDeploymentsInterval.destroy();
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
class MergeRequestWidgetEntity < Grape::Entity class MergeRequestWidgetEntity < Grape::Entity
include RequestAwareEntity include RequestAwareEntity
expose :id
expose :iid expose :iid
expose :source_project_full_path do |merge_request| expose :source_project_full_path do |merge_request|
......
import Vue from 'vue'; import Vue from 'vue';
import MockAdapter from 'axios-mock-adapter'; import MockAdapter from 'axios-mock-adapter';
import mrWidgetOptions from 'ee/vue_merge_request_widget/mr_widget_options.vue'; import mrWidgetOptions from 'ee/vue_merge_request_widget/mr_widget_options.vue';
import MRWidgetService from 'ee/vue_merge_request_widget/services/mr_widget_service';
import MRWidgetStore from 'ee/vue_merge_request_widget/stores/mr_widget_store'; 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 filterByKey from 'ee/vue_shared/security_reports/store/utils/filter_by_key';
import mountComponent from 'spec/helpers/vue_mount_component_helper'; import mountComponent from 'spec/helpers/vue_mount_component_helper';
import { TEST_HOST } from 'spec/test_constants'; import { TEST_HOST } from 'spec/test_constants';
import state from 'ee/vue_shared/security_reports/store/state';
import mockData, { import mockData, {
baseIssues, baseIssues,
headIssues, headIssues,
...@@ -48,19 +46,14 @@ describe('ee merge request widget options', () => { ...@@ -48,19 +46,14 @@ describe('ee merge request widget options', () => {
Component = Vue.extend(mrWidgetOptions); Component = Vue.extend(mrWidgetOptions);
mock = new MockAdapter(axios); mock = new MockAdapter(axios);
mock.onGet(mockData.merge_request_widget_path).reply(() => [200, gl.mrWidgetData]);
mock.onGet(mockData.merge_request_cached_widget_path).reply(() => [200, gl.mrWidgetData]);
}); });
afterEach(() => { afterEach(() => {
vm.$destroy(); vm.$destroy();
mock.restore(); mock.restore();
if (Component.mr) {
// Clean security reports state
Component.mr.sast = state().sast;
Component.mr.sastContainer = state().sastContainer;
Component.mr.dast = state().dast;
Component.mr.dependencyScanning = state().dependencyScanning;
}
}); });
describe('security widget', () => { describe('security widget', () => {
...@@ -73,9 +66,6 @@ describe('ee merge request widget options', () => { ...@@ -73,9 +66,6 @@ describe('ee merge request widget options', () => {
}, },
vulnerability_feedback_path: 'vulnerability_feedback_path', vulnerability_feedback_path: 'vulnerability_feedback_path',
}; };
Component.mr = new MRWidgetStore(gl.mrWidgetData);
Component.service = new MRWidgetService({});
}); });
describe('when it is loading', () => { describe('when it is loading', () => {
...@@ -84,7 +74,7 @@ describe('ee merge request widget options', () => { ...@@ -84,7 +74,7 @@ describe('ee merge request widget options', () => {
mock.onGet('head_path.json').reply(200, sastHeadAllIssues); mock.onGet('head_path.json').reply(200, sastHeadAllIssues);
mock.onGet('vulnerability_feedback_path').reply(200, []); mock.onGet('vulnerability_feedback_path').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
expect(vm.$el.querySelector('.js-sast-widget').textContent.trim()).toContain( expect(vm.$el.querySelector('.js-sast-widget').textContent.trim()).toContain(
'SAST is loading', 'SAST is loading',
...@@ -97,7 +87,7 @@ describe('ee merge request widget options', () => { ...@@ -97,7 +87,7 @@ describe('ee merge request widget options', () => {
mock.onGet('path.json').reply(200, sastIssuesBase); mock.onGet('path.json').reply(200, sastIssuesBase);
mock.onGet('head_path.json').reply(200, sastIssues); mock.onGet('head_path.json').reply(200, sastIssues);
mock.onGet('vulnerability_feedback_path').reply(200, []); mock.onGet('vulnerability_feedback_path').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
}); });
it('should render provided data', done => { it('should render provided data', done => {
...@@ -119,7 +109,7 @@ describe('ee merge request widget options', () => { ...@@ -119,7 +109,7 @@ describe('ee merge request widget options', () => {
mock.onGet('head_path.json').reply(200, sastBaseAllIssues); mock.onGet('head_path.json').reply(200, sastBaseAllIssues);
mock.onGet('vulnerability_feedback_path').reply(200, []); mock.onGet('vulnerability_feedback_path').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
}); });
it('renders no new vulnerabilities message', done => { it('renders no new vulnerabilities message', done => {
...@@ -141,7 +131,7 @@ describe('ee merge request widget options', () => { ...@@ -141,7 +131,7 @@ describe('ee merge request widget options', () => {
mock.onGet('head_path.json').reply(200, []); mock.onGet('head_path.json').reply(200, []);
mock.onGet('vulnerability_feedback_path').reply(200, []); mock.onGet('vulnerability_feedback_path').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
}); });
it('should render provided data', done => { it('should render provided data', done => {
...@@ -163,7 +153,7 @@ describe('ee merge request widget options', () => { ...@@ -163,7 +153,7 @@ describe('ee merge request widget options', () => {
mock.onGet('head_path.json').reply(500, []); mock.onGet('head_path.json').reply(500, []);
mock.onGet('vulnerability_feedback_path').reply(500, []); mock.onGet('vulnerability_feedback_path').reply(500, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
}); });
it('should render error indicator', done => { it('should render error indicator', done => {
...@@ -187,9 +177,6 @@ describe('ee merge request widget options', () => { ...@@ -187,9 +177,6 @@ describe('ee merge request widget options', () => {
}, },
vulnerability_feedback_path: 'vulnerability_feedback_path', vulnerability_feedback_path: 'vulnerability_feedback_path',
}; };
Component.mr = new MRWidgetStore(gl.mrWidgetData);
Component.service = new MRWidgetService({});
}); });
describe('when it is loading', () => { describe('when it is loading', () => {
...@@ -198,7 +185,7 @@ describe('ee merge request widget options', () => { ...@@ -198,7 +185,7 @@ describe('ee merge request widget options', () => {
mock.onGet('head_path.json').reply(200, sastIssues); mock.onGet('head_path.json').reply(200, sastIssues);
mock.onGet('vulnerability_feedback_path').reply(200, []); mock.onGet('vulnerability_feedback_path').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
expect( expect(
removeBreakLine(vm.$el.querySelector('.js-dependency-scanning-widget').textContent), removeBreakLine(vm.$el.querySelector('.js-dependency-scanning-widget').textContent),
...@@ -212,7 +199,7 @@ describe('ee merge request widget options', () => { ...@@ -212,7 +199,7 @@ describe('ee merge request widget options', () => {
mock.onGet('head_path.json').reply(200, sastIssues); mock.onGet('head_path.json').reply(200, sastIssues);
mock.onGet('vulnerability_feedback_path').reply(200, []); mock.onGet('vulnerability_feedback_path').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
}); });
it('should render provided data', done => { it('should render provided data', done => {
...@@ -235,7 +222,7 @@ describe('ee merge request widget options', () => { ...@@ -235,7 +222,7 @@ describe('ee merge request widget options', () => {
mock.onGet('head_path.json').reply(200, sastBaseAllIssues); mock.onGet('head_path.json').reply(200, sastBaseAllIssues);
mock.onGet('vulnerability_feedback_path').reply(200, []); mock.onGet('vulnerability_feedback_path').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
}); });
it('renders no new vulnerabilities message', done => { it('renders no new vulnerabilities message', done => {
...@@ -258,7 +245,7 @@ describe('ee merge request widget options', () => { ...@@ -258,7 +245,7 @@ describe('ee merge request widget options', () => {
mock.onGet('head_path.json').reply(200, []); mock.onGet('head_path.json').reply(200, []);
mock.onGet('vulnerability_feedback_path').reply(200, []); mock.onGet('vulnerability_feedback_path').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
}); });
it('should render provided data', done => { it('should render provided data', done => {
...@@ -281,7 +268,7 @@ describe('ee merge request widget options', () => { ...@@ -281,7 +268,7 @@ describe('ee merge request widget options', () => {
mock.onGet('head_path.json').reply(500, []); mock.onGet('head_path.json').reply(500, []);
mock.onGet('vulnerability_feedback_path').reply(500, []); mock.onGet('vulnerability_feedback_path').reply(500, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
}); });
it('should render error indicator', done => { it('should render error indicator', done => {
...@@ -299,25 +286,28 @@ describe('ee merge request widget options', () => { ...@@ -299,25 +286,28 @@ describe('ee merge request widget options', () => {
beforeEach(() => { beforeEach(() => {
gl.mrWidgetData = { gl.mrWidgetData = {
...mockData, ...mockData,
codeclimate: { codeclimate: {},
head_path: 'head.json',
base_path: 'base.json',
},
}; };
Component.mr = new MRWidgetStore(gl.mrWidgetData);
Component.service = new MRWidgetService({});
}); });
describe('when it is loading', () => { describe('when it is loading', () => {
it('should render loading indicator', () => { it('should render loading indicator', done => {
mock.onGet('head.json').reply(200, headIssues); mock.onGet('head.json').reply(200, headIssues);
mock.onGet('base.json').reply(200, baseIssues); mock.onGet('base.json').reply(200, baseIssues);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
vm.mr.codeclimate = {
head_path: 'head.json',
base_path: 'base.json',
};
vm.$nextTick(() => {
expect( expect(
removeBreakLine(vm.$el.querySelector('.js-codequality-widget').textContent), removeBreakLine(vm.$el.querySelector('.js-codequality-widget').textContent),
).toContain('Loading codeclimate report'); ).toContain('Loading codeclimate report');
done();
});
}); });
}); });
...@@ -325,7 +315,14 @@ describe('ee merge request widget options', () => { ...@@ -325,7 +315,14 @@ describe('ee merge request widget options', () => {
beforeEach(() => { beforeEach(() => {
mock.onGet('head.json').reply(200, headIssues); mock.onGet('head.json').reply(200, headIssues);
mock.onGet('base.json').reply(200, baseIssues); mock.onGet('base.json').reply(200, baseIssues);
vm = mountComponent(Component);
vm = mountComponent(Component, { mrData: gl.mrWidgetData });
gl.mrWidgetData.codeclimate = {
head_path: 'head.json',
base_path: 'base.json',
};
vm.mr.codeclimate = gl.mrWidgetData.codeclimate;
// mock worker response // mock worker response
spyOn(MRWidgetStore, 'doCodeClimateComparison').and.callFake(() => spyOn(MRWidgetStore, 'doCodeClimateComparison').and.callFake(() =>
...@@ -383,7 +380,13 @@ describe('ee merge request widget options', () => { ...@@ -383,7 +380,13 @@ describe('ee merge request widget options', () => {
beforeEach(() => { beforeEach(() => {
mock.onGet('head.json').reply(200, []); mock.onGet('head.json').reply(200, []);
mock.onGet('base.json').reply(200, []); mock.onGet('base.json').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
gl.mrWidgetData.codeclimate = {
head_path: 'head.json',
base_path: 'base.json',
};
vm.mr.codeclimate = gl.mrWidgetData.codeclimate;
// mock worker response // mock worker response
spyOn(MRWidgetStore, 'doCodeClimateComparison').and.callFake(() => spyOn(MRWidgetStore, 'doCodeClimateComparison').and.callFake(() =>
...@@ -414,7 +417,13 @@ describe('ee merge request widget options', () => { ...@@ -414,7 +417,13 @@ describe('ee merge request widget options', () => {
beforeEach(() => { beforeEach(() => {
mock.onGet('head.json').reply(200, headIssues); mock.onGet('head.json').reply(200, headIssues);
mock.onGet('base.json').reply(200, baseIssues); mock.onGet('base.json').reply(200, baseIssues);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
gl.mrWidgetData.codeclimate = {
head_path: 'head.json',
base_path: 'base.json',
};
vm.mr.codeclimate = gl.mrWidgetData.codeclimate;
// mock worker rejection // mock worker rejection
spyOn(MRWidgetStore, 'doCodeClimateComparison').and.callFake(() => Promise.reject()); spyOn(MRWidgetStore, 'doCodeClimateComparison').and.callFake(() => Promise.reject());
...@@ -436,7 +445,13 @@ describe('ee merge request widget options', () => { ...@@ -436,7 +445,13 @@ describe('ee merge request widget options', () => {
beforeEach(() => { beforeEach(() => {
mock.onGet('head.json').reply(500, []); mock.onGet('head.json').reply(500, []);
mock.onGet('base.json').reply(500, []); mock.onGet('base.json').reply(500, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
gl.mrWidgetData.codeclimate = {
head_path: 'head.json',
base_path: 'base.json',
};
vm.mr.codeclimate = gl.mrWidgetData.codeclimate;
}); });
it('should render error indicator', done => { it('should render error indicator', done => {
...@@ -456,25 +471,28 @@ describe('ee merge request widget options', () => { ...@@ -456,25 +471,28 @@ describe('ee merge request widget options', () => {
beforeEach(() => { beforeEach(() => {
gl.mrWidgetData = { gl.mrWidgetData = {
...mockData, ...mockData,
performance: { performance: {},
head_path: 'head.json',
base_path: 'base.json',
},
}; };
Component.mr = new MRWidgetStore(gl.mrWidgetData);
Component.service = new MRWidgetService({});
}); });
describe('when it is loading', () => { describe('when it is loading', () => {
it('should render loading indicator', () => { it('should render loading indicator', done => {
mock.onGet('head.json').reply(200, headPerformance); mock.onGet('head.json').reply(200, headPerformance);
mock.onGet('base.json').reply(200, basePerformance); mock.onGet('base.json').reply(200, basePerformance);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
vm.mr.performance = {
head_path: 'head.json',
base_path: 'base.json',
};
vm.$nextTick(() => {
expect( expect(
removeBreakLine(vm.$el.querySelector('.js-performance-widget').textContent), removeBreakLine(vm.$el.querySelector('.js-performance-widget').textContent),
).toContain('Loading performance report'); ).toContain('Loading performance report');
done();
});
}); });
}); });
...@@ -482,7 +500,13 @@ describe('ee merge request widget options', () => { ...@@ -482,7 +500,13 @@ describe('ee merge request widget options', () => {
beforeEach(() => { beforeEach(() => {
mock.onGet('head.json').reply(200, headPerformance); mock.onGet('head.json').reply(200, headPerformance);
mock.onGet('base.json').reply(200, basePerformance); mock.onGet('base.json').reply(200, basePerformance);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
gl.mrWidgetData.performance = {
head_path: 'head.json',
base_path: 'base.json',
};
vm.mr.performance = gl.mrWidgetData.performance;
}); });
it('should render provided data', done => { it('should render provided data', done => {
...@@ -533,8 +557,15 @@ describe('ee merge request widget options', () => { ...@@ -533,8 +557,15 @@ describe('ee merge request widget options', () => {
beforeEach(done => { beforeEach(done => {
mock.onGet('head.json').reply(200, []); mock.onGet('head.json').reply(200, []);
mock.onGet('base.json').reply(200, []); mock.onGet('base.json').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
// wait for network request from component created() method
gl.mrWidgetData.performance = {
head_path: 'head.json',
base_path: 'base.json',
};
vm.mr.performance = gl.mrWidgetData.performance;
// wait for network request from component watch update method
setTimeout(done, 0); setTimeout(done, 0);
}); });
...@@ -561,7 +592,13 @@ describe('ee merge request widget options', () => { ...@@ -561,7 +592,13 @@ describe('ee merge request widget options', () => {
beforeEach(() => { beforeEach(() => {
mock.onGet('head.json').reply(500, []); mock.onGet('head.json').reply(500, []);
mock.onGet('base.json').reply(500, []); mock.onGet('base.json').reply(500, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
gl.mrWidgetData.performance = {
head_path: 'head.json',
base_path: 'base.json',
};
vm.mr.performance = gl.mrWidgetData.performance;
}); });
it('should render error indicator', done => { it('should render error indicator', done => {
...@@ -587,9 +624,6 @@ describe('ee merge request widget options', () => { ...@@ -587,9 +624,6 @@ describe('ee merge request widget options', () => {
}, },
vulnerability_feedback_path: 'vulnerability_feedback_path', vulnerability_feedback_path: 'vulnerability_feedback_path',
}; };
Component.mr = new MRWidgetStore(gl.mrWidgetData);
Component.service = new MRWidgetService({});
}); });
describe('when it is loading', () => { describe('when it is loading', () => {
...@@ -598,7 +632,7 @@ describe('ee merge request widget options', () => { ...@@ -598,7 +632,7 @@ describe('ee merge request widget options', () => {
mock.onGet('sast-container-base.json').reply(200, dockerBaseReport); mock.onGet('sast-container-base.json').reply(200, dockerBaseReport);
mock.onGet('vulnerability_feedback_path').reply(200, []); mock.onGet('vulnerability_feedback_path').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
expect(removeBreakLine(vm.$el.querySelector('.js-sast-container').textContent)).toContain( expect(removeBreakLine(vm.$el.querySelector('.js-sast-container').textContent)).toContain(
'Container scanning is loading', 'Container scanning is loading',
...@@ -612,7 +646,7 @@ describe('ee merge request widget options', () => { ...@@ -612,7 +646,7 @@ describe('ee merge request widget options', () => {
mock.onGet('sast-container-base.json').reply(200, dockerBaseReport); mock.onGet('sast-container-base.json').reply(200, dockerBaseReport);
mock.onGet('vulnerability_feedback_path').reply(200, []); mock.onGet('vulnerability_feedback_path').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
}); });
it('should render provided data', done => { it('should render provided data', done => {
...@@ -634,7 +668,7 @@ describe('ee merge request widget options', () => { ...@@ -634,7 +668,7 @@ describe('ee merge request widget options', () => {
mock.onGet('sast-container-base.json').reply(500, {}); mock.onGet('sast-container-base.json').reply(500, {});
mock.onGet('vulnerability_feedback_path').reply(500, []); mock.onGet('vulnerability_feedback_path').reply(500, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
}); });
it('should render error indicator', done => { it('should render error indicator', done => {
...@@ -658,9 +692,6 @@ describe('ee merge request widget options', () => { ...@@ -658,9 +692,6 @@ describe('ee merge request widget options', () => {
}, },
vulnerability_feedback_path: 'vulnerability_feedback_path', vulnerability_feedback_path: 'vulnerability_feedback_path',
}; };
Component.mr = new MRWidgetStore(gl.mrWidgetData);
Component.service = new MRWidgetService({});
}); });
describe('when it is loading', () => { describe('when it is loading', () => {
...@@ -669,7 +700,7 @@ describe('ee merge request widget options', () => { ...@@ -669,7 +700,7 @@ describe('ee merge request widget options', () => {
mock.onGet('dast_base.json').reply(200, dastBase); mock.onGet('dast_base.json').reply(200, dastBase);
mock.onGet('vulnerability_feedback_path').reply(200, []); mock.onGet('vulnerability_feedback_path').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
expect(vm.$el.querySelector('.js-dast-widget').textContent.trim()).toContain( expect(vm.$el.querySelector('.js-dast-widget').textContent.trim()).toContain(
'DAST is loading', 'DAST is loading',
...@@ -683,7 +714,7 @@ describe('ee merge request widget options', () => { ...@@ -683,7 +714,7 @@ describe('ee merge request widget options', () => {
mock.onGet('dast_base.json').reply(200, dastBase); mock.onGet('dast_base.json').reply(200, dastBase);
mock.onGet('vulnerability_feedback_path').reply(200, []); mock.onGet('vulnerability_feedback_path').reply(200, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
}); });
it('should render provided data', done => { it('should render provided data', done => {
...@@ -704,7 +735,7 @@ describe('ee merge request widget options', () => { ...@@ -704,7 +735,7 @@ describe('ee merge request widget options', () => {
mock.onGet('dast_base.json').reply(500, {}); mock.onGet('dast_base.json').reply(500, {});
mock.onGet('vulnerability_feedback_path').reply(500, []); mock.onGet('vulnerability_feedback_path').reply(500, []);
vm = mountComponent(Component); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
}); });
it('should render error indicator', done => { it('should render error indicator', done => {
...@@ -734,9 +765,7 @@ describe('ee merge request widget options', () => { ...@@ -734,9 +765,7 @@ describe('ee merge request widget options', () => {
}, },
}; };
Component.mr = new MRWidgetStore(gl.mrWidgetData); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
Component.service = new MRWidgetService({});
vm = mountComponent(Component);
expect(vm.$el.querySelector('.license-report-widget')).not.toBeNull(); expect(vm.$el.querySelector('.license-report-widget')).not.toBeNull();
}); });
...@@ -747,9 +776,7 @@ describe('ee merge request widget options', () => { ...@@ -747,9 +776,7 @@ describe('ee merge request widget options', () => {
license_management: {}, license_management: {},
}; };
Component.mr = new MRWidgetStore(gl.mrWidgetData); vm = mountComponent(Component, { mrData: gl.mrWidgetData });
Component.service = new MRWidgetService({});
vm = mountComponent(Component);
expect(vm.$el.querySelector('.license-report-widget')).toBeNull(); expect(vm.$el.querySelector('.license-report-widget')).toBeNull();
}); });
......
# frozen_string_literal: true
require 'spec_helper'
describe MergeRequestPollWidgetEntity do
include ProjectForksHelper
set(:user) { create(:user) }
set(:project) { create :project, :repository }
set(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:request) { double('request', current_user: user) }
before do
project.add_developer(user)
end
subject(:entity) do
described_class.new(merge_request, current_user: user, request: request)
end
describe 'Merge Trains' do
let!(:merge_train) { create(:merge_train, merge_request: merge_request) }
before do
stub_licensed_features(merge_pipelines: true, merge_trains: true)
project.update!(merge_pipelines_enabled: true)
end
it 'has merge train entity' do
expect(subject.as_json).to include(:merge_trains_count)
expect(subject.as_json).to include(:merge_train_index)
end
context 'when the merge train feature is disabled' do
before do
stub_feature_flags(merge_trains_enabled: false)
end
it 'does not have merge trains count' do
expect(subject.as_json).not_to include(:merge_trains_count)
end
end
context 'when the merge request is not on a merge train' do
let!(:merge_train) { }
it 'does not have merge train index' do
expect(subject.as_json).not_to include(:merge_train_index)
end
end
end
end
...@@ -198,38 +198,6 @@ describe MergeRequestWidgetEntity do ...@@ -198,38 +198,6 @@ describe MergeRequestWidgetEntity do
expect(subject.as_json).to include(:pipeline_id) expect(subject.as_json).to include(:pipeline_id)
end end
describe 'Merge Trains' do
let!(:merge_train) { create(:merge_train, merge_request: merge_request) }
before do
stub_licensed_features(merge_pipelines: true, merge_trains: true)
project.update!(merge_pipelines_enabled: true)
end
it 'has merge train entity' do
expect(subject.as_json).to include(:merge_trains_count)
expect(subject.as_json).to include(:merge_train_index)
end
context 'when the merge train feature is disabled' do
before do
stub_feature_flags(merge_trains_enabled: false)
end
it 'does not have merge trains count' do
expect(subject.as_json).not_to include(:merge_trains_count)
end
end
context 'when the merge request is not on a merge train' do
let!(:merge_train) { }
it 'does not have merge train index' do
expect(subject.as_json).not_to include(:merge_train_index)
end
end
end
describe 'blocking merge requests' do describe 'blocking merge requests' do
set(:merge_request_block) { create(:merge_request_block, blocked_merge_request: merge_request) } set(:merge_request_block) { create(:merge_request_block, blocked_merge_request: merge_request) }
......
...@@ -1073,7 +1073,7 @@ describe Projects::MergeRequestsController do ...@@ -1073,7 +1073,7 @@ describe Projects::MergeRequestsController do
end end
it 'renders MergeRequest as JSON' do it 'renders MergeRequest as JSON' do
expect(json_response.keys).to include('id', 'iid', 'description') expect(json_response.keys).to include('id', 'iid')
end end
end end
...@@ -1107,7 +1107,7 @@ describe Projects::MergeRequestsController do ...@@ -1107,7 +1107,7 @@ describe Projects::MergeRequestsController do
it 'renders MergeRequest as JSON' do it 'renders MergeRequest as JSON' do
subject subject
expect(json_response.keys).to include('id', 'iid', 'description') expect(json_response.keys).to include('id', 'iid')
end end
end end
......
...@@ -220,6 +220,7 @@ export default { ...@@ -220,6 +220,7 @@ export default {
plain_diff_path: '/root/acets-app/merge_requests/22.diff', plain_diff_path: '/root/acets-app/merge_requests/22.diff',
merge_request_basic_path: '/root/acets-app/merge_requests/22.json?serializer=basic', merge_request_basic_path: '/root/acets-app/merge_requests/22.json?serializer=basic',
merge_request_widget_path: '/root/acets-app/merge_requests/22/widget.json', merge_request_widget_path: '/root/acets-app/merge_requests/22/widget.json',
merge_request_cached_widget_path: '/cached.json',
merge_check_path: '/root/acets-app/merge_requests/22/merge_check', merge_check_path: '/root/acets-app/merge_requests/22/merge_check',
ci_environments_status_url: '/root/acets-app/merge_requests/22/ci_environments_status', ci_environments_status_url: '/root/acets-app/merge_requests/22/ci_environments_status',
project_archived: false, project_archived: false,
......
import Vue from 'vue'; import Vue from 'vue';
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
import mrWidgetOptions from '~/vue_merge_request_widget/mr_widget_options.vue'; import mrWidgetOptions from '~/vue_merge_request_widget/mr_widget_options.vue';
import eventHub from '~/vue_merge_request_widget/event_hub'; import eventHub from '~/vue_merge_request_widget/event_hub';
import notify from '~/lib/utils/notify'; import notify from '~/lib/utils/notify';
...@@ -16,6 +18,7 @@ const returnPromise = data => ...@@ -16,6 +18,7 @@ const returnPromise = data =>
describe('mrWidgetOptions', () => { describe('mrWidgetOptions', () => {
let vm; let vm;
let mock;
let MrWidgetOptions; let MrWidgetOptions;
const COLLABORATION_MESSAGE = 'Allows commits from members who can merge to the target branch'; const COLLABORATION_MESSAGE = 'Allows commits from members who can merge to the target branch';
...@@ -24,6 +27,12 @@ describe('mrWidgetOptions', () => { ...@@ -24,6 +27,12 @@ describe('mrWidgetOptions', () => {
// Prevent component mounting // Prevent component mounting
delete mrWidgetOptions.el; delete mrWidgetOptions.el;
gl.mrWidgetData = { ...mockData };
mock = new MockAdapter(axios);
mock.onGet(mockData.merge_request_widget_path).reply(() => [200, { ...mockData }]);
mock.onGet(mockData.merge_request_cached_widget_path).reply(() => [200, { ...mockData }]);
MrWidgetOptions = Vue.extend(mrWidgetOptions); MrWidgetOptions = Vue.extend(mrWidgetOptions);
vm = mountComponent(MrWidgetOptions, { vm = mountComponent(MrWidgetOptions, {
mrData: { ...mockData }, mrData: { ...mockData },
...@@ -32,6 +41,8 @@ describe('mrWidgetOptions', () => { ...@@ -32,6 +41,8 @@ describe('mrWidgetOptions', () => {
afterEach(() => { afterEach(() => {
vm.$destroy(); vm.$destroy();
mock.restore();
gl.mrWidgetData = {};
}); });
describe('data', () => { describe('data', () => {
...@@ -305,17 +316,16 @@ describe('mrWidgetOptions', () => { ...@@ -305,17 +316,16 @@ describe('mrWidgetOptions', () => {
}); });
describe('bindEventHubListeners', () => { describe('bindEventHubListeners', () => {
it('should bind eventHub listeners', () => { it('should bind eventHub listeners', done => {
spyOn(vm, 'checkStatus').and.returnValue(() => {}); spyOn(vm, 'checkStatus').and.returnValue(() => {});
spyOn(vm.service, 'checkStatus').and.returnValue(returnPromise(mockData)); spyOn(vm.service, 'checkStatus').and.returnValue(returnPromise(mockData));
spyOn(vm, 'fetchActionsContent'); spyOn(vm, 'fetchActionsContent');
spyOn(vm.mr, 'setData'); spyOn(vm.mr, 'setData');
spyOn(vm, 'resumePolling'); spyOn(vm, 'resumePolling');
spyOn(vm, 'stopPolling'); spyOn(vm, 'stopPolling');
spyOn(eventHub, '$on'); spyOn(eventHub, '$on').and.callThrough();
vm.bindEventHubListeners();
setTimeout(() => {
eventHub.$emit('SetBranchRemoveFlag', ['flag']); eventHub.$emit('SetBranchRemoveFlag', ['flag']);
expect(vm.mr.isRemovingSourceBranch).toEqual('flag'); expect(vm.mr.isRemovingSourceBranch).toEqual('flag');
...@@ -358,6 +368,9 @@ describe('mrWidgetOptions', () => { ...@@ -358,6 +368,9 @@ describe('mrWidgetOptions', () => {
listenersWithServiceRequest.FetchActionsContent(); listenersWithServiceRequest.FetchActionsContent();
expect(vm.fetchActionsContent).toHaveBeenCalled(); expect(vm.fetchActionsContent).toHaveBeenCalled();
done();
});
}); });
}); });
...@@ -448,22 +461,30 @@ describe('mrWidgetOptions', () => { ...@@ -448,22 +461,30 @@ describe('mrWidgetOptions', () => {
}); });
describe('resumePolling', () => { describe('resumePolling', () => {
it('should call stopTimer on pollingInterval', () => { it('should call stopTimer on pollingInterval', done => {
setTimeout(() => {
spyOn(vm.pollingInterval, 'resume'); spyOn(vm.pollingInterval, 'resume');
vm.resumePolling(); vm.resumePolling();
expect(vm.pollingInterval.resume).toHaveBeenCalled(); expect(vm.pollingInterval.resume).toHaveBeenCalled();
done();
});
}); });
}); });
describe('stopPolling', () => { describe('stopPolling', () => {
it('should call stopTimer on pollingInterval', () => { it('should call stopTimer on pollingInterval', done => {
setTimeout(() => {
spyOn(vm.pollingInterval, 'stopTimer'); spyOn(vm.pollingInterval, 'stopTimer');
vm.stopPolling(); vm.stopPolling();
expect(vm.pollingInterval.stopTimer).toHaveBeenCalled(); expect(vm.pollingInterval.stopTimer).toHaveBeenCalled();
done();
});
}); });
}); });
}); });
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment