diff options
Diffstat (limited to 'spec/javascripts')
6 files changed, 110 insertions, 317 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_memory_usage_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_memory_usage_spec.js index 99de320ca2b..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'; 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 069bc14e01e..d8d84d087bc 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 @@ -8,6 +8,7 @@ describe('review app link', () => { const props = { link: '/review', cssClass: 'js-link', + isCurrent: true, }; let vm; let el; diff --git a/spec/javascripts/vue_mr_widget/mock_data.js b/spec/javascripts/vue_mr_widget/mock_data.js index 40bec001ffe..ff34dafa660 100644 --- a/spec/javascripts/vue_mr_widget/mock_data.js +++ b/spec/javascripts/vue_mr_widget/mock_data.js @@ -1,3 +1,5 @@ +import { SUCCESS } from '~/vue_merge_request_widget/components/deployment/constants'; + export default { id: 132, iid: 22, @@ -290,15 +292,20 @@ export const mockStore = { name: 'bogus', external_url: 'https://fake.com', external_url_formatted: 'https://fake.com', + status: SUCCESS, }, { id: 1, name: 'bogus-docs', external_url: 'https://fake.com', external_url_formatted: 'https://fake.com', + status: SUCCESS, }, ], - postMergeDeployments: [{ id: 0, name: 'prod' }, { id: 1, name: 'prod-docs' }], + postMergeDeployments: [ + { id: 0, name: 'prod', status: SUCCESS }, + { id: 1, name: 'prod-docs', status: SUCCESS }, + ], troubleshootingDocsPath: 'troubleshooting-docs-path', ciStatus: 'ci-status', hasCI: true, 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 30e0504e4e1..604b21e77fe 100644 --- a/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js +++ b/spec/javascripts/vue_mr_widget/mr_widget_options_spec.js @@ -6,6 +6,7 @@ import { stateKey } from '~/vue_merge_request_widget/stores/state_maps'; import mountComponent from 'spec/helpers/vue_mount_component_helper'; import mockData from './mock_data'; import { faviconDataUrl, overlayDataUrl } from '../lib/utils/mock_data'; +import { SUCCESS } from '~/vue_merge_request_widget/components/deployment/constants'; const returnPromise = data => new Promise(resolve => { @@ -277,7 +278,9 @@ describe('mrWidgetOptions', () => { describe('fetchDeployments', () => { it('should fetch deployments', done => { - spyOn(vm.service, 'fetchDeployments').and.returnValue(returnPromise([{ id: 1 }])); + spyOn(vm.service, 'fetchDeployments').and.returnValue( + returnPromise([{ id: 1, status: SUCCESS }]), + ); vm.fetchPreMergeDeployments(); @@ -554,7 +557,7 @@ describe('mrWidgetOptions', () => { deployed_at: '2017-03-22T22:44:42.258Z', deployed_at_formatted: 'Mar 22, 2017 10:44pm', changes, - status: 'success', + status: SUCCESS, }; beforeEach(done => { |