Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-02-28 00:09:17 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-02-28 00:09:17 +0300
commitc77fda905a8619b756163c10a75171dc9cfe7084 (patch)
treeffa93b37bfe4b99ba0b8584c7a0bd1a4cd19772a /spec/javascripts
parente0fa0638a422c3e20d4423c9bb69d79afc9c7d3d (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/javascripts')
-rw-r--r--spec/javascripts/vue_mr_widget/mr_widget_options_spec.js1189
1 files changed, 588 insertions, 601 deletions
diff --git a/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js b/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js
index 35c1495be58..4237bdd80be 100644
--- a/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js
+++ b/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js
@@ -1,6 +1,7 @@
import Vue from 'vue';
import MockAdapter from 'axios-mock-adapter';
import mountComponent from 'spec/helpers/vue_mount_component_helper';
+import waitForPromises from 'spec/helpers/wait_for_promises';
import axios from '~/lib/utils/axios_utils';
import mrWidgetOptions from '~/vue_merge_request_widget/mr_widget_options.vue';
import eventHub from '~/vue_merge_request_widget/event_hub';
@@ -25,6 +26,7 @@ describe('mrWidgetOptions', () => {
const COLLABORATION_MESSAGE = 'Allows commits from members who can merge to the target branch';
beforeEach(() => {
+ jasmine.clock().install();
// Prevent component mounting
delete mrWidgetOptions.el;
@@ -36,729 +38,591 @@ describe('mrWidgetOptions', () => {
mock.onGet(mockData.merge_request_cached_widget_path).reply(() => [200, { ...mockData }]);
MrWidgetOptions = Vue.extend(mrWidgetOptions);
- vm = mountComponent(MrWidgetOptions, {
- mrData: { ...mockData },
- });
});
afterEach(() => {
- vm.$destroy();
+ jasmine.clock().uninstall();
mock.restore();
+
+ vm.$destroy();
+ vm = null;
+
gl.mrWidgetData = {};
gon.features = {};
});
- describe('data', () => {
- it('should instantiate Store and Service', () => {
- expect(vm.mr).toBeDefined();
- expect(vm.service).toBeDefined();
- });
- });
+ const createComponent = () => {
+ if (vm) {
+ vm.$destroy();
+ }
- describe('computed', () => {
- describe('componentName', () => {
- it('should return merged component', () => {
- expect(vm.componentName).toEqual('mr-widget-merged');
- });
+ vm = mountComponent(MrWidgetOptions, {
+ mrData: { ...mockData },
+ });
+ };
- it('should return conflicts component', () => {
- vm.mr.state = 'conflicts';
+ describe('default', () => {
+ beforeEach(() => {
+ createComponent();
+ });
- expect(vm.componentName).toEqual('mr-widget-conflicts');
+ describe('data', () => {
+ it('should instantiate Store and Service', () => {
+ expect(vm.mr).toBeDefined();
+ expect(vm.service).toBeDefined();
});
});
- describe('shouldRenderMergeHelp', () => {
- it('should return false for the initial merged state', () => {
- expect(vm.shouldRenderMergeHelp).toBeFalsy();
- });
+ describe('computed', () => {
+ describe('componentName', () => {
+ it('should return merged component', () => {
+ expect(vm.componentName).toEqual('mr-widget-merged');
+ });
- it('should return true for a state which requires help widget', () => {
- vm.mr.state = 'conflicts';
+ it('should return conflicts component', () => {
+ vm.mr.state = 'conflicts';
- expect(vm.shouldRenderMergeHelp).toBeTruthy();
+ expect(vm.componentName).toEqual('mr-widget-conflicts');
+ });
});
- });
-
- describe('shouldRenderPipelines', () => {
- it('should return true when hasCI is true', () => {
- vm.mr.hasCI = true;
- expect(vm.shouldRenderPipelines).toBeTruthy();
- });
+ describe('shouldRenderMergeHelp', () => {
+ it('should return false for the initial merged state', () => {
+ expect(vm.shouldRenderMergeHelp).toBeFalsy();
+ });
- it('should return false when hasCI is false', () => {
- vm.mr.hasCI = false;
+ it('should return true for a state which requires help widget', () => {
+ vm.mr.state = 'conflicts';
- expect(vm.shouldRenderPipelines).toBeFalsy();
+ expect(vm.shouldRenderMergeHelp).toBeTruthy();
+ });
});
- });
- describe('shouldSuggestPipelines', () => {
- describe('given suggestPipeline feature flag is enabled', () => {
- beforeEach(() => {
- gon.features = { suggestPipeline: true };
- vm = mountComponent(MrWidgetOptions, {
- mrData: { ...mockData },
- });
- });
+ describe('shouldRenderPipelines', () => {
+ it('should return true when hasCI is true', () => {
+ vm.mr.hasCI = true;
- afterEach(() => {
- gon.features = {};
+ expect(vm.shouldRenderPipelines).toBeTruthy();
});
- it('should suggest pipelines when none exist', () => {
- vm.mr.mergeRequestAddCiConfigPath = 'some/path';
+ it('should return false when hasCI is false', () => {
vm.mr.hasCI = false;
- expect(vm.shouldSuggestPipelines).toBeTruthy();
+ expect(vm.shouldRenderPipelines).toBeFalsy();
});
+ });
- it('should not suggest pipelines when they exist', () => {
- vm.mr.mergeRequestAddCiConfigPath = null;
- vm.mr.hasCI = false;
-
- expect(vm.shouldSuggestPipelines).toBeFalsy();
+ describe('shouldRenderRelatedLinks', () => {
+ it('should return false for the initial data', () => {
+ expect(vm.shouldRenderRelatedLinks).toBeFalsy();
});
- it('should not suggest pipelines hasCI is true', () => {
- vm.mr.mergeRequestAddCiConfigPath = 'some/path';
- vm.mr.hasCI = true;
+ it('should return true if there is relatedLinks in MR', () => {
+ Vue.set(vm.mr, 'relatedLinks', {});
- expect(vm.shouldSuggestPipelines).toBeFalsy();
+ expect(vm.shouldRenderRelatedLinks).toBeTruthy();
});
});
- describe('given suggestPipeline feature flag is not enabled', () => {
+ describe('shouldRenderSourceBranchRemovalStatus', () => {
beforeEach(() => {
- gon.features = { suggestPipeline: false };
- vm = mountComponent(MrWidgetOptions, {
- mrData: { ...mockData },
- });
+ vm.mr.state = 'readyToMerge';
});
- afterEach(() => {
- gon.features = {};
+ it('should return true when cannot remove source branch and branch will be removed', () => {
+ vm.mr.canRemoveSourceBranch = false;
+ vm.mr.shouldRemoveSourceBranch = true;
+
+ expect(vm.shouldRenderSourceBranchRemovalStatus).toEqual(true);
});
- it('should not suggest pipelines', () => {
- vm.mr.mergeRequestAddCiConfigPath = null;
+ it('should return false when can remove source branch and branch will be removed', () => {
+ vm.mr.canRemoveSourceBranch = true;
+ vm.mr.shouldRemoveSourceBranch = true;
- expect(vm.shouldSuggestPipelines).toBeFalsy();
+ expect(vm.shouldRenderSourceBranchRemovalStatus).toEqual(false);
});
- });
- });
- describe('shouldRenderRelatedLinks', () => {
- it('should return false for the initial data', () => {
- expect(vm.shouldRenderRelatedLinks).toBeFalsy();
- });
+ it('should return false when cannot remove source branch and branch will not be removed', () => {
+ vm.mr.canRemoveSourceBranch = false;
+ vm.mr.shouldRemoveSourceBranch = false;
- it('should return true if there is relatedLinks in MR', () => {
- Vue.set(vm.mr, 'relatedLinks', {});
+ expect(vm.shouldRenderSourceBranchRemovalStatus).toEqual(false);
+ });
- expect(vm.shouldRenderRelatedLinks).toBeTruthy();
- });
- });
+ it('should return false when in merged state', () => {
+ vm.mr.canRemoveSourceBranch = false;
+ vm.mr.shouldRemoveSourceBranch = true;
+ vm.mr.state = 'merged';
- describe('shouldRenderSourceBranchRemovalStatus', () => {
- beforeEach(() => {
- vm.mr.state = 'readyToMerge';
- });
+ expect(vm.shouldRenderSourceBranchRemovalStatus).toEqual(false);
+ });
- it('should return true when cannot remove source branch and branch will be removed', () => {
- vm.mr.canRemoveSourceBranch = false;
- vm.mr.shouldRemoveSourceBranch = true;
+ it('should return false when in nothing to merge state', () => {
+ vm.mr.canRemoveSourceBranch = false;
+ vm.mr.shouldRemoveSourceBranch = true;
+ vm.mr.state = 'nothingToMerge';
- expect(vm.shouldRenderSourceBranchRemovalStatus).toEqual(true);
+ expect(vm.shouldRenderSourceBranchRemovalStatus).toEqual(false);
+ });
});
- it('should return false when can remove source branch and branch will be removed', () => {
- vm.mr.canRemoveSourceBranch = true;
- vm.mr.shouldRemoveSourceBranch = true;
-
- expect(vm.shouldRenderSourceBranchRemovalStatus).toEqual(false);
- });
+ describe('shouldRenderCollaborationStatus', () => {
+ describe('when collaboration is allowed', () => {
+ beforeEach(() => {
+ vm.mr.allowCollaboration = true;
+ });
- it('should return false when cannot remove source branch and branch will not be removed', () => {
- vm.mr.canRemoveSourceBranch = false;
- vm.mr.shouldRemoveSourceBranch = false;
+ describe('when merge request is opened', () => {
+ beforeEach(done => {
+ vm.mr.isOpen = true;
+ vm.$nextTick(done);
+ });
- expect(vm.shouldRenderSourceBranchRemovalStatus).toEqual(false);
- });
+ it('should render collaboration status', () => {
+ expect(vm.$el.textContent).toContain(COLLABORATION_MESSAGE);
+ });
+ });
- it('should return false when in merged state', () => {
- vm.mr.canRemoveSourceBranch = false;
- vm.mr.shouldRemoveSourceBranch = true;
- vm.mr.state = 'merged';
+ describe('when merge request is not opened', () => {
+ beforeEach(done => {
+ vm.mr.isOpen = false;
+ vm.$nextTick(done);
+ });
- expect(vm.shouldRenderSourceBranchRemovalStatus).toEqual(false);
- });
+ it('should not render collaboration status', () => {
+ expect(vm.$el.textContent).not.toContain(COLLABORATION_MESSAGE);
+ });
+ });
+ });
- it('should return false when in nothing to merge state', () => {
- vm.mr.canRemoveSourceBranch = false;
- vm.mr.shouldRemoveSourceBranch = true;
- vm.mr.state = 'nothingToMerge';
+ describe('when collaboration is not allowed', () => {
+ beforeEach(() => {
+ vm.mr.allowCollaboration = false;
+ });
- expect(vm.shouldRenderSourceBranchRemovalStatus).toEqual(false);
- });
- });
+ describe('when merge request is opened', () => {
+ beforeEach(done => {
+ vm.mr.isOpen = true;
+ vm.$nextTick(done);
+ });
- describe('shouldRenderCollaborationStatus', () => {
- describe('when collaboration is allowed', () => {
- beforeEach(() => {
- vm.mr.allowCollaboration = true;
+ it('should not render collaboration status', () => {
+ expect(vm.$el.textContent).not.toContain(COLLABORATION_MESSAGE);
+ });
+ });
});
+ });
- describe('when merge request is opened', () => {
+ describe('showMergePipelineForkWarning', () => {
+ describe('when the source project and target project are the same', () => {
beforeEach(done => {
- vm.mr.isOpen = true;
+ Vue.set(vm.mr, 'mergePipelinesEnabled', true);
+ Vue.set(vm.mr, 'sourceProjectId', 1);
+ Vue.set(vm.mr, 'targetProjectId', 1);
vm.$nextTick(done);
});
- it('should render collaboration status', () => {
- expect(vm.$el.textContent).toContain(COLLABORATION_MESSAGE);
+ it('should be false', () => {
+ expect(vm.showMergePipelineForkWarning).toEqual(false);
});
});
- describe('when merge request is not opened', () => {
+ describe('when merge pipelines are not enabled', () => {
beforeEach(done => {
- vm.mr.isOpen = false;
+ Vue.set(vm.mr, 'mergePipelinesEnabled', false);
+ Vue.set(vm.mr, 'sourceProjectId', 1);
+ Vue.set(vm.mr, 'targetProjectId', 2);
vm.$nextTick(done);
});
- it('should not render collaboration status', () => {
- expect(vm.$el.textContent).not.toContain(COLLABORATION_MESSAGE);
+ it('should be false', () => {
+ expect(vm.showMergePipelineForkWarning).toEqual(false);
});
});
- });
- describe('when collaboration is not allowed', () => {
- beforeEach(() => {
- vm.mr.allowCollaboration = false;
- });
-
- describe('when merge request is opened', () => {
+ describe('when merge pipelines are enabled _and_ the source project and target project are different', () => {
beforeEach(done => {
- vm.mr.isOpen = true;
+ Vue.set(vm.mr, 'mergePipelinesEnabled', true);
+ Vue.set(vm.mr, 'sourceProjectId', 1);
+ Vue.set(vm.mr, 'targetProjectId', 2);
vm.$nextTick(done);
});
- it('should not render collaboration status', () => {
- expect(vm.$el.textContent).not.toContain(COLLABORATION_MESSAGE);
+ it('should be true', () => {
+ expect(vm.showMergePipelineForkWarning).toEqual(true);
});
});
});
});
- describe('showMergePipelineForkWarning', () => {
- describe('when the source project and target project are the same', () => {
- beforeEach(done => {
- Vue.set(vm.mr, 'mergePipelinesEnabled', true);
- Vue.set(vm.mr, 'sourceProjectId', 1);
- Vue.set(vm.mr, 'targetProjectId', 1);
- vm.$nextTick(done);
- });
+ describe('methods', () => {
+ describe('checkStatus', () => {
+ it('should tell service to check status', () => {
+ spyOn(vm.service, 'checkStatus').and.returnValue(returnPromise(mockData));
+ spyOn(vm.mr, 'setData');
+ spyOn(vm, 'handleNotification');
- it('should be false', () => {
- expect(vm.showMergePipelineForkWarning).toEqual(false);
- });
- });
-
- describe('when merge pipelines are not enabled', () => {
- beforeEach(done => {
- Vue.set(vm.mr, 'mergePipelinesEnabled', false);
- Vue.set(vm.mr, 'sourceProjectId', 1);
- Vue.set(vm.mr, 'targetProjectId', 2);
- vm.$nextTick(done);
- });
-
- it('should be false', () => {
- expect(vm.showMergePipelineForkWarning).toEqual(false);
- });
- });
+ let isCbExecuted = false;
+ const cb = () => {
+ isCbExecuted = true;
+ };
- describe('when merge pipelines are enabled _and_ the source project and target project are different', () => {
- beforeEach(done => {
- Vue.set(vm.mr, 'mergePipelinesEnabled', true);
- Vue.set(vm.mr, 'sourceProjectId', 1);
- Vue.set(vm.mr, 'targetProjectId', 2);
- vm.$nextTick(done);
- });
+ vm.checkStatus(cb);
- it('should be true', () => {
- expect(vm.showMergePipelineForkWarning).toEqual(true);
+ return vm.$nextTick().then(() => {
+ expect(vm.service.checkStatus).toHaveBeenCalled();
+ expect(vm.mr.setData).toHaveBeenCalled();
+ expect(vm.handleNotification).toHaveBeenCalledWith(mockData);
+ expect(isCbExecuted).toBeTruthy();
+ });
});
});
- });
- });
-
- describe('methods', () => {
- describe('checkStatus', () => {
- it('should tell service to check status', done => {
- spyOn(vm.service, 'checkStatus').and.returnValue(returnPromise(mockData));
- spyOn(vm.mr, 'setData');
- spyOn(vm, 'handleNotification');
-
- let isCbExecuted = false;
- const cb = () => {
- isCbExecuted = true;
- };
-
- vm.checkStatus(cb);
-
- setTimeout(() => {
- expect(vm.service.checkStatus).toHaveBeenCalled();
- expect(vm.mr.setData).toHaveBeenCalled();
- expect(vm.handleNotification).toHaveBeenCalledWith(mockData);
- expect(isCbExecuted).toBeTruthy();
- done();
- }, 333);
- });
- });
- describe('initPolling', () => {
- it('should call SmartInterval', () => {
- spyOn(vm, 'checkStatus').and.returnValue(Promise.resolve());
- jasmine.clock().install();
- vm.initPolling();
+ describe('initPolling', () => {
+ it('should call SmartInterval', () => {
+ spyOn(vm, 'checkStatus').and.returnValue(Promise.resolve());
+ vm.initPolling();
- expect(vm.checkStatus).not.toHaveBeenCalled();
+ expect(vm.checkStatus).not.toHaveBeenCalled();
- jasmine.clock().tick(10000);
+ jasmine.clock().tick(10000);
- expect(vm.pollingInterval).toBeDefined();
- expect(vm.checkStatus).toHaveBeenCalled();
-
- jasmine.clock().uninstall();
+ expect(vm.pollingInterval).toBeDefined();
+ expect(vm.checkStatus).toHaveBeenCalled();
+ });
});
- });
- describe('initDeploymentsPolling', () => {
- it('should call SmartInterval', () => {
- spyOn(vm, 'fetchDeployments').and.returnValue(Promise.resolve());
- vm.initDeploymentsPolling();
+ describe('initDeploymentsPolling', () => {
+ it('should call SmartInterval', () => {
+ spyOn(vm, 'fetchDeployments').and.returnValue(Promise.resolve());
+ vm.initDeploymentsPolling();
- expect(vm.deploymentsInterval).toBeDefined();
- expect(vm.fetchDeployments).toHaveBeenCalled();
+ expect(vm.deploymentsInterval).toBeDefined();
+ expect(vm.fetchDeployments).toHaveBeenCalled();
+ });
});
- });
- describe('fetchDeployments', () => {
- it('should fetch deployments', done => {
- spyOn(vm.service, 'fetchDeployments').and.returnValue(
- returnPromise([{ id: 1, status: SUCCESS }]),
- );
+ describe('fetchDeployments', () => {
+ it('should fetch deployments', () => {
+ spyOn(vm.service, 'fetchDeployments').and.returnValue(
+ returnPromise([{ id: 1, status: SUCCESS }]),
+ );
- vm.fetchPreMergeDeployments();
+ vm.fetchPreMergeDeployments();
- setTimeout(() => {
- expect(vm.service.fetchDeployments).toHaveBeenCalled();
- expect(vm.mr.deployments.length).toEqual(1);
- expect(vm.mr.deployments[0].id).toBe(1);
- done();
+ return vm.$nextTick().then(() => {
+ expect(vm.service.fetchDeployments).toHaveBeenCalled();
+ expect(vm.mr.deployments.length).toEqual(1);
+ expect(vm.mr.deployments[0].id).toBe(1);
+ });
});
});
- });
- describe('fetchActionsContent', () => {
- it('should fetch content of Cherry Pick and Revert modals', done => {
- spyOn(vm.service, 'fetchMergeActionsContent').and.returnValue(returnPromise('hello world'));
+ describe('fetchActionsContent', () => {
+ it('should fetch content of Cherry Pick and Revert modals', () => {
+ spyOn(vm.service, 'fetchMergeActionsContent').and.returnValue(
+ returnPromise('hello world'),
+ );
- vm.fetchActionsContent();
+ vm.fetchActionsContent();
- setTimeout(() => {
- expect(vm.service.fetchMergeActionsContent).toHaveBeenCalled();
- expect(document.body.textContent).toContain('hello world');
- done();
- }, 333);
+ return vm.$nextTick().then(() => {
+ expect(vm.service.fetchMergeActionsContent).toHaveBeenCalled();
+ expect(document.body.textContent).toContain('hello world');
+ });
+ });
});
- });
- describe('bindEventHubListeners', () => {
- it('should bind eventHub listeners', done => {
- spyOn(vm, 'checkStatus').and.returnValue(() => {});
- spyOn(vm.service, 'checkStatus').and.returnValue(returnPromise(mockData));
- spyOn(vm, 'fetchActionsContent');
- spyOn(vm.mr, 'setData');
- spyOn(vm, 'resumePolling');
- spyOn(vm, 'stopPolling');
- spyOn(eventHub, '$on').and.callThrough();
+ describe('bindEventHubListeners', () => {
+ it('should bind eventHub listeners', () => {
+ spyOn(vm, 'checkStatus').and.returnValue(() => {});
+ spyOn(vm.service, 'checkStatus').and.returnValue(returnPromise(mockData));
+ spyOn(vm, 'fetchActionsContent');
+ spyOn(vm.mr, 'setData');
+ spyOn(vm, 'resumePolling');
+ spyOn(vm, 'stopPolling');
+ spyOn(eventHub, '$on').and.callThrough();
- setTimeout(() => {
- eventHub.$emit('SetBranchRemoveFlag', ['flag']);
+ return waitForPromises().then(() => {
+ eventHub.$emit('SetBranchRemoveFlag', ['flag']);
- expect(vm.mr.isRemovingSourceBranch).toEqual('flag');
+ expect(vm.mr.isRemovingSourceBranch).toEqual('flag');
- eventHub.$emit('FailedToMerge');
+ eventHub.$emit('FailedToMerge');
- expect(vm.mr.state).toEqual('failedToMerge');
+ expect(vm.mr.state).toEqual('failedToMerge');
- eventHub.$emit('UpdateWidgetData', mockData);
+ eventHub.$emit('UpdateWidgetData', mockData);
- expect(vm.mr.setData).toHaveBeenCalledWith(mockData);
+ expect(vm.mr.setData).toHaveBeenCalledWith(mockData);
- eventHub.$emit('EnablePolling');
+ eventHub.$emit('EnablePolling');
- expect(vm.resumePolling).toHaveBeenCalled();
+ expect(vm.resumePolling).toHaveBeenCalled();
- eventHub.$emit('DisablePolling');
+ eventHub.$emit('DisablePolling');
- expect(vm.stopPolling).toHaveBeenCalled();
-
- const listenersWithServiceRequest = {
- MRWidgetUpdateRequested: true,
- FetchActionsContent: true,
- };
+ expect(vm.stopPolling).toHaveBeenCalled();
- const allArgs = eventHub.$on.calls.allArgs();
- allArgs.forEach(params => {
- const eventName = params[0];
- const callback = params[1];
+ const listenersWithServiceRequest = {
+ MRWidgetUpdateRequested: true,
+ FetchActionsContent: true,
+ };
- if (listenersWithServiceRequest[eventName]) {
- listenersWithServiceRequest[eventName] = callback;
- }
- });
+ const allArgs = eventHub.$on.calls.allArgs();
+ allArgs.forEach(params => {
+ const eventName = params[0];
+ const callback = params[1];
- listenersWithServiceRequest.MRWidgetUpdateRequested();
+ if (listenersWithServiceRequest[eventName]) {
+ listenersWithServiceRequest[eventName] = callback;
+ }
+ });
- expect(vm.checkStatus).toHaveBeenCalled();
+ listenersWithServiceRequest.MRWidgetUpdateRequested();
- listenersWithServiceRequest.FetchActionsContent();
+ expect(vm.checkStatus).toHaveBeenCalled();
- expect(vm.fetchActionsContent).toHaveBeenCalled();
+ listenersWithServiceRequest.FetchActionsContent();
- done();
+ expect(vm.fetchActionsContent).toHaveBeenCalled();
+ });
});
});
- });
- describe('setFavicon', () => {
- let faviconElement;
+ describe('setFavicon', () => {
+ let faviconElement;
- beforeEach(() => {
- const favicon = document.createElement('link');
- favicon.setAttribute('id', 'favicon');
- favicon.setAttribute('data-original-href', faviconDataUrl);
- document.body.appendChild(favicon);
+ beforeEach(() => {
+ const favicon = document.createElement('link');
+ favicon.setAttribute('id', 'favicon');
+ favicon.setAttribute('data-original-href', faviconDataUrl);
+ document.body.appendChild(favicon);
- faviconElement = document.getElementById('favicon');
- });
+ faviconElement = document.getElementById('favicon');
+ });
- afterEach(() => {
- document.body.removeChild(document.getElementById('favicon'));
- });
+ afterEach(() => {
+ document.body.removeChild(document.getElementById('favicon'));
+ });
- it('should call setFavicon method', done => {
- vm.mr.ciStatusFaviconPath = overlayDataUrl;
- vm.setFaviconHelper()
- .then(() => {
- /*
+ it('should call setFavicon method', done => {
+ vm.mr.ciStatusFaviconPath = overlayDataUrl;
+ vm.setFaviconHelper()
+ .then(() => {
+ /*
It would be better if we'd could mock commonUtils.setFaviconURL
with a spy and test that it was called. We are doing the following
tests as a proxy to show that the function has been called
*/
- expect(faviconElement.getAttribute('href')).not.toEqual(null);
- expect(faviconElement.getAttribute('href')).not.toEqual(overlayDataUrl);
- expect(faviconElement.getAttribute('href')).not.toEqual(faviconDataUrl);
- done();
- })
- .catch(done.fail);
- });
+ expect(faviconElement.getAttribute('href')).not.toEqual(null);
+ expect(faviconElement.getAttribute('href')).not.toEqual(overlayDataUrl);
+ expect(faviconElement.getAttribute('href')).not.toEqual(faviconDataUrl);
+ done();
+ })
+ .catch(done.fail);
+ });
- it('should not call setFavicon when there is no ciStatusFaviconPath', done => {
- vm.mr.ciStatusFaviconPath = null;
- vm.setFaviconHelper()
- .then(() => {
- expect(faviconElement.getAttribute('href')).toEqual(null);
- done();
- })
- .catch(done.fail);
+ it('should not call setFavicon when there is no ciStatusFaviconPath', done => {
+ vm.mr.ciStatusFaviconPath = null;
+ vm.setFaviconHelper()
+ .then(() => {
+ expect(faviconElement.getAttribute('href')).toEqual(null);
+ done();
+ })
+ .catch(done.fail);
+ });
});
- });
- describe('handleNotification', () => {
- const data = {
- ci_status: 'running',
- title: 'title',
- pipeline: { details: { status: { label: 'running-label' } } },
- };
+ describe('handleNotification', () => {
+ const data = {
+ ci_status: 'running',
+ title: 'title',
+ pipeline: { details: { status: { label: 'running-label' } } },
+ };
- beforeEach(() => {
- spyOn(notify, 'notifyMe');
+ beforeEach(() => {
+ spyOn(notify, 'notifyMe');
- vm.mr.ciStatus = 'failed';
- vm.mr.gitlabLogo = 'logo.png';
- });
+ vm.mr.ciStatus = 'failed';
+ vm.mr.gitlabLogo = 'logo.png';
+ });
- it('should call notifyMe', () => {
- vm.handleNotification(data);
+ it('should call notifyMe', () => {
+ vm.handleNotification(data);
- expect(notify.notifyMe).toHaveBeenCalledWith(
- 'Pipeline running-label',
- 'Pipeline running-label for "title"',
- 'logo.png',
- );
- });
-
- it('should not call notifyMe if the status has not changed', () => {
- vm.mr.ciStatus = data.ci_status;
+ expect(notify.notifyMe).toHaveBeenCalledWith(
+ 'Pipeline running-label',
+ 'Pipeline running-label for "title"',
+ 'logo.png',
+ );
+ });
- vm.handleNotification(data);
+ it('should not call notifyMe if the status has not changed', () => {
+ vm.mr.ciStatus = data.ci_status;
- expect(notify.notifyMe).not.toHaveBeenCalled();
- });
+ vm.handleNotification(data);
- it('should not notify if no pipeline provided', () => {
- vm.handleNotification({
- ...data,
- pipeline: undefined,
+ expect(notify.notifyMe).not.toHaveBeenCalled();
});
- expect(notify.notifyMe).not.toHaveBeenCalled();
- });
- });
+ it('should not notify if no pipeline provided', () => {
+ vm.handleNotification({
+ ...data,
+ pipeline: undefined,
+ });
- describe('resumePolling', () => {
- it('should call stopTimer on pollingInterval', done => {
- setTimeout(() => {
- spyOn(vm.pollingInterval, 'resume');
+ expect(notify.notifyMe).not.toHaveBeenCalled();
+ });
+ });
- vm.resumePolling();
+ describe('resumePolling', () => {
+ it('should call stopTimer on pollingInterval', () =>
+ waitForPromises().then(() => {
+ spyOn(vm.pollingInterval, 'resume');
- expect(vm.pollingInterval.resume).toHaveBeenCalled();
+ vm.resumePolling();
- done();
- });
+ expect(vm.pollingInterval.resume).toHaveBeenCalled();
+ }));
});
- });
- describe('stopPolling', () => {
- it('should call stopTimer on pollingInterval', done => {
- setTimeout(() => {
- spyOn(vm.pollingInterval, 'stopTimer');
+ describe('stopPolling', () => {
+ it('should call stopTimer on pollingInterval', () =>
+ waitForPromises().then(() => {
+ spyOn(vm.pollingInterval, 'stopTimer');
- vm.stopPolling();
+ vm.stopPolling();
- expect(vm.pollingInterval.stopTimer).toHaveBeenCalled();
-
- done();
- });
+ expect(vm.pollingInterval.stopTimer).toHaveBeenCalled();
+ }));
});
});
- });
- describe('rendering relatedLinks', () => {
- beforeEach(done => {
- vm.mr.relatedLinks = {
- assignToMe: null,
- closing: `
+ describe('rendering relatedLinks', () => {
+ beforeEach(done => {
+ vm.mr.relatedLinks = {
+ assignToMe: null,
+ closing: `
<a class="close-related-link" href="#">
Close
</a>
`,
- mentioned: '',
- };
- Vue.nextTick(done);
- });
+ mentioned: '',
+ };
+ Vue.nextTick(done);
+ });
- it('renders if there are relatedLinks', () => {
- expect(vm.$el.querySelector('.close-related-link')).toBeDefined();
- });
+ it('renders if there are relatedLinks', () => {
+ expect(vm.$el.querySelector('.close-related-link')).toBeDefined();
+ });
- it('does not render if state is nothingToMerge', done => {
- vm.mr.state = stateKey.nothingToMerge;
- Vue.nextTick(() => {
- expect(vm.$el.querySelector('.close-related-link')).toBeNull();
- done();
+ it('does not render if state is nothingToMerge', done => {
+ vm.mr.state = stateKey.nothingToMerge;
+ Vue.nextTick(() => {
+ expect(vm.$el.querySelector('.close-related-link')).toBeNull();
+ done();
+ });
});
});
- });
- describe('rendering source branch removal status', () => {
- it('renders when user cannot remove branch and branch should be removed', done => {
- vm.mr.canRemoveSourceBranch = false;
- vm.mr.shouldRemoveSourceBranch = true;
- vm.mr.state = 'readyToMerge';
+ describe('rendering source branch removal status', () => {
+ it('renders when user cannot remove branch and branch should be removed', done => {
+ vm.mr.canRemoveSourceBranch = false;
+ vm.mr.shouldRemoveSourceBranch = true;
+ vm.mr.state = 'readyToMerge';
- vm.$nextTick(() => {
- const tooltip = vm.$el.querySelector('.fa-question-circle');
+ vm.$nextTick(() => {
+ const tooltip = vm.$el.querySelector('.fa-question-circle');
- expect(vm.$el.textContent).toContain('Deletes source branch');
- expect(tooltip.getAttribute('data-original-title')).toBe(
- 'A user with write access to the source branch selected this option',
- );
+ expect(vm.$el.textContent).toContain('Deletes source branch');
+ expect(tooltip.getAttribute('data-original-title')).toBe(
+ 'A user with write access to the source branch selected this option',
+ );
- done();
+ done();
+ });
});
- });
- it('does not render in merged state', done => {
- vm.mr.canRemoveSourceBranch = false;
- vm.mr.shouldRemoveSourceBranch = true;
- vm.mr.state = 'merged';
+ it('does not render in merged state', done => {
+ vm.mr.canRemoveSourceBranch = false;
+ vm.mr.shouldRemoveSourceBranch = true;
+ vm.mr.state = 'merged';
- vm.$nextTick(() => {
- expect(vm.$el.textContent).toContain('The source branch has been deleted');
- expect(vm.$el.textContent).not.toContain('Deletes source branch');
+ vm.$nextTick(() => {
+ expect(vm.$el.textContent).toContain('The source branch has been deleted');
+ expect(vm.$el.textContent).not.toContain('Deletes source branch');
- done();
+ done();
+ });
});
});
- });
- describe('rendering deployments', () => {
- const changes = [
- {
- path: 'index.html',
- external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/index.html',
- },
- {
- path: 'imgs/gallery.html',
- external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/imgs/gallery.html',
- },
- {
- path: 'about/',
- external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/about/',
- },
- ];
- const deploymentMockData = {
- id: 15,
- name: 'review/diplo',
- url: '/root/acets-review-apps/environments/15',
- stop_url: '/root/acets-review-apps/environments/15/stop',
- metrics_url: '/root/acets-review-apps/environments/15/deployments/1/metrics',
- metrics_monitoring_url: '/root/acets-review-apps/environments/15/metrics',
- external_url: 'http://diplo.',
- external_url_formatted: 'diplo.',
- deployed_at: '2017-03-22T22:44:42.258Z',
- deployed_at_formatted: 'Mar 22, 2017 10:44pm',
- changes,
- status: SUCCESS,
- };
-
- beforeEach(done => {
- vm.mr.deployments.push(
+ describe('rendering deployments', () => {
+ const changes = [
+ {
+ path: 'index.html',
+ external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/index.html',
+ },
{
- ...deploymentMockData,
+ path: 'imgs/gallery.html',
+ external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/imgs/gallery.html',
},
{
- ...deploymentMockData,
- id: deploymentMockData.id + 1,
+ path: 'about/',
+ external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/about/',
},
- );
+ ];
+ const deploymentMockData = {
+ id: 15,
+ name: 'review/diplo',
+ url: '/root/acets-review-apps/environments/15',
+ stop_url: '/root/acets-review-apps/environments/15/stop',
+ metrics_url: '/root/acets-review-apps/environments/15/deployments/1/metrics',
+ metrics_monitoring_url: '/root/acets-review-apps/environments/15/metrics',
+ external_url: 'http://diplo.',
+ external_url_formatted: 'diplo.',
+ deployed_at: '2017-03-22T22:44:42.258Z',
+ deployed_at_formatted: 'Mar 22, 2017 10:44pm',
+ changes,
+ status: SUCCESS,
+ };
- vm.$nextTick(done);
- });
+ beforeEach(done => {
+ vm.mr.deployments.push(
+ {
+ ...deploymentMockData,
+ },
+ {
+ ...deploymentMockData,
+ id: deploymentMockData.id + 1,
+ },
+ );
- it('renders multiple deployments', () => {
- expect(vm.$el.querySelectorAll('.deploy-heading').length).toBe(2);
- });
+ vm.$nextTick(done);
+ });
+
+ it('renders multiple deployments', () => {
+ expect(vm.$el.querySelectorAll('.deploy-heading').length).toBe(2);
+ });
- it('renders dropdpown with multiple file changes', () => {
- expect(
- vm.$el
- .querySelector('.js-mr-wigdet-deployment-dropdown')
- .querySelectorAll('.js-filtered-dropdown-result').length,
- ).toEqual(changes.length);
+ it('renders dropdpown with multiple file changes', () => {
+ expect(
+ vm.$el
+ .querySelector('.js-mr-wigdet-deployment-dropdown')
+ .querySelectorAll('.js-filtered-dropdown-result').length,
+ ).toEqual(changes.length);
+ });
});
- });
- describe('pipeline for target branch after merge', () => {
- describe('with information for target branch pipeline', () => {
- beforeEach(done => {
- vm.mr.state = 'merged';
- vm.mr.mergePipeline = {
- id: 127,
- user: {
- id: 1,
- name: 'Administrator',
- username: 'root',
- state: 'active',
- avatar_url: null,
- web_url: 'http://localhost:3000/root',
- status_tooltip_html: null,
- path: '/root',
- },
- active: true,
- coverage: null,
- source: 'push',
- created_at: '2018-10-22T11:41:35.186Z',
- updated_at: '2018-10-22T11:41:35.433Z',
- path: '/root/ci-web-terminal/pipelines/127',
- flags: {
- latest: true,
- stuck: true,
- auto_devops: false,
- yaml_errors: false,
- retryable: false,
- cancelable: true,
- failure_reason: false,
- },
- details: {
- status: {
- icon: 'status_pending',
- text: 'pending',
- label: 'pending',
- group: 'pending',
- tooltip: 'pending',
- has_details: true,
- details_path: '/root/ci-web-terminal/pipelines/127',
- illustration: null,
- favicon:
- '/assets/ci_favicons/favicon_status_pending-5bdf338420e5221ca24353b6bff1c9367189588750632e9a871b7af09ff6a2ae.png',
- },
- duration: null,
- finished_at: null,
- stages: [
- {
- name: 'test',
- title: 'test: pending',
- status: {
- icon: 'status_pending',
- text: 'pending',
- label: 'pending',
- group: 'pending',
- tooltip: 'pending',
- has_details: true,
- details_path: '/root/ci-web-terminal/pipelines/127#test',
- illustration: null,
- favicon:
- '/assets/ci_favicons/favicon_status_pending-5bdf338420e5221ca24353b6bff1c9367189588750632e9a871b7af09ff6a2ae.png',
- },
- path: '/root/ci-web-terminal/pipelines/127#test',
- dropdown_path: '/root/ci-web-terminal/pipelines/127/stage.json?stage=test',
- },
- ],
- artifacts: [],
- manual_actions: [],
- scheduled_actions: [],
- },
- ref: {
- name: 'master',
- path: '/root/ci-web-terminal/commits/master',
- tag: false,
- branch: true,
- },
- commit: {
- id: 'aa1939133d373c94879becb79d91828a892ee319',
- short_id: 'aa193913',
- title: "Merge branch 'master-test' into 'master'",
- created_at: '2018-10-22T11:41:33.000Z',
- parent_ids: [
- '4622f4dd792468993003caf2e3be978798cbe096',
- '76598df914cdfe87132d0c3c40f80db9fa9396a4',
- ],
- message:
- "Merge branch 'master-test' into 'master'\n\nUpdate .gitlab-ci.yml\n\nSee merge request root/ci-web-terminal!1",
- author_name: 'Administrator',
- author_email: 'admin@example.com',
- authored_date: '2018-10-22T11:41:33.000Z',
- committer_name: 'Administrator',
- committer_email: 'admin@example.com',
- committed_date: '2018-10-22T11:41:33.000Z',
- author: {
+ describe('pipeline for target branch after merge', () => {
+ describe('with information for target branch pipeline', () => {
+ beforeEach(done => {
+ vm.mr.state = 'merged';
+ vm.mr.mergePipeline = {
+ id: 127,
+ user: {
id: 1,
name: 'Administrator',
username: 'root',
@@ -768,88 +632,211 @@ describe('mrWidgetOptions', () => {
status_tooltip_html: null,
path: '/root',
},
- author_gravatar_url: null,
- commit_url:
- 'http://localhost:3000/root/ci-web-terminal/commit/aa1939133d373c94879becb79d91828a892ee319',
- commit_path: '/root/ci-web-terminal/commit/aa1939133d373c94879becb79d91828a892ee319',
- },
- cancel_path: '/root/ci-web-terminal/pipelines/127/cancel',
- };
- vm.$nextTick(done);
+ active: true,
+ coverage: null,
+ source: 'push',
+ created_at: '2018-10-22T11:41:35.186Z',
+ updated_at: '2018-10-22T11:41:35.433Z',
+ path: '/root/ci-web-terminal/pipelines/127',
+ flags: {
+ latest: true,
+ stuck: true,
+ auto_devops: false,
+ yaml_errors: false,
+ retryable: false,
+ cancelable: true,
+ failure_reason: false,
+ },
+ details: {
+ status: {
+ icon: 'status_pending',
+ text: 'pending',
+ label: 'pending',
+ group: 'pending',
+ tooltip: 'pending',
+ has_details: true,
+ details_path: '/root/ci-web-terminal/pipelines/127',
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_pending-5bdf338420e5221ca24353b6bff1c9367189588750632e9a871b7af09ff6a2ae.png',
+ },
+ duration: null,
+ finished_at: null,
+ stages: [
+ {
+ name: 'test',
+ title: 'test: pending',
+ status: {
+ icon: 'status_pending',
+ text: 'pending',
+ label: 'pending',
+ group: 'pending',
+ tooltip: 'pending',
+ has_details: true,
+ details_path: '/root/ci-web-terminal/pipelines/127#test',
+ illustration: null,
+ favicon:
+ '/assets/ci_favicons/favicon_status_pending-5bdf338420e5221ca24353b6bff1c9367189588750632e9a871b7af09ff6a2ae.png',
+ },
+ path: '/root/ci-web-terminal/pipelines/127#test',
+ dropdown_path: '/root/ci-web-terminal/pipelines/127/stage.json?stage=test',
+ },
+ ],
+ artifacts: [],
+ manual_actions: [],
+ scheduled_actions: [],
+ },
+ ref: {
+ name: 'master',
+ path: '/root/ci-web-terminal/commits/master',
+ tag: false,
+ branch: true,
+ },
+ commit: {
+ id: 'aa1939133d373c94879becb79d91828a892ee319',
+ short_id: 'aa193913',
+ title: "Merge branch 'master-test' into 'master'",
+ created_at: '2018-10-22T11:41:33.000Z',
+ parent_ids: [
+ '4622f4dd792468993003caf2e3be978798cbe096',
+ '76598df914cdfe87132d0c3c40f80db9fa9396a4',
+ ],
+ message:
+ "Merge branch 'master-test' into 'master'\n\nUpdate .gitlab-ci.yml\n\nSee merge request root/ci-web-terminal!1",
+ author_name: 'Administrator',
+ author_email: 'admin@example.com',
+ authored_date: '2018-10-22T11:41:33.000Z',
+ committer_name: 'Administrator',
+ committer_email: 'admin@example.com',
+ committed_date: '2018-10-22T11:41:33.000Z',
+ author: {
+ id: 1,
+ name: 'Administrator',
+ username: 'root',
+ state: 'active',
+ avatar_url: null,
+ web_url: 'http://localhost:3000/root',
+ status_tooltip_html: null,
+ path: '/root',
+ },
+ author_gravatar_url: null,
+ commit_url:
+ 'http://localhost:3000/root/ci-web-terminal/commit/aa1939133d373c94879becb79d91828a892ee319',
+ commit_path: '/root/ci-web-terminal/commit/aa1939133d373c94879becb79d91828a892ee319',
+ },
+ cancel_path: '/root/ci-web-terminal/pipelines/127/cancel',
+ };
+ vm.$nextTick(done);
+ });
+
+ it('renders pipeline block', () => {
+ expect(vm.$el.querySelector('.js-post-merge-pipeline')).not.toBeNull();
+ });
+
+ describe('with post merge deployments', () => {
+ beforeEach(done => {
+ vm.mr.postMergeDeployments = [
+ {
+ id: 15,
+ name: 'review/diplo',
+ url: '/root/acets-review-apps/environments/15',
+ stop_url: '/root/acets-review-apps/environments/15/stop',
+ metrics_url: '/root/acets-review-apps/environments/15/deployments/1/metrics',
+ metrics_monitoring_url: '/root/acets-review-apps/environments/15/metrics',
+ external_url: 'http://diplo.',
+ external_url_formatted: 'diplo.',
+ deployed_at: '2017-03-22T22:44:42.258Z',
+ deployed_at_formatted: 'Mar 22, 2017 10:44pm',
+ changes: [
+ {
+ path: 'index.html',
+ external_url:
+ 'http://root-master-patch-91341.volatile-watch.surge.sh/index.html',
+ },
+ {
+ path: 'imgs/gallery.html',
+ external_url:
+ 'http://root-master-patch-91341.volatile-watch.surge.sh/imgs/gallery.html',
+ },
+ {
+ path: 'about/',
+ external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/about/',
+ },
+ ],
+ status: 'success',
+ },
+ ];
+
+ vm.$nextTick(done);
+ });
+
+ it('renders post deployment information', () => {
+ expect(vm.$el.querySelector('.js-post-deployment')).not.toBeNull();
+ });
+ });
});
- it('renders pipeline block', () => {
- expect(vm.$el.querySelector('.js-post-merge-pipeline')).not.toBeNull();
+ describe('without information for target branch pipeline', () => {
+ beforeEach(done => {
+ vm.mr.state = 'merged';
+
+ vm.$nextTick(done);
+ });
+
+ it('does not render pipeline block', () => {
+ expect(vm.$el.querySelector('.js-post-merge-pipeline')).toBeNull();
+ });
});
- describe('with post merge deployments', () => {
+ describe('when state is not merged', () => {
beforeEach(done => {
- vm.mr.postMergeDeployments = [
- {
- id: 15,
- name: 'review/diplo',
- url: '/root/acets-review-apps/environments/15',
- stop_url: '/root/acets-review-apps/environments/15/stop',
- metrics_url: '/root/acets-review-apps/environments/15/deployments/1/metrics',
- metrics_monitoring_url: '/root/acets-review-apps/environments/15/metrics',
- external_url: 'http://diplo.',
- external_url_formatted: 'diplo.',
- deployed_at: '2017-03-22T22:44:42.258Z',
- deployed_at_formatted: 'Mar 22, 2017 10:44pm',
- changes: [
- {
- path: 'index.html',
- external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/index.html',
- },
- {
- path: 'imgs/gallery.html',
- external_url:
- 'http://root-master-patch-91341.volatile-watch.surge.sh/imgs/gallery.html',
- },
- {
- path: 'about/',
- external_url: 'http://root-master-patch-91341.volatile-watch.surge.sh/about/',
- },
- ],
- status: 'success',
- },
- ];
+ vm.mr.state = 'archived';
vm.$nextTick(done);
});
- it('renders post deployment information', () => {
- expect(vm.$el.querySelector('.js-post-deployment')).not.toBeNull();
+ it('does not render pipeline block', () => {
+ expect(vm.$el.querySelector('.js-post-merge-pipeline')).toBeNull();
+ });
+
+ it('does not render post deployment information', () => {
+ expect(vm.$el.querySelector('.js-post-deployment')).toBeNull();
});
});
});
- describe('without information for target branch pipeline', () => {
- beforeEach(done => {
- vm.mr.state = 'merged';
+ it('should not suggest pipelines', () => {
+ vm.mr.mergeRequestAddCiConfigPath = null;
- vm.$nextTick(done);
- });
+ expect(vm.shouldSuggestPipelines).toBeFalsy();
+ });
+ });
- it('does not render pipeline block', () => {
- expect(vm.$el.querySelector('.js-post-merge-pipeline')).toBeNull();
- });
+ describe('given suggestPipeline feature flag is enabled', () => {
+ beforeEach(() => {
+ gon.features = { suggestPipeline: true };
+ createComponent();
});
- describe('when state is not merged', () => {
- beforeEach(done => {
- vm.mr.state = 'archived';
+ it('should suggest pipelines when none exist', () => {
+ vm.mr.mergeRequestAddCiConfigPath = 'some/path';
+ vm.mr.hasCI = false;
- vm.$nextTick(done);
- });
+ expect(vm.shouldSuggestPipelines).toBeTruthy();
+ });
- it('does not render pipeline block', () => {
- expect(vm.$el.querySelector('.js-post-merge-pipeline')).toBeNull();
- });
+ it('should not suggest pipelines when they exist', () => {
+ vm.mr.mergeRequestAddCiConfigPath = null;
+ vm.mr.hasCI = false;
- it('does not render post deployment information', () => {
- expect(vm.$el.querySelector('.js-post-deployment')).toBeNull();
- });
+ expect(vm.shouldSuggestPipelines).toBeFalsy();
+ });
+
+ it('should not suggest pipelines hasCI is true', () => {
+ vm.mr.mergeRequestAddCiConfigPath = 'some/path';
+ vm.mr.hasCI = true;
+
+ expect(vm.shouldSuggestPipelines).toBeFalsy();
});
});
});