diff options
Diffstat (limited to 'spec/javascripts/vue_mr_widget/components')
29 files changed, 211 insertions, 341 deletions
diff --git a/spec/javascripts/vue_mr_widget/components/deployment_spec.js b/spec/javascripts/vue_mr_widget/components/deployment_spec.js deleted file mode 100644 index 1949bee1406..00000000000 --- a/spec/javascripts/vue_mr_widget/components/deployment_spec.js +++ /dev/null @@ -1,313 +0,0 @@ -import Vue from 'vue'; -import deploymentComponent from '~/vue_merge_request_widget/components/deployment.vue'; -import MRWidgetService from '~/vue_merge_request_widget/services/mr_widget_service'; -import { getTimeago } from '~/lib/utils/datetime_utility'; -import mountComponent from '../../helpers/vue_mount_component_helper'; - -describe('Deployment component', () => { - const Component = Vue.extend(deploymentComponent); - let deploymentMockData; - - beforeEach(() => { - deploymentMockData = { - id: 15, - name: 'review/diplo', - url: '/root/review-apps/environments/15', - stop_url: '/root/review-apps/environments/15/stop', - metrics_url: '/root/review-apps/environments/15/deployments/1/metrics', - metrics_monitoring_url: '/root/review-apps/environments/15/metrics', - external_url: 'http://gitlab.com.', - external_url_formatted: 'gitlab', - 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/', - }, - ], - }; - }); - - let vm; - - afterEach(() => { - vm.$destroy(); - }); - - describe('', () => { - beforeEach(() => { - vm = mountComponent(Component, { deployment: { ...deploymentMockData }, showMetrics: true }); - }); - - describe('deployTimeago', () => { - it('return formatted date', () => { - const readable = getTimeago().format(deploymentMockData.deployed_at); - - expect(vm.deployTimeago).toEqual(readable); - }); - }); - - describe('hasExternalUrls', () => { - it('should return true', () => { - expect(vm.hasExternalUrls).toEqual(true); - }); - - it('should return false when deployment has no external_url_formatted', () => { - vm.deployment.external_url_formatted = null; - - expect(vm.hasExternalUrls).toEqual(false); - }); - - it('should return false when deployment has no external_url', () => { - vm.deployment.external_url = null; - - expect(vm.hasExternalUrls).toEqual(false); - }); - }); - - describe('hasDeploymentTime', () => { - it('should return true', () => { - expect(vm.hasDeploymentTime).toEqual(true); - }); - - it('should return false when deployment has no deployed_at', () => { - vm.deployment.deployed_at = null; - - expect(vm.hasDeploymentTime).toEqual(false); - }); - - it('should return false when deployment has no deployed_at_formatted', () => { - vm.deployment.deployed_at_formatted = null; - - expect(vm.hasDeploymentTime).toEqual(false); - }); - }); - - describe('hasDeploymentMeta', () => { - it('should return true', () => { - expect(vm.hasDeploymentMeta).toEqual(true); - }); - - it('should return false when deployment has no url', () => { - vm.deployment.url = null; - - expect(vm.hasDeploymentMeta).toEqual(false); - }); - - it('should return false when deployment has no name', () => { - vm.deployment.name = null; - - expect(vm.hasDeploymentMeta).toEqual(false); - }); - }); - - describe('stopEnvironment', () => { - const url = '/foo/bar'; - const returnPromise = () => - new Promise(resolve => { - resolve({ - data: { - redirect_url: url, - }, - }); - }); - const mockStopEnvironment = () => { - vm.stopEnvironment(deploymentMockData); - return vm; - }; - - it('should show a confirm dialog and call service.stopEnvironment when confirmed', done => { - spyOn(window, 'confirm').and.returnValue(true); - spyOn(MRWidgetService, 'stopEnvironment').and.returnValue(returnPromise(true)); - const visitUrl = spyOnDependency(deploymentComponent, 'visitUrl').and.returnValue(true); - vm = mockStopEnvironment(); - - expect(window.confirm).toHaveBeenCalled(); - expect(MRWidgetService.stopEnvironment).toHaveBeenCalledWith(deploymentMockData.stop_url); - setTimeout(() => { - expect(visitUrl).toHaveBeenCalledWith(url); - done(); - }, 333); - }); - - it('should show a confirm dialog but should not work if the dialog is rejected', () => { - spyOn(window, 'confirm').and.returnValue(false); - spyOn(MRWidgetService, 'stopEnvironment').and.returnValue(returnPromise(false)); - vm = mockStopEnvironment(); - - expect(window.confirm).toHaveBeenCalled(); - expect(MRWidgetService.stopEnvironment).not.toHaveBeenCalled(); - }); - }); - - it('renders deployment name', () => { - expect(vm.$el.querySelector('.js-deploy-meta').getAttribute('href')).toEqual( - deploymentMockData.url, - ); - - expect(vm.$el.querySelector('.js-deploy-meta').innerText).toContain(deploymentMockData.name); - }); - - it('renders external URL', () => { - expect(vm.$el.querySelector('.js-deploy-url').getAttribute('href')).toEqual( - deploymentMockData.external_url, - ); - - expect(vm.$el.querySelector('.js-deploy-url').innerText).toContain('View app'); - }); - - it('renders stop button', () => { - expect(vm.$el.querySelector('.btn')).not.toBeNull(); - }); - - it('renders deployment time', () => { - expect(vm.$el.querySelector('.js-deploy-time').innerText).toContain(vm.deployTimeago); - }); - - it('renders metrics component', () => { - expect(vm.$el.querySelector('.js-mr-memory-usage')).not.toBeNull(); - }); - }); - - describe('with showMetrics enabled', () => { - beforeEach(() => { - vm = mountComponent(Component, { deployment: { ...deploymentMockData }, showMetrics: true }); - }); - - it('shows metrics', () => { - expect(vm.$el).toContainElement('.js-mr-memory-usage'); - }); - }); - - describe('with showMetrics disabled', () => { - beforeEach(() => { - vm = mountComponent(Component, { deployment: { ...deploymentMockData }, showMetrics: false }); - }); - - it('hides metrics', () => { - expect(vm.$el).not.toContainElement('.js-mr-memory-usage'); - }); - }); - - describe('without changes', () => { - beforeEach(() => { - delete deploymentMockData.changes; - - vm = mountComponent(Component, { deployment: { ...deploymentMockData }, showMetrics: true }); - }); - - it('renders the link to the review app without dropdown', () => { - expect(vm.$el.querySelector('.js-mr-wigdet-deployment-dropdown')).toBeNull(); - expect(vm.$el.querySelector('.js-deploy-url')).not.toBeNull(); - }); - }); - - describe('with a single change', () => { - beforeEach(() => { - deploymentMockData.changes = deploymentMockData.changes.slice(0, 1); - - vm = mountComponent(Component, { - deployment: { ...deploymentMockData }, - showMetrics: true, - }); - }); - - it('renders the link to the review app without dropdown', () => { - expect(vm.$el.querySelector('.js-mr-wigdet-deployment-dropdown')).toBeNull(); - expect(vm.$el.querySelector('.js-deploy-url')).not.toBeNull(); - }); - - it('renders the link to the review app linked to to the first change', () => { - const expectedUrl = deploymentMockData.changes[0].external_url; - const deployUrl = vm.$el.querySelector('.js-deploy-url'); - - expect(vm.$el.querySelector('.js-mr-wigdet-deployment-dropdown')).toBeNull(); - expect(deployUrl).not.toBeNull(); - expect(deployUrl.href).toEqual(expectedUrl); - }); - }); - - describe('deployment status', () => { - describe('running', () => { - beforeEach(() => { - vm = mountComponent(Component, { - deployment: Object.assign({}, deploymentMockData, { status: 'running' }), - showMetrics: true, - }); - }); - - it('renders information about running deployment', () => { - expect(vm.$el.querySelector('.js-deployment-info').textContent).toContain('Deploying to'); - }); - - it('renders disabled stop button', () => { - expect(vm.$el.querySelector('.js-stop-env').getAttribute('disabled')).toBe('disabled'); - }); - }); - - describe('success', () => { - beforeEach(() => { - vm = mountComponent(Component, { - deployment: Object.assign({}, deploymentMockData, { status: 'success' }), - showMetrics: true, - }); - }); - - it('renders information about finished deployment', () => { - expect(vm.$el.querySelector('.js-deployment-info').textContent).toContain('Deployed to'); - }); - }); - - describe('failed', () => { - beforeEach(() => { - vm = mountComponent(Component, { - deployment: Object.assign({}, deploymentMockData, { status: 'failed' }), - showMetrics: true, - }); - }); - - it('renders information about finished deployment', () => { - expect(vm.$el.querySelector('.js-deployment-info').textContent).toContain( - 'Failed to deploy to', - ); - }); - }); - - describe('created', () => { - beforeEach(() => { - vm = mountComponent(Component, { - deployment: Object.assign({}, deploymentMockData, { status: 'created' }), - showMetrics: true, - }); - }); - - it('renders information about created deployment', () => { - expect(vm.$el.querySelector('.js-deployment-info').textContent).toContain('Will deploy to'); - }); - }); - - describe('canceled', () => { - beforeEach(() => { - vm = mountComponent(Component, { - deployment: Object.assign({}, deploymentMockData, { status: 'canceled' }), - showMetrics: true, - }); - }); - - it('renders information about canceled deployment', () => { - expect(vm.$el.querySelector('.js-deployment-info').textContent).toContain( - 'Failed to deploy to', - ); - }); - }); - }); -}); diff --git a/spec/javascripts/vue_mr_widget/components/deployment_stop_button_spec.js b/spec/javascripts/vue_mr_widget/components/deployment_stop_button_spec.js new file mode 100644 index 00000000000..6a6d8279c2c --- /dev/null +++ b/spec/javascripts/vue_mr_widget/components/deployment_stop_button_spec.js @@ -0,0 +1,95 @@ +import Vue from 'vue'; +import deploymentStopComponent from '~/vue_merge_request_widget/components/deployment/deployment_stop_button.vue'; +import { SUCCESS } from '~/vue_merge_request_widget/components/deployment/constants'; +import MRWidgetService from '~/vue_merge_request_widget/services/mr_widget_service'; +import mountComponent from '../../helpers/vue_mount_component_helper'; + +describe('Deployment component', () => { + const Component = Vue.extend(deploymentStopComponent); + let deploymentMockData; + + beforeEach(() => { + deploymentMockData = { + id: 15, + name: 'review/diplo', + url: '/root/review-apps/environments/15', + stop_url: '/root/review-apps/environments/15/stop', + metrics_url: '/root/review-apps/environments/15/deployments/1/metrics', + metrics_monitoring_url: '/root/review-apps/environments/15/metrics', + external_url: 'http://gitlab.com.', + external_url_formatted: 'gitlab', + deployed_at: '2017-03-22T22:44:42.258Z', + deployed_at_formatted: 'Mar 22, 2017 10:44pm', + deployment_manual_actions: [], + status: SUCCESS, + 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/', + }, + ], + }; + }); + + let vm; + + afterEach(() => { + vm.$destroy(); + }); + + describe('', () => { + beforeEach(() => { + vm = mountComponent(Component, { + stopUrl: deploymentMockData.stop_url, + isDeployInProgress: false, + }); + }); + + describe('stopEnvironment', () => { + const url = '/foo/bar'; + const returnPromise = () => + new Promise(resolve => { + resolve({ + data: { + redirect_url: url, + }, + }); + }); + const mockStopEnvironment = () => { + vm.stopEnvironment(deploymentMockData); + return vm; + }; + + it('should show a confirm dialog and call service.stopEnvironment when confirmed', done => { + spyOn(window, 'confirm').and.returnValue(true); + spyOn(MRWidgetService, 'stopEnvironment').and.returnValue(returnPromise(true)); + const visitUrl = spyOnDependency(deploymentStopComponent, 'visitUrl').and.returnValue(true); + vm = mockStopEnvironment(); + + expect(window.confirm).toHaveBeenCalled(); + expect(MRWidgetService.stopEnvironment).toHaveBeenCalledWith(deploymentMockData.stop_url); + setTimeout(() => { + expect(visitUrl).toHaveBeenCalledWith(url); + done(); + }, 333); + }); + + it('should show a confirm dialog but should not work if the dialog is rejected', () => { + spyOn(window, 'confirm').and.returnValue(false); + spyOn(MRWidgetService, 'stopEnvironment').and.returnValue(returnPromise(false)); + vm = mockStopEnvironment(); + + expect(window.confirm).toHaveBeenCalled(); + expect(MRWidgetService.stopEnvironment).not.toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_alert_message_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_alert_message_spec.js index 8ec17efffb9..bd567f1f93a 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_alert_message_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_alert_message_spec.js @@ -1,6 +1,6 @@ import { shallowMount, createLocalVue } from '@vue/test-utils'; -import MrWidgetAlertMessage from '~/vue_merge_request_widget/components/mr_widget_alert_message.vue'; import { GlLink } from '@gitlab/ui'; +import MrWidgetAlertMessage from '~/vue_merge_request_widget/components/mr_widget_alert_message.vue'; describe('MrWidgetAlertMessage', () => { let wrapper; diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_author_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_author_spec.js index b69082082ba..a942a9dec87 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_author_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_author_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import MrWidgetAuthor from '~/vue_merge_request_widget/components/mr_widget_author.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import MrWidgetAuthor from '~/vue_merge_request_widget/components/mr_widget_author.vue'; describe('MrWidgetAuthor', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_author_time_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_author_time_spec.js index 787f44e478d..55af2baa924 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_author_time_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_author_time_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import MrWidgetAuthorTime from '~/vue_merge_request_widget/components/mr_widget_author_time.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import MrWidgetAuthorTime from '~/vue_merge_request_widget/components/mr_widget_author_time.vue'; describe('MrWidgetAuthorTime', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js index cd77b0ab815..de1d351677c 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_header_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import headerComponent from '~/vue_merge_request_widget/components/mr_widget_header.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import headerComponent from '~/vue_merge_request_widget/components/mr_widget_header.vue'; describe('MRWidgetHeader', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js index 4baaea9745a..d15c3552b4a 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js @@ -1,5 +1,5 @@ import Vue from 'vue'; -import MemoryUsage from '~/vue_merge_request_widget/components/memory_usage.vue'; +import MemoryUsage from '~/vue_merge_request_widget/components/deployment/memory_usage.vue'; import MRWidgetService from '~/vue_merge_request_widget/services/mr_widget_service'; const url = '/root/acets-review-apps/environments/15/deployments/1/metrics'; @@ -185,6 +185,7 @@ describe('MemoryUsage', () => { vm.loadingMetrics = false; vm.hasMetrics = true; vm.loadFailed = false; + vm.memoryMetrics = metricsMockData.metrics.memory_values[0].values; Vue.nextTick(() => { expect(el.querySelector('.memory-graph-container')).toBeDefined(); diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_merge_help_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_merge_help_spec.js index 2c554f3f3ab..b566876fe1d 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_merge_help_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_merge_help_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import mergeHelpComponent from '~/vue_merge_request_widget/components/mr_widget_merge_help.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import mergeHelpComponent from '~/vue_merge_request_widget/components/mr_widget_merge_help.vue'; describe('MRWidgetMergeHelp', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_container_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_container_spec.js index 6cdf60f3535..2d6d22d66aa 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_container_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_container_spec.js @@ -4,18 +4,19 @@ import MrWidgetPipeline from '~/vue_merge_request_widget/components/mr_widget_pi import ArtifactsApp from '~/vue_merge_request_widget/components/artifacts_list_app.vue'; import { mockStore } from '../mock_data'; +const localVue = createLocalVue(); + describe('MrWidgetPipelineContainer', () => { let wrapper; const factory = (props = {}) => { - const localVue = createLocalVue(); - wrapper = mount(localVue.extend(MrWidgetPipelineContainer), { propsData: { mr: Object.assign({}, mockStore), ...props, }, localVue, + sync: false, }); }; @@ -33,6 +34,7 @@ describe('MrWidgetPipelineContainer', () => { expect(wrapper.find(MrWidgetPipeline).props()).toEqual( jasmine.objectContaining({ pipeline: mockStore.pipeline, + pipelineCoverageDelta: mockStore.pipelineCoverageDelta, ciStatus: mockStore.ciStatus, hasCi: mockStore.hasCI, sourceBranch: mockStore.sourceBranch, @@ -67,6 +69,7 @@ describe('MrWidgetPipelineContainer', () => { expect(wrapper.find(MrWidgetPipeline).props()).toEqual( jasmine.objectContaining({ pipeline: mockStore.mergePipeline, + pipelineCoverageDelta: mockStore.pipelineCoverageDelta, ciStatus: mockStore.ciStatus, hasCi: mockStore.hasCI, sourceBranch: mockStore.targetBranch, diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js index 67e85763fae..5997c93105e 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_spec.js @@ -1,7 +1,7 @@ import Vue from 'vue'; -import pipelineComponent from '~/vue_merge_request_widget/components/mr_widget_pipeline.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; import { trimText } from 'spec/helpers/text_helper'; +import pipelineComponent from '~/vue_merge_request_widget/components/mr_widget_pipeline.vue'; import mockData from '../mock_data'; describe('MRWidgetPipeline', () => { @@ -62,6 +62,38 @@ describe('MRWidgetPipeline', () => { expect(vm.hasCIError).toEqual(true); }); }); + + describe('coverageDeltaClass', () => { + it('should return no class if there is no coverage change', () => { + vm = mountComponent(Component, { + pipeline: mockData.pipeline, + pipelineCoverageDelta: '0', + troubleshootingDocsPath: 'help', + }); + + expect(vm.coverageDeltaClass).toEqual(''); + }); + + it('should return text-success if the coverage increased', () => { + vm = mountComponent(Component, { + pipeline: mockData.pipeline, + pipelineCoverageDelta: '10', + troubleshootingDocsPath: 'help', + }); + + expect(vm.coverageDeltaClass).toEqual('text-success'); + }); + + it('should return text-danger if the coverage decreased', () => { + vm = mountComponent(Component, { + pipeline: mockData.pipeline, + pipelineCoverageDelta: '-12', + troubleshootingDocsPath: 'help', + }); + + expect(vm.coverageDeltaClass).toEqual('text-danger'); + }); + }); }); describe('rendered output', () => { @@ -96,6 +128,7 @@ describe('MRWidgetPipeline', () => { pipeline: mockData.pipeline, hasCi: true, ciStatus: 'success', + pipelineCoverageDelta: mockData.pipelineCoverageDelta, troubleshootingDocsPath: 'help', }); }); @@ -132,6 +165,13 @@ describe('MRWidgetPipeline', () => { `Coverage ${mockData.pipeline.coverage}`, ); }); + + it('should render pipeline coverage delta information', () => { + expect(vm.$el.querySelector('.js-pipeline-coverage-delta.text-danger')).toBeDefined(); + expect(vm.$el.querySelector('.js-pipeline-coverage-delta').textContent).toContain( + `(${mockData.pipelineCoverageDelta}%)`, + ); + }); }); describe('without commit path', () => { diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_rebase_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_rebase_spec.js index 7216ad00cc1..5b293862b16 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_rebase_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_rebase_spec.js @@ -1,7 +1,7 @@ import Vue from 'vue'; +import mountComponent from 'spec/helpers/vue_mount_component_helper'; import eventHub from '~/vue_merge_request_widget/event_hub'; import component from '~/vue_merge_request_widget/components/states/mr_widget_rebase.vue'; -import mountComponent from 'spec/helpers/vue_mount_component_helper'; describe('Merge request widget rebase component', () => { let Component; diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_related_links_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_related_links_spec.js index 7a5d0efdea5..a152bd01916 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_related_links_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_related_links_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import relatedLinksComponent from '~/vue_merge_request_widget/components/mr_widget_related_links.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import relatedLinksComponent from '~/vue_merge_request_widget/components/mr_widget_related_links.vue'; describe('MRWidgetRelatedLinks', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js index 5aac37d28df..20bda024d89 100644 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js +++ b/spec/javascripts/vue_mr_widget/components/mr_widget_status_icon_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import mrStatusIcon from '~/vue_merge_request_widget/components/mr_widget_status_icon.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import mrStatusIcon from '~/vue_merge_request_widget/components/mr_widget_status_icon.vue'; describe('MR widget status icon component', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/review_app_link_spec.js b/spec/javascripts/vue_mr_widget/components/review_app_link_spec.js index 68a65bd21c6..bd481f93413 100644 --- a/spec/javascripts/vue_mr_widget/components/review_app_link_spec.js +++ b/spec/javascripts/vue_mr_widget/components/review_app_link_spec.js @@ -1,4 +1,5 @@ import Vue from 'vue'; +import { mockTracking, triggerEvent } from 'spec/helpers/tracking_helper'; import component from '~/vue_merge_request_widget/components/review_app_link.vue'; import mountComponent from '../../helpers/vue_mount_component_helper'; @@ -7,6 +8,7 @@ describe('review app link', () => { const props = { link: '/review', cssClass: 'js-link', + isCurrent: true, }; let vm; let el; @@ -35,4 +37,13 @@ describe('review app link', () => { it('renders svg icon', () => { expect(el.querySelector('svg')).not.toBeNull(); }); + + it('tracks an event when clicked', () => { + const spy = mockTracking('_category_', el, spyOn); + triggerEvent(el); + + expect(spy).toHaveBeenCalledWith('_category_', 'open_review_app', { + label: 'review_app', + }); + }); }); diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_archived_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_archived_spec.js index b90f5881a4d..29a257b0e24 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_archived_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_archived_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import archivedComponent from '~/vue_merge_request_widget/components/states/mr_widget_archived.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import archivedComponent from '~/vue_merge_request_widget/components/states/mr_widget_archived.vue'; describe('MRWidgetArchived', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_enabled_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_enabled_spec.js index 2ea8c169add..73b65178ecf 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_enabled_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_auto_merge_enabled_spec.js @@ -1,9 +1,9 @@ import Vue from 'vue'; +import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import { trimText } from 'spec/helpers/text_helper'; import autoMergeEnabledComponent from '~/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue'; import MRWidgetService from '~/vue_merge_request_widget/services/mr_widget_service'; import eventHub from '~/vue_merge_request_widget/event_hub'; -import mountComponent from 'spec/helpers/vue_mount_component_helper'; -import { trimText } from 'spec/helpers/text_helper'; import { MWPS_MERGE_STRATEGY } from '~/vue_merge_request_widget/constants'; describe('MRWidgetAutoMergeEnabled', () => { diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js index 70c70eca746..4f6451473e8 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_checking_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import checkingComponent from '~/vue_merge_request_widget/components/states/mr_widget_checking.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import checkingComponent from '~/vue_merge_request_widget/components/states/mr_widget_checking.vue'; describe('MRWidgetChecking', () => { let Component; diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_closed_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_closed_spec.js index 9523e7d5474..bbbaed0d2f5 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_closed_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_closed_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import closedComponent from '~/vue_merge_request_widget/components/states/mr_widget_closed.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import closedComponent from '~/vue_merge_request_widget/components/states/mr_widget_closed.vue'; describe('MRWidgetClosed', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_conflicts_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_conflicts_spec.js index 55073f5537c..9035bc6f65d 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_conflicts_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_conflicts_spec.js @@ -1,7 +1,7 @@ import $ from 'jquery'; import { createLocalVue, shallowMount } from '@vue/test-utils'; -import ConflictsComponent from '~/vue_merge_request_widget/components/states/mr_widget_conflicts.vue'; import { removeBreakLine } from 'spec/helpers/text_helper'; +import ConflictsComponent from '~/vue_merge_request_widget/components/states/mr_widget_conflicts.vue'; describe('MRWidgetConflicts', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_failed_to_merge_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_failed_to_merge_spec.js index 780bed1bf69..ef76e617c07 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_failed_to_merge_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_failed_to_merge_spec.js @@ -1,7 +1,7 @@ import Vue from 'vue'; +import mountComponent from 'spec/helpers/vue_mount_component_helper'; import failedToMergeComponent from '~/vue_merge_request_widget/components/states/mr_widget_failed_to_merge.vue'; import eventHub from '~/vue_merge_request_widget/event_hub'; -import mountComponent from 'spec/helpers/vue_mount_component_helper'; describe('MRWidgetFailedToMerge', () => { const dummyIntervalId = 1337; diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_merged_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_merged_spec.js index 1683da805b9..423c800bfbc 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_merged_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_merged_spec.js @@ -1,7 +1,7 @@ import Vue from 'vue'; +import mountComponent from 'spec/helpers/vue_mount_component_helper'; import mergedComponent from '~/vue_merge_request_widget/components/states/mr_widget_merged.vue'; import eventHub from '~/vue_merge_request_widget/event_hub'; -import mountComponent from 'spec/helpers/vue_mount_component_helper'; describe('MRWidgetMerged', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_merging_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_merging_spec.js index 57773d1648a..06d236064dd 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_merging_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_merging_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import mergingComponent from '~/vue_merge_request_widget/components/states/mr_widget_merging.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import mergingComponent from '~/vue_merge_request_widget/components/states/mr_widget_merging.vue'; describe('MRWidgetMerging', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_missing_branch_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_missing_branch_spec.js index 5fd8093bf5c..47b989e2022 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_missing_branch_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_missing_branch_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import missingBranchComponent from '~/vue_merge_request_widget/components/states/mr_widget_missing_branch.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import missingBranchComponent from '~/vue_merge_request_widget/components/states/mr_widget_missing_branch.vue'; describe('MRWidgetMissingBranch', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_not_allowed_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_not_allowed_spec.js index 6b95ca3460b..b1cb91663c9 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_not_allowed_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_not_allowed_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import notAllowedComponent from '~/vue_merge_request_widget/components/states/mr_widget_not_allowed.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import notAllowedComponent from '~/vue_merge_request_widget/components/states/mr_widget_not_allowed.vue'; describe('MRWidgetNotAllowed', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_blocked_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_blocked_spec.js index 1d2f3e41509..0bca86b12b2 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_blocked_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_blocked_spec.js @@ -1,7 +1,7 @@ import Vue from 'vue'; -import pipelineBlockedComponent from '~/vue_merge_request_widget/components/states/mr_widget_pipeline_blocked.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; import { removeBreakLine } from 'spec/helpers/text_helper'; +import pipelineBlockedComponent from '~/vue_merge_request_widget/components/states/mr_widget_pipeline_blocked.vue'; describe('MRWidgetPipelineBlocked', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_failed_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_failed_spec.js index 3e4ce2c3696..85f65d024a8 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_failed_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_pipeline_failed_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import PipelineFailed from '~/vue_merge_request_widget/components/states/pipeline_failed.vue'; import { removeBreakLine } from 'spec/helpers/text_helper'; +import PipelineFailed from '~/vue_merge_request_widget/components/states/pipeline_failed.vue'; describe('PipelineFailed', () => { describe('template', () => { diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js index 2bb2319cc60..a2fa098bf6b 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js @@ -1,11 +1,11 @@ import Vue from 'vue'; +import { createLocalVue, shallowMount } from '@vue/test-utils'; import ReadyToMerge from '~/vue_merge_request_widget/components/states/ready_to_merge.vue'; import SquashBeforeMerge from '~/vue_merge_request_widget/components/states/squash_before_merge.vue'; import CommitsHeader from '~/vue_merge_request_widget/components/states/commits_header.vue'; import CommitEdit from '~/vue_merge_request_widget/components/states/commit_edit.vue'; import CommitMessageDropdown from '~/vue_merge_request_widget/components/states/commit_message_dropdown.vue'; import eventHub from '~/vue_merge_request_widget/event_hub'; -import { createLocalVue, shallowMount } from '@vue/test-utils'; import { MWPS_MERGE_STRATEGY, MTWPS_MERGE_STRATEGY } from '~/vue_merge_request_widget/constants'; const commitMessage = 'This is the commit message'; @@ -288,6 +288,12 @@ describe('ReadyToMerge', () => { expect(vm.isMergeButtonDisabled).toBe(true); }); }); + + describe('isMergeImmediatelyDangerous', () => { + it('should always return false in CE', () => { + expect(vm.isMergeImmediatelyDangerous).toBe(false); + }); + }); }); describe('methods', () => { @@ -938,4 +944,31 @@ describe('ReadyToMerge', () => { expect(customVm.$el.querySelector('.js-modify-commit-message-button')).toBeNull(); }); }); + + describe('with a mismatched SHA', () => { + const findMismatchShaBlock = () => vm.$el.querySelector('.js-sha-mismatch'); + + beforeEach(() => { + vm = createComponent({ + mr: { + isSHAMismatch: true, + mergeRequestDiffsPath: '/merge_requests/1/diffs', + }, + }); + }); + + it('displays a warning message', () => { + expect(findMismatchShaBlock()).toExist(); + }); + + it('warns the user to refresh to review', () => { + expect(findMismatchShaBlock().textContent.trim()).toBe( + 'New changes were added. Reload the page to review them', + ); + }); + + it('displays link to the diffs tab', () => { + expect(findMismatchShaBlock().querySelector('a').href).toContain(vm.mr.mergeRequestDiffsPath); + }); + }); }); diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_sha_mismatch_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_sha_mismatch_spec.js index 9324c83bf4b..11eb0fef9b2 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_sha_mismatch_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_sha_mismatch_spec.js @@ -1,7 +1,7 @@ import Vue from 'vue'; -import ShaMismatch from '~/vue_merge_request_widget/components/states/sha_mismatch.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; import { removeBreakLine } from 'spec/helpers/text_helper'; +import ShaMismatch from '~/vue_merge_request_widget/components/states/sha_mismatch.vue'; describe('ShaMismatch', () => { let vm; diff --git a/spec/javascripts/vue_mr_widget/components/states/mr_widget_unresolved_discussions_spec.js b/spec/javascripts/vue_mr_widget/components/states/mr_widget_unresolved_discussions_spec.js index 5bd1af56bcc..e8367caa438 100644 --- a/spec/javascripts/vue_mr_widget/components/states/mr_widget_unresolved_discussions_spec.js +++ b/spec/javascripts/vue_mr_widget/components/states/mr_widget_unresolved_discussions_spec.js @@ -1,6 +1,6 @@ import Vue from 'vue'; -import UnresolvedDiscussions from '~/vue_merge_request_widget/components/states/unresolved_discussions.vue'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; +import UnresolvedDiscussions from '~/vue_merge_request_widget/components/states/unresolved_discussions.vue'; describe('UnresolvedDiscussions', () => { const Component = Vue.extend(UnresolvedDiscussions); |