diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-20 14:34:42 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-20 14:34:42 +0000 |
commit | 9f46488805e86b1bc341ea1620b866016c2ce5ed (patch) | |
tree | f9748c7e287041e37d6da49e0a29c9511dc34768 /spec/frontend/jira_import | |
parent | dfc92d081ea0332d69c8aca2f0e745cb48ae5e6d (diff) | |
download | gitlab-ce-9f46488805e86b1bc341ea1620b866016c2ce5ed.tar.gz |
Add latest changes from gitlab-org/gitlab@13-0-stable-ee
Diffstat (limited to 'spec/frontend/jira_import')
5 files changed, 188 insertions, 49 deletions
diff --git a/spec/frontend/jira_import/components/jira_import_app_spec.js b/spec/frontend/jira_import/components/jira_import_app_spec.js index ce32559d5c9..0040e71c192 100644 --- a/spec/frontend/jira_import/components/jira_import_app_spec.js +++ b/spec/frontend/jira_import/components/jira_import_app_spec.js @@ -1,5 +1,5 @@ import { GlAlert, GlLoadingIcon } from '@gitlab/ui'; -import { shallowMount } from '@vue/test-utils'; +import { mount, shallowMount } from '@vue/test-utils'; import Vue from 'vue'; import JiraImportApp from '~/jira_import/components/jira_import_app.vue'; import JiraImportForm from '~/jira_import/components/jira_import_form.vue'; @@ -11,12 +11,16 @@ import { IMPORT_STATE } from '~/jira_import/utils'; const mountComponent = ({ isJiraConfigured = true, errorMessage = '', - showAlert = true, + selectedProject = 'MTG', + showAlert = false, status = IMPORT_STATE.NONE, loading = false, mutate = jest.fn(() => Promise.resolve()), -} = {}) => - shallowMount(JiraImportApp, { + mountType, +} = {}) => { + const mountFunction = mountType === 'mount' ? mount : shallowMount; + + return mountFunction(JiraImportApp, { propsData: { isJiraConfigured, inProgressIllustration: 'in-progress-illustration.svg', @@ -26,6 +30,7 @@ const mountComponent = ({ ['My Second Jira Project', 'MSJP'], ['Migrate to GitLab', 'MTG'], ], + jiraIntegrationPath: 'gitlab-org/gitlab-test/-/services/jira/edit', projectPath: 'gitlab-org/gitlab-test', setupIllustration: 'setup-illustration.svg', }, @@ -33,15 +38,32 @@ const mountComponent = ({ return { errorMessage, showAlert, + selectedProject, jiraImportDetails: { status, - import: { - jiraProjectKey: 'MTG', - scheduledAt: '2020-04-08T12:17:25+00:00', - scheduledBy: { - name: 'Jane Doe', + imports: [ + { + jiraProjectKey: 'MTG', + scheduledAt: '2020-04-08T10:11:12+00:00', + scheduledBy: { + name: 'John Doe', + }, }, - }, + { + jiraProjectKey: 'MSJP', + scheduledAt: '2020-04-09T13:14:15+00:00', + scheduledBy: { + name: 'Jimmy Doe', + }, + }, + { + jiraProjectKey: 'MTG', + scheduledAt: '2020-04-09T16:17:18+00:00', + scheduledBy: { + name: 'Jane Doe', + }, + }, + ], }, }; }, @@ -52,6 +74,7 @@ const mountComponent = ({ }, }, }); +}; describe('JiraImportApp', () => { let wrapper; @@ -159,6 +182,64 @@ describe('JiraImportApp', () => { }); }); + describe('import in progress screen', () => { + beforeEach(() => { + wrapper = mountComponent({ status: IMPORT_STATE.SCHEDULED }); + }); + + it('shows the illustration', () => { + expect(getProgressComponent().props('illustration')).toBe('in-progress-illustration.svg'); + }); + + it('shows the name of the most recent import initiator', () => { + expect(getProgressComponent().props('importInitiator')).toBe('Jane Doe'); + }); + + it('shows the name of the most recent imported project', () => { + expect(getProgressComponent().props('importProject')).toBe('MTG'); + }); + + it('shows the time of the most recent import', () => { + expect(getProgressComponent().props('importTime')).toBe('2020-04-09T16:17:18+00:00'); + }); + + it('has the path to the issues page', () => { + expect(getProgressComponent().props('issuesPath')).toBe('gitlab-org/gitlab-test/-/issues'); + }); + }); + + describe('jira import form screen', () => { + describe('when selected project has been imported before', () => { + it('shows jira-import::MTG-3 label since project MTG has been imported 2 time before', () => { + wrapper = mountComponent(); + + expect(getFormComponent().props('importLabel')).toBe('jira-import::MTG-3'); + }); + + it('shows warning alert to explain project MTG has been imported 2 times before', () => { + wrapper = mountComponent({ mountType: 'mount' }); + + expect(getAlert().text()).toBe( + 'You have imported from this project 2 times before. Each new import will create duplicate issues.', + ); + }); + }); + + describe('when selected project has not been imported before', () => { + beforeEach(() => { + wrapper = mountComponent({ selectedProject: 'MJP' }); + }); + + it('shows jira-import::MJP-1 label since project MJP has not been imported before', () => { + expect(getFormComponent().props('importLabel')).toBe('jira-import::MJP-1'); + }); + + it('does not show warning alert since project MJP has not been imported before', () => { + expect(getAlert().exists()).toBe(false); + }); + }); + }); + describe('initiating a Jira import', () => { it('calls the mutation with the expected arguments', () => { const mutate = jest.fn(() => Promise.resolve()); @@ -200,6 +281,7 @@ describe('JiraImportApp', () => { wrapper = mountComponent({ errorMessage: 'There was an error importing the Jira project.', showAlert: true, + selectedProject: null, }); expect(getAlert().exists()).toBe(true); diff --git a/spec/frontend/jira_import/components/jira_import_form_spec.js b/spec/frontend/jira_import/components/jira_import_form_spec.js index 0987eb11693..dea94e7bf1f 100644 --- a/spec/frontend/jira_import/components/jira_import_form_spec.js +++ b/spec/frontend/jira_import/components/jira_import_form_spec.js @@ -2,11 +2,15 @@ import { GlAvatar, GlButton, GlFormSelect, GlLabel } from '@gitlab/ui'; import { mount, shallowMount } from '@vue/test-utils'; import JiraImportForm from '~/jira_import/components/jira_import_form.vue'; +const importLabel = 'jira-import::MTG-1'; +const value = 'MTG'; + const mountComponent = ({ mountType } = {}) => { const mountFunction = mountType === 'mount' ? mount : shallowMount; return mountFunction(JiraImportForm, { propsData: { + importLabel, issuesPath: 'gitlab-org/gitlab-test/-/issues', jiraProjects: [ { @@ -22,6 +26,7 @@ const mountComponent = ({ mountType } = {}) => { value: 'MTG', }, ], + value, }, }); }; @@ -29,6 +34,8 @@ const mountComponent = ({ mountType } = {}) => { describe('JiraImportForm', () => { let wrapper; + const getSelectDropdown = () => wrapper.find(GlFormSelect); + const getCancelButton = () => wrapper.findAll(GlButton).at(1); afterEach(() => { @@ -40,7 +47,7 @@ describe('JiraImportForm', () => { it('is shown', () => { wrapper = mountComponent(); - expect(wrapper.find(GlFormSelect).exists()).toBe(true); + expect(wrapper.contains(GlFormSelect)).toBe(true); }); it('contains a list of Jira projects to select from', () => { @@ -48,8 +55,7 @@ describe('JiraImportForm', () => { const optionItems = ['My Jira Project', 'My Second Jira Project', 'Migrate to GitLab']; - wrapper - .find(GlFormSelect) + getSelectDropdown() .findAll('option') .wrappers.forEach((optionEl, index) => { expect(optionEl.text()).toBe(optionItems[index]); @@ -63,7 +69,7 @@ describe('JiraImportForm', () => { }); it('shows a label which will be applied to imported Jira projects', () => { - expect(wrapper.find(GlLabel).attributes('title')).toBe('jira-import::KEY-1'); + expect(wrapper.find(GlLabel).props('title')).toBe(importLabel); }); it('shows information to the user', () => { @@ -77,7 +83,7 @@ describe('JiraImportForm', () => { }); it('shows an avatar for the Reporter', () => { - expect(wrapper.find(GlAvatar).exists()).toBe(true); + expect(wrapper.contains(GlAvatar)).toBe(true); }); it('shows jira.issue.description.content for the Description', () => { @@ -111,16 +117,19 @@ describe('JiraImportForm', () => { }); }); - it('emits an "initiateJiraImport" event with the selected dropdown value when submitted', () => { - const selectedOption = 'MTG'; + it('emits an "input" event when the input select value changes', () => { + wrapper = mountComponent({ mountType: 'mount' }); + + getSelectDropdown().vm.$emit('change', value); + expect(wrapper.emitted('input')[0]).toEqual([value]); + }); + + it('emits an "initiateJiraImport" event with the selected dropdown value when submitted', () => { wrapper = mountComponent(); - wrapper.setData({ - selectedOption, - }); wrapper.find('form').trigger('submit'); - expect(wrapper.emitted('initiateJiraImport')[0]).toEqual([selectedOption]); + expect(wrapper.emitted('initiateJiraImport')[0]).toEqual([value]); }); }); diff --git a/spec/frontend/jira_import/components/jira_import_progress_spec.js b/spec/frontend/jira_import/components/jira_import_progress_spec.js index 9a6fc3b5925..3ccf14554e1 100644 --- a/spec/frontend/jira_import/components/jira_import_progress_spec.js +++ b/spec/frontend/jira_import/components/jira_import_progress_spec.js @@ -2,10 +2,14 @@ import { GlEmptyState } from '@gitlab/ui'; import { mount, shallowMount } from '@vue/test-utils'; import JiraImportProgress from '~/jira_import/components/jira_import_progress.vue'; +const illustration = 'illustration.svg'; +const importProject = 'JIRAPROJECT'; +const issuesPath = 'gitlab-org/gitlab-test/-/issues'; + describe('JiraImportProgress', () => { let wrapper; - const getGlEmptyStateAttribute = attribute => wrapper.find(GlEmptyState).attributes(attribute); + const getGlEmptyStateProp = attribute => wrapper.find(GlEmptyState).props(attribute); const getParagraphText = () => wrapper.find('p').text(); @@ -13,11 +17,11 @@ describe('JiraImportProgress', () => { const mountFunction = mountType === 'shallowMount' ? shallowMount : mount; return mountFunction(JiraImportProgress, { propsData: { - illustration: 'illustration.svg', + illustration, importInitiator: 'Jane Doe', - importProject: 'JIRAPROJECT', + importProject, importTime: '2020-04-08T12:17:25+00:00', - issuesPath: 'gitlab-org/gitlab-test/-/issues', + issuesPath, }, }); }; @@ -33,20 +37,21 @@ describe('JiraImportProgress', () => { }); it('contains illustration', () => { - expect(getGlEmptyStateAttribute('svgpath')).toBe('illustration.svg'); + expect(getGlEmptyStateProp('svgPath')).toBe(illustration); }); it('contains a title', () => { const title = 'Import in progress'; - expect(getGlEmptyStateAttribute('title')).toBe(title); + expect(getGlEmptyStateProp('title')).toBe(title); }); it('contains button text', () => { - expect(getGlEmptyStateAttribute('primarybuttontext')).toBe('View issues'); + expect(getGlEmptyStateProp('primaryButtonText')).toBe('View issues'); }); it('contains button url', () => { - expect(getGlEmptyStateAttribute('primarybuttonlink')).toBe('gitlab-org/gitlab-test/-/issues'); + const expected = `${issuesPath}?search=${importProject}`; + expect(getGlEmptyStateProp('primaryButtonLink')).toBe(expected); }); }); diff --git a/spec/frontend/jira_import/components/jira_import_setup_spec.js b/spec/frontend/jira_import/components/jira_import_setup_spec.js index 834c14b512e..aa94dc4f503 100644 --- a/spec/frontend/jira_import/components/jira_import_setup_spec.js +++ b/spec/frontend/jira_import/components/jira_import_setup_spec.js @@ -2,15 +2,19 @@ import { GlEmptyState } from '@gitlab/ui'; import { shallowMount } from '@vue/test-utils'; import JiraImportSetup from '~/jira_import/components/jira_import_setup.vue'; +const illustration = 'illustration.svg'; +const jiraIntegrationPath = 'gitlab-org/gitlab-test/-/services/jira/edit'; + describe('JiraImportSetup', () => { let wrapper; - const getGlEmptyStateAttribute = attribute => wrapper.find(GlEmptyState).attributes(attribute); + const getGlEmptyStateProp = attribute => wrapper.find(GlEmptyState).props(attribute); beforeEach(() => { wrapper = shallowMount(JiraImportSetup, { propsData: { - illustration: 'illustration.svg', + illustration, + jiraIntegrationPath, }, }); }); @@ -21,15 +25,19 @@ describe('JiraImportSetup', () => { }); it('contains illustration', () => { - expect(getGlEmptyStateAttribute('svgpath')).toBe('illustration.svg'); + expect(getGlEmptyStateProp('svgPath')).toBe(illustration); }); it('contains a description', () => { const description = 'You will first need to set up Jira Integration to use this feature.'; - expect(getGlEmptyStateAttribute('description')).toBe(description); + expect(getGlEmptyStateProp('description')).toBe(description); }); it('contains button text', () => { - expect(getGlEmptyStateAttribute('primarybuttontext')).toBe('Set up Jira Integration'); + expect(getGlEmptyStateProp('primaryButtonText')).toBe('Set up Jira Integration'); + }); + + it('contains button link', () => { + expect(getGlEmptyStateProp('primaryButtonLink')).toBe(jiraIntegrationPath); }); }); diff --git a/spec/frontend/jira_import/utils_spec.js b/spec/frontend/jira_import/utils_spec.js index a14db104229..0b1edd6550a 100644 --- a/spec/frontend/jira_import/utils_spec.js +++ b/spec/frontend/jira_import/utils_spec.js @@ -1,27 +1,62 @@ -import { IMPORT_STATE, isInProgress } from '~/jira_import/utils'; +import { + calculateJiraImportLabel, + IMPORT_STATE, + isFinished, + isInProgress, +} from '~/jira_import/utils'; describe('isInProgress', () => { - it('returns true when state is IMPORT_STATE.SCHEDULED', () => { - expect(isInProgress(IMPORT_STATE.SCHEDULED)).toBe(true); + it.each` + state | result + ${IMPORT_STATE.SCHEDULED} | ${true} + ${IMPORT_STATE.STARTED} | ${true} + ${IMPORT_STATE.FAILED} | ${false} + ${IMPORT_STATE.FINISHED} | ${false} + ${IMPORT_STATE.NONE} | ${false} + ${undefined} | ${false} + `('returns $result when state is $state', ({ state, result }) => { + expect(isInProgress(state)).toBe(result); }); +}); - it('returns true when state is IMPORT_STATE.STARTED', () => { - expect(isInProgress(IMPORT_STATE.STARTED)).toBe(true); +describe('isFinished', () => { + it.each` + state | result + ${IMPORT_STATE.SCHEDULED} | ${false} + ${IMPORT_STATE.STARTED} | ${false} + ${IMPORT_STATE.FAILED} | ${false} + ${IMPORT_STATE.FINISHED} | ${true} + ${IMPORT_STATE.NONE} | ${false} + ${undefined} | ${false} + `('returns $result when state is $state', ({ state, result }) => { + expect(isFinished(state)).toBe(result); }); +}); - it('returns false when state is IMPORT_STATE.FAILED', () => { - expect(isInProgress(IMPORT_STATE.FAILED)).toBe(false); - }); +describe('calculateJiraImportLabel', () => { + const jiraImports = [ + { jiraProjectKey: 'MTG' }, + { jiraProjectKey: 'MJP' }, + { jiraProjectKey: 'MTG' }, + { jiraProjectKey: 'MSJP' }, + { jiraProjectKey: 'MTG' }, + ]; - it('returns false when state is IMPORT_STATE.FINISHED', () => { - expect(isInProgress(IMPORT_STATE.FINISHED)).toBe(false); - }); + const labels = [ + { color: '#111', title: 'jira-import::MTG-1' }, + { color: '#222', title: 'jira-import::MTG-2' }, + { color: '#333', title: 'jira-import::MTG-3' }, + ]; + + it('returns a label with the Jira project key and correct import count in the title', () => { + const label = calculateJiraImportLabel(jiraImports, labels); - it('returns false when state is IMPORT_STATE.NONE', () => { - expect(isInProgress(IMPORT_STATE.NONE)).toBe(false); + expect(label.title).toBe('jira-import::MTG-3'); }); - it('returns false when state is undefined', () => { - expect(isInProgress()).toBe(false); + it('returns a label with the correct color', () => { + const label = calculateJiraImportLabel(jiraImports, labels); + + expect(label.color).toBe('#333'); }); }); |