diff options
Diffstat (limited to 'spec/frontend/jira_import/components/jira_import_app_spec.js')
-rw-r--r-- | spec/frontend/jira_import/components/jira_import_app_spec.js | 200 |
1 files changed, 63 insertions, 137 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 64b4461d7b2..27314a0eb6e 100644 --- a/spec/frontend/jira_import/components/jira_import_app_spec.js +++ b/spec/frontend/jira_import/components/jira_import_app_spec.js @@ -1,21 +1,26 @@ import { GlAlert, GlLoadingIcon } from '@gitlab/ui'; -import { mount, shallowMount } from '@vue/test-utils'; -import AxiosMockAdapter from 'axios-mock-adapter'; +import { shallowMount } from '@vue/test-utils'; import Vue from 'vue'; -import axios from '~/lib/utils/axios_utils'; import JiraImportApp from '~/jira_import/components/jira_import_app.vue'; import JiraImportForm from '~/jira_import/components/jira_import_form.vue'; import JiraImportProgress from '~/jira_import/components/jira_import_progress.vue'; import JiraImportSetup from '~/jira_import/components/jira_import_setup.vue'; -import initiateJiraImportMutation from '~/jira_import/queries/initiate_jira_import.mutation.graphql'; -import getJiraUserMappingMutation from '~/jira_import/queries/get_jira_user_mapping.mutation.graphql'; -import { imports, issuesPath, jiraIntegrationPath, jiraProjects, userMappings } from '../mock_data'; +import { + imports, + issuesPath, + jiraIntegrationPath, + jiraProjects, + projectId, + projectPath, +} from '../mock_data'; describe('JiraImportApp', () => { - let axiosMock; - let mutateSpy; let wrapper; + const inProgressIllustration = 'in-progress-illustration.svg'; + + const setupIllustration = 'setup-illustration.svg'; + const getFormComponent = () => wrapper.find(JiraImportForm); const getProgressComponent = () => wrapper.find(JiraImportProgress); @@ -29,28 +34,22 @@ describe('JiraImportApp', () => { const mountComponent = ({ isJiraConfigured = true, errorMessage = '', - selectedProject = 'MTG', showAlert = false, isInProgress = false, loading = false, - mutate = mutateSpy, - mountFunction = shallowMount, } = {}) => - mountFunction(JiraImportApp, { + shallowMount(JiraImportApp, { propsData: { - inProgressIllustration: 'in-progress-illustration.svg', + inProgressIllustration, isJiraConfigured, issuesPath, jiraIntegrationPath, - projectId: '5', - projectPath: 'gitlab-org/gitlab-test', - setupIllustration: 'setup-illustration.svg', + projectId, + projectPath, + setupIllustration, }, data() { return { - isSubmitting: false, - selectedProject, - userMappings, errorMessage, showAlert, jiraImportDetails: { @@ -64,26 +63,11 @@ describe('JiraImportApp', () => { mocks: { $apollo: { loading, - mutate, }, }, }); - beforeEach(() => { - axiosMock = new AxiosMockAdapter(axios); - mutateSpy = jest.fn(() => - Promise.resolve({ - data: { - jiraImportStart: { errors: [] }, - jiraImportUsers: { jiraUsers: [], errors: [] }, - }, - }), - ); - }); - afterEach(() => { - axiosMock.restore(); - mutateSpy.mockRestore(); wrapper.destroy(); wrapper = null; }); @@ -176,111 +160,84 @@ describe('JiraImportApp', () => { }); }); - describe('import in progress screen', () => { + describe('import setup component', () => { + beforeEach(() => { + wrapper = mountComponent({ isJiraConfigured: false }); + }); + + it('receives the illustration', () => { + expect(getSetupComponent().props('illustration')).toBe(setupIllustration); + }); + + it('receives the path to the Jira integration page', () => { + expect(getSetupComponent().props('jiraIntegrationPath')).toBe(jiraIntegrationPath); + }); + }); + + describe('import in progress component', () => { beforeEach(() => { wrapper = mountComponent({ isInProgress: true }); }); - it('shows the illustration', () => { - expect(getProgressComponent().props('illustration')).toBe('in-progress-illustration.svg'); + it('receives the illustration', () => { + expect(getProgressComponent().props('illustration')).toBe(inProgressIllustration); }); - it('shows the name of the most recent import initiator', () => { + it('receives 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', () => { + it('receives the name of the most recent imported project', () => { expect(getProgressComponent().props('importProject')).toBe('MTG'); }); - it('shows the time of the most recent import', () => { + it('receives 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', () => { + it('receives 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({ mountFunction: mount }); - - expect(getAlert().text()).toBe( - 'You have imported from this project 2 times before. Each new import will create duplicate issues.', - ); - }); + describe('import form component', () => { + beforeEach(() => { + wrapper = mountComponent(); }); - 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); - }); + it('receives the illustration', () => { + expect(getFormComponent().props('issuesPath')).toBe(issuesPath); }); - }); - describe('initiating a Jira import', () => { - it('calls the mutation with the expected arguments', () => { - wrapper = mountComponent(); + it('receives the name of the most recent import initiator', () => { + expect(getFormComponent().props('jiraImports')).toEqual(imports); + }); - const mutationArguments = { - mutation: initiateJiraImportMutation, - variables: { - input: { - jiraProjectKey: 'MTG', - projectPath: 'gitlab-org/gitlab-test', - usersMapping: [ - { - jiraAccountId: 'aei23f98f-q23fj98qfj', - gitlabId: 15, - }, - { - jiraAccountId: 'fu39y8t34w-rq3u289t3h4i', - gitlabId: undefined, - }, - ], - }, - }, - }; + it('receives the name of the most recent imported project', () => { + expect(getFormComponent().props('jiraProjects')).toEqual(jiraProjects); + }); - getFormComponent().vm.$emit('initiateJiraImport', 'MTG'); + it('receives the project ID', () => { + expect(getFormComponent().props('projectId')).toBe(projectId); + }); - expect(mutateSpy).toHaveBeenCalledWith(expect.objectContaining(mutationArguments)); + it('receives the project path', () => { + expect(getFormComponent().props('projectPath')).toBe(projectPath); }); - it('shows alert message with error message on error', () => { - const mutate = jest.fn(() => Promise.reject()); + it('shows an alert when it emits an error', async () => { + expect(getAlert().exists()).toBe(false); - wrapper = mountComponent({ mutate }); + getFormComponent().vm.$emit('error', 'There was an error'); - getFormComponent().vm.$emit('initiateJiraImport', 'MTG'); + await Vue.nextTick(); - // One tick doesn't update the dom to the desired state so we have two ticks here - return Vue.nextTick() - .then(Vue.nextTick) - .then(() => { - expect(getAlert().text()).toBe('There was an error importing the Jira project.'); - }); + expect(getAlert().exists()).toBe(true); }); }); describe('alert', () => { - it('can be dismissed', () => { + it('can be dismissed', async () => { wrapper = mountComponent({ errorMessage: 'There was an error importing the Jira project.', showAlert: true, @@ -291,40 +248,9 @@ describe('JiraImportApp', () => { getAlert().vm.$emit('dismiss'); - return Vue.nextTick().then(() => { - expect(getAlert().exists()).toBe(false); - }); - }); - }); - - describe('on mount', () => { - it('makes a GraphQL mutation call to get user mappings', () => { - wrapper = mountComponent(); + await Vue.nextTick(); - const mutationArguments = { - mutation: getJiraUserMappingMutation, - variables: { - input: { - projectPath: 'gitlab-org/gitlab-test', - }, - }, - }; - - expect(mutateSpy).toHaveBeenCalledWith(expect.objectContaining(mutationArguments)); - }); - - it('does not make a GraphQL mutation call to get user mappings when Jira is not configured', () => { - wrapper = mountComponent({ isJiraConfigured: false }); - - expect(mutateSpy).not.toHaveBeenCalled(); - }); - - it('shows error message when there is an error with the GraphQL mutation call', () => { - const mutate = jest.fn(() => Promise.reject()); - - wrapper = mountComponent({ mutate }); - - expect(getAlert().exists()).toBe(true); + expect(getAlert().exists()).toBe(false); }); }); }); |