diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-26 15:08:22 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-26 15:08:22 +0300 |
commit | 1691cbe307f7698b3ee39811278990c43b6751a5 (patch) | |
tree | 2bd7d5b7143242f540a9edde92c83c791ebf8af4 /spec | |
parent | 27c6c4bf061c3a2289ce4808b1b354535994d09d (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
27 files changed, 528 insertions, 678 deletions
diff --git a/spec/controllers/projects/import/jira_controller_spec.rb b/spec/controllers/projects/import/jira_controller_spec.rb index d1b0a086576..857a62ed3b9 100644 --- a/spec/controllers/projects/import/jira_controller_spec.rb +++ b/spec/controllers/projects/import/jira_controller_spec.rb @@ -10,10 +10,6 @@ describe Projects::Import::JiraController do let_it_be(:jira_project_key) { 'Test' } context 'with anonymous user' do - before do - stub_feature_flags(jira_issue_import: true) - end - context 'get show' do it 'redirects to issues page' do get :show, params: { namespace_id: project.namespace, project_id: project } @@ -35,195 +31,167 @@ describe Projects::Import::JiraController do before do sign_in(user) project.add_maintainer(user) + stub_feature_flags(jira_issue_import_vue: false) + stub_jira_service_test end - context 'when feature flag not enabled' do - before do - stub_feature_flags(jira_issue_import: false) - end + context 'when Jira service is enabled for the project' do + let_it_be(:jira_service) { create(:jira_service, project: project) } - context 'get show' do - it 'redirects to issues page' do - get :show, params: { namespace_id: project.namespace, project_id: project } + context 'when user is developer' do + let_it_be(:dev) { create(:user) } - expect(response).to redirect_to(project_issues_path(project)) + before do + sign_in(dev) + project.add_developer(dev) end - end - - context 'post import' do - it 'redirects to issues page' do - post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: jira_project_key } - - expect(response).to redirect_to(project_issues_path(project)) - end - end - end - - context 'when feature flag enabled' do - before do - stub_feature_flags(jira_issue_import: true) - stub_feature_flags(jira_issue_import_vue: false) - stub_jira_service_test - end - - context 'when Jira service is enabled for the project' do - let_it_be(:jira_service) { create(:jira_service, project: project) } - - context 'when user is developer' do - let_it_be(:dev) { create(:user) } + context 'get show' do before do - sign_in(dev) - project.add_developer(dev) + get :show, params: { namespace_id: project.namespace.to_param, project_id: project } end - context 'get show' do - before do - get :show, params: { namespace_id: project.namespace.to_param, project_id: project } - end - - it 'does not query Jira service' do - expect(project).not_to receive(:jira_service) - end + it 'does not query Jira service' do + expect(project).not_to receive(:jira_service) + end - it 'renders show template' do - expect(response).to render_template(:show) - expect(assigns(:jira_projects)).not_to be_present - end + it 'renders show template' do + expect(response).to render_template(:show) + expect(assigns(:jira_projects)).not_to be_present end + end - context 'post import' do - it 'returns 404' do - post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: jira_project_key } + context 'post import' do + it 'returns 404' do + post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: jira_project_key } - expect(response).to have_gitlab_http_status(:not_found) - end + expect(response).to have_gitlab_http_status(:not_found) end end + end - context 'when issues disabled' do - let_it_be(:disabled_issues_project) { create(:project, :public, :issues_disabled) } + context 'when issues disabled' do + let_it_be(:disabled_issues_project) { create(:project, :public, :issues_disabled) } - context 'get show' do - it 'returs 404' do - get :show, params: { namespace_id: project.namespace.to_param, project_id: disabled_issues_project } + context 'get show' do + it 'returs 404' do + get :show, params: { namespace_id: project.namespace.to_param, project_id: disabled_issues_project } - expect(response).to have_gitlab_http_status(:not_found) - end + expect(response).to have_gitlab_http_status(:not_found) end + end - context 'post import' do - it 'returs 404' do - post :import, params: { namespace_id: disabled_issues_project.namespace, project_id: disabled_issues_project, jira_project_key: jira_project_key } + context 'post import' do + it 'returs 404' do + post :import, params: { namespace_id: disabled_issues_project.namespace, project_id: disabled_issues_project, jira_project_key: jira_project_key } - expect(response).to have_gitlab_http_status(:not_found) - end + expect(response).to have_gitlab_http_status(:not_found) end end + end - context 'when running Jira import first time' do - context 'get show' do - before do - allow(JIRA::Resource::Project).to receive(:all).and_return(jira_projects) + context 'when running Jira import first time' do + context 'get show' do + before do + allow(JIRA::Resource::Project).to receive(:all).and_return(jira_projects) - expect(project.jira_imports).to be_empty + expect(project.jira_imports).to be_empty - get :show, params: { namespace_id: project.namespace.to_param, project_id: project } - end + get :show, params: { namespace_id: project.namespace.to_param, project_id: project } + end - context 'when no projects have been retrieved from Jira' do - let(:jira_projects) { [] } + context 'when no projects have been retrieved from Jira' do + let(:jira_projects) { [] } - it 'render an error message' do - expect(flash[:alert]).to eq('No projects have been returned from Jira. Please check your Jira configuration.') - expect(response).to render_template(:show) - end + it 'render an error message' do + expect(flash[:alert]).to eq('No projects have been returned from Jira. Please check your Jira configuration.') + expect(response).to render_template(:show) end + end - context 'when projects retrieved from Jira' do - let(:jira_projects) { [double(name: 'FOO project', key: 'FOO')] } + context 'when projects retrieved from Jira' do + let(:jira_projects) { [double(name: 'FOO project', key: 'FOO')] } - it 'renders show template' do - expect(response).to render_template(:show) - end + it 'renders show template' do + expect(response).to render_template(:show) end end + end - context 'post import' do - context 'when Jira project key is empty' do - it 'redirects back to show with an error' do - post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: '' } + context 'post import' do + context 'when Jira project key is empty' do + it 'redirects back to show with an error' do + post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: '' } - expect(response).to redirect_to(project_import_jira_path(project)) - expect(flash[:alert]).to eq('No Jira project key has been provided.') - end + expect(response).to redirect_to(project_import_jira_path(project)) + expect(flash[:alert]).to eq('No Jira project key has been provided.') end + end - context 'when everything is ok' do - it 'creates import state' do - expect(project.latest_jira_import).to be_nil + context 'when everything is ok' do + it 'creates import state' do + expect(project.latest_jira_import).to be_nil - post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: jira_project_key } + post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: jira_project_key } - project.reload + project.reload - jira_import = project.latest_jira_import - expect(project.import_type).to eq 'jira' - expect(jira_import.status).to eq 'scheduled' - expect(jira_import.jira_project_key).to eq jira_project_key - expect(response).to redirect_to(project_import_jira_path(project)) - end + jira_import = project.latest_jira_import + expect(project.import_type).to eq 'jira' + expect(jira_import.status).to eq 'scheduled' + expect(jira_import.jira_project_key).to eq jira_project_key + expect(response).to redirect_to(project_import_jira_path(project)) end end end + end - context 'when import state is scheduled' do - let_it_be(:jira_import_state) { create(:jira_import_state, :scheduled, project: project) } + context 'when import state is scheduled' do + let_it_be(:jira_import_state) { create(:jira_import_state, :scheduled, project: project) } - context 'get show' do - it 'renders import status' do - get :show, params: { namespace_id: project.namespace.to_param, project_id: project } + context 'get show' do + it 'renders import status' do + get :show, params: { namespace_id: project.namespace.to_param, project_id: project } - jira_import = project.latest_jira_import - expect(jira_import.status).to eq 'scheduled' - expect(flash.now[:notice]).to eq 'Import scheduled' - end + jira_import = project.latest_jira_import + expect(jira_import.status).to eq 'scheduled' + expect(flash.now[:notice]).to eq 'Import scheduled' end + end - context 'post import' do - it 'uses the existing import data' do - post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: 'New Project' } + context 'post import' do + it 'uses the existing import data' do + post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: 'New Project' } - expect(flash[:notice]).to eq('Jira import is already running.') - expect(response).to redirect_to(project_import_jira_path(project)) - end + expect(flash[:notice]).to eq('Jira import is already running.') + expect(response).to redirect_to(project_import_jira_path(project)) end end + end - context 'when Jira import ran before' do - let_it_be(:jira_import_state) { create(:jira_import_state, :finished, project: project, jira_project_key: jira_project_key) } + context 'when Jira import ran before' do + let_it_be(:jira_import_state) { create(:jira_import_state, :finished, project: project, jira_project_key: jira_project_key) } - context 'get show' do - it 'renders import status' do - allow(JIRA::Resource::Project).to receive(:all).and_return([]) - get :show, params: { namespace_id: project.namespace.to_param, project_id: project } + context 'get show' do + it 'renders import status' do + allow(JIRA::Resource::Project).to receive(:all).and_return([]) + get :show, params: { namespace_id: project.namespace.to_param, project_id: project } - expect(project.latest_jira_import.status).to eq 'finished' - expect(flash.now[:notice]).to eq 'Import finished' - end + expect(project.latest_jira_import.status).to eq 'finished' + expect(flash.now[:notice]).to eq 'Import finished' end + end - context 'post import' do - it 'uses the existing import data' do - post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: 'New Project' } + context 'post import' do + it 'uses the existing import data' do + post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: 'New Project' } - project.reload - expect(project.latest_jira_import.status).to eq 'scheduled' - expect(project.jira_imports.size).to eq 2 - expect(project.jira_imports.first.jira_project_key).to eq jira_project_key - expect(project.jira_imports.last.jira_project_key).to eq 'New Project' - expect(response).to redirect_to(project_import_jira_path(project)) - end + project.reload + expect(project.latest_jira_import.status).to eq 'scheduled' + expect(project.jira_imports.size).to eq 2 + expect(project.jira_imports.first.jira_project_key).to eq jira_project_key + expect(project.jira_imports.last.jira_project_key).to eq 'New Project' + expect(response).to redirect_to(project_import_jira_path(project)) end end end diff --git a/spec/features/markdown/mermaid_spec.rb b/spec/features/markdown/mermaid_spec.rb index 4bf7edf98ca..60ef6647bea 100644 --- a/spec/features/markdown/mermaid_spec.rb +++ b/spec/features/markdown/mermaid_spec.rb @@ -118,10 +118,7 @@ describe 'Mermaid rendering', :js do visit project_issue_path(project, issue) - svg = page.find('svg.mermaid') - expect(svg[:style]).to match(/max-width/) - expect(svg[:width].to_i).to eq(100) - expect(svg[:height].to_i).to eq(0) + expect(page).to have_css('svg.mermaid[style*="max-width"][width="100%"]') end it 'display button when diagram exceeds length', :js do diff --git a/spec/frontend/blob/components/blob_header_default_actions_spec.js b/spec/frontend/blob/components/blob_header_default_actions_spec.js index 684840afe1c..0247a12d8d3 100644 --- a/spec/frontend/blob/components/blob_header_default_actions_spec.js +++ b/spec/frontend/blob/components/blob_header_default_actions_spec.js @@ -66,5 +66,13 @@ describe('Blob Header Default Actions', () => { expect(buttons.at(0).attributes('disabled')).toBeTruthy(); }); + + it('does not render the copy button if a rendering error is set', () => { + createComponent({ + hasRenderError: true, + }); + + expect(wrapper.find('[data-testid="copyContentsButton"]').exists()).toBe(false); + }); }); }); diff --git a/spec/frontend/blob/components/blob_header_spec.js b/spec/frontend/blob/components/blob_header_spec.js index 0e7d2f6516a..01d4bf834d2 100644 --- a/spec/frontend/blob/components/blob_header_spec.js +++ b/spec/frontend/blob/components/blob_header_spec.js @@ -87,6 +87,17 @@ describe('Blob Header Default Actions', () => { expect(wrapper.text()).toContain(slotContent); }); }); + + it('passes information about render error down to default actions', () => { + createComponent( + {}, + {}, + { + hasRenderError: true, + }, + ); + expect(wrapper.find(DefaultActions).props('hasRenderError')).toBe(true); + }); }); describe('functionality', () => { diff --git a/spec/javascripts/releases/components/app_index_spec.js b/spec/frontend/releases/components/app_index_spec.js index 020937d07e5..91beb5b1418 100644 --- a/spec/javascripts/releases/components/app_index_spec.js +++ b/spec/frontend/releases/components/app_index_spec.js @@ -1,6 +1,6 @@ import { range as rge } from 'lodash'; import Vue from 'vue'; -import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; +import { mountComponentWithStore } from 'helpers/vue_mount_component_helper'; import app from '~/releases/components/app_index.vue'; import createStore from '~/releases/stores'; import listModule from '~/releases/stores/modules/list'; @@ -9,11 +9,11 @@ import { resetStore } from '../stores/modules/list/helpers'; import { pageInfoHeadersWithoutPagination, pageInfoHeadersWithPagination, - release, + release2 as release, releases, } from '../mock_data'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; -import waitForPromises from 'spec/helpers/wait_for_promises'; +import waitForPromises from 'helpers/wait_for_promises'; describe('Releases App ', () => { const Component = Vue.extend(app); @@ -42,83 +42,67 @@ describe('Releases App ', () => { describe('while loading', () => { beforeEach(() => { - spyOn(api, 'releases').and.returnValue(Promise.resolve({ data: [], headers: {} })); + jest + .spyOn(api, 'releases') + // Need to defer the return value here to the next stack, + // otherwise the loading state disappears before our test even starts. + .mockImplementation(() => waitForPromises().then(() => ({ data: [], headers: {} }))); vm = mountComponentWithStore(Component, { props, store }); }); - it('renders loading icon', done => { + it('renders loading icon', () => { expect(vm.$el.querySelector('.js-loading')).not.toBeNull(); expect(vm.$el.querySelector('.js-empty-state')).toBeNull(); expect(vm.$el.querySelector('.js-success-state')).toBeNull(); expect(vm.$el.querySelector('.gl-pagination')).toBeNull(); - waitForPromises() - .then(done) - .catch(done.fail); + return waitForPromises(); }); }); describe('with successful request', () => { beforeEach(() => { - spyOn(api, 'releases').and.returnValue( - Promise.resolve({ data: releases, headers: pageInfoHeadersWithoutPagination }), - ); + jest + .spyOn(api, 'releases') + .mockResolvedValue({ data: releases, headers: pageInfoHeadersWithoutPagination }); vm = mountComponentWithStore(Component, { props, store }); }); - it('renders success state', done => { - waitForPromises() - .then(() => { - expect(vm.$el.querySelector('.js-loading')).toBeNull(); - expect(vm.$el.querySelector('.js-empty-state')).toBeNull(); - expect(vm.$el.querySelector('.js-success-state')).not.toBeNull(); - expect(vm.$el.querySelector('.gl-pagination')).toBeNull(); - - done(); - }) - .catch(done.fail); + it('renders success state', () => { + expect(vm.$el.querySelector('.js-loading')).toBeNull(); + expect(vm.$el.querySelector('.js-empty-state')).toBeNull(); + expect(vm.$el.querySelector('.js-success-state')).not.toBeNull(); + expect(vm.$el.querySelector('.gl-pagination')).toBeNull(); }); }); describe('with successful request and pagination', () => { beforeEach(() => { - spyOn(api, 'releases').and.returnValue( - Promise.resolve({ data: releasesPagination, headers: pageInfoHeadersWithPagination }), - ); + jest + .spyOn(api, 'releases') + .mockResolvedValue({ data: releasesPagination, headers: pageInfoHeadersWithPagination }); vm = mountComponentWithStore(Component, { props, store }); }); - it('renders success state', done => { - waitForPromises() - .then(() => { - expect(vm.$el.querySelector('.js-loading')).toBeNull(); - expect(vm.$el.querySelector('.js-empty-state')).toBeNull(); - expect(vm.$el.querySelector('.js-success-state')).not.toBeNull(); - expect(vm.$el.querySelector('.gl-pagination')).not.toBeNull(); - - done(); - }) - .catch(done.fail); + it('renders success state', () => { + expect(vm.$el.querySelector('.js-loading')).toBeNull(); + expect(vm.$el.querySelector('.js-empty-state')).toBeNull(); + expect(vm.$el.querySelector('.js-success-state')).not.toBeNull(); + expect(vm.$el.querySelector('.gl-pagination')).not.toBeNull(); }); }); describe('with empty request', () => { beforeEach(() => { - spyOn(api, 'releases').and.returnValue(Promise.resolve({ data: [], headers: {} })); + jest.spyOn(api, 'releases').mockResolvedValue({ data: [], headers: {} }); vm = mountComponentWithStore(Component, { props, store }); }); - it('renders empty state', done => { - waitForPromises() - .then(() => { - expect(vm.$el.querySelector('.js-loading')).toBeNull(); - expect(vm.$el.querySelector('.js-empty-state')).not.toBeNull(); - expect(vm.$el.querySelector('.js-success-state')).toBeNull(); - expect(vm.$el.querySelector('.gl-pagination')).toBeNull(); - - done(); - }) - .catch(done.fail); + it('renders empty state', () => { + expect(vm.$el.querySelector('.js-loading')).toBeNull(); + expect(vm.$el.querySelector('.js-empty-state')).not.toBeNull(); + expect(vm.$el.querySelector('.js-success-state')).toBeNull(); + expect(vm.$el.querySelector('.gl-pagination')).toBeNull(); }); }); @@ -126,7 +110,7 @@ describe('Releases App ', () => { const findNewReleaseButton = () => vm.$el.querySelector('.js-new-release-btn'); beforeEach(() => { - spyOn(api, 'releases').and.returnValue(Promise.resolve({ data: [], headers: {} })); + jest.spyOn(api, 'releases').mockResolvedValue({ data: [], headers: {} }); }); const factory = additionalProps => { @@ -146,38 +130,20 @@ describe('Releases App ', () => { factory({ newReleasePath }); }); - it('renders the "New release" button', done => { - waitForPromises() - .then(() => { - expect(findNewReleaseButton()).not.toBeNull(); - - done(); - }) - .catch(done.fail); + it('renders the "New release" button', () => { + expect(findNewReleaseButton()).not.toBeNull(); }); - it('renders the "New release" button with the correct href', done => { - waitForPromises() - .then(() => { - expect(findNewReleaseButton().getAttribute('href')).toBe(newReleasePath); - - done(); - }) - .catch(done.fail); + it('renders the "New release" button with the correct href', () => { + expect(findNewReleaseButton().getAttribute('href')).toBe(newReleasePath); }); }); describe('when the user is not allowed to create a new Release', () => { beforeEach(() => factory()); - it('does not render the "New release" button', done => { - waitForPromises() - .then(() => { - expect(findNewReleaseButton()).toBeNull(); - - done(); - }) - .catch(done.fail); + it('does not render the "New release" button', () => { + expect(findNewReleaseButton()).toBeNull(); }); }); }); diff --git a/spec/frontend/releases/mock_data.js b/spec/frontend/releases/mock_data.js index bd5fc86275e..5924a78d911 100644 --- a/spec/frontend/releases/mock_data.js +++ b/spec/frontend/releases/mock_data.js @@ -131,3 +131,91 @@ export const release = { edit_url: 'http://0.0.0.0:3001/root/release-test/-/releases/v0.3/edit', }, }; + +export const pageInfoHeadersWithoutPagination = { + 'X-NEXT-PAGE': '', + 'X-PAGE': '1', + 'X-PER-PAGE': '20', + 'X-PREV-PAGE': '', + 'X-TOTAL': '19', + 'X-TOTAL-PAGES': '1', +}; + +export const pageInfoHeadersWithPagination = { + 'X-NEXT-PAGE': '2', + 'X-PAGE': '1', + 'X-PER-PAGE': '20', + 'X-PREV-PAGE': '', + 'X-TOTAL': '21', + 'X-TOTAL-PAGES': '2', +}; + +export const release2 = { + name: 'Bionic Beaver', + tag_name: '18.04', + description: '## changelog\n\n* line 1\n* line2', + description_html: '<div><h2>changelog</h2><ul><li>line1</li<li>line 2</li></ul></div>', + author_name: 'Release bot', + author_email: 'release-bot@example.com', + created_at: '2012-05-28T05:00:00-07:00', + commit: { + id: '2695effb5807a22ff3d138d593fd856244e155e7', + short_id: '2695effb', + title: 'Initial commit', + created_at: '2017-07-26T11:08:53.000+02:00', + parent_ids: ['2a4b78934375d7f53875269ffd4f45fd83a84ebe'], + message: 'Initial commit', + author: { + avatar_url: 'uploads/-/system/user/avatar/johndoe/avatar.png', + id: 482476, + name: 'John Doe', + path: '/johndoe', + state: 'active', + status_tooltip_html: null, + username: 'johndoe', + web_url: 'https://gitlab.com/johndoe', + }, + authored_date: '2012-05-28T04:42:42-07:00', + committer_name: 'Jack Smith', + committer_email: 'jack@example.com', + committed_date: '2012-05-28T04:42:42-07:00', + }, + assets: { + count: 6, + sources: [ + { + format: 'zip', + url: 'https://gitlab.com/gitlab-org/gitlab-foss/-/archive/v11.3.12/gitlab-ce-v11.3.12.zip', + }, + { + format: 'tar.gz', + url: + 'https://gitlab.com/gitlab-org/gitlab-foss/-/archive/v11.3.12/gitlab-ce-v11.3.12.tar.gz', + }, + { + format: 'tar.bz2', + url: + 'https://gitlab.com/gitlab-org/gitlab-foss/-/archive/v11.3.12/gitlab-ce-v11.3.12.tar.bz2', + }, + { + format: 'tar', + url: 'https://gitlab.com/gitlab-org/gitlab-foss/-/archive/v11.3.12/gitlab-ce-v11.3.12.tar', + }, + ], + links: [ + { + name: 'release-18.04.dmg', + url: 'https://my-external-hosting.example.com/scrambled-url/', + external: true, + }, + { + name: 'binary-linux-amd64', + url: + 'https://gitlab.com/gitlab-org/gitlab-foss/-/jobs/artifacts/v11.6.0-rc4/download?job=rspec-mysql+41%2F50', + external: false, + }, + ], + }, +}; + +export const releases = [release, release2]; diff --git a/spec/javascripts/releases/stores/modules/list/actions_spec.js b/spec/frontend/releases/stores/modules/list/actions_spec.js index bf85e18997b..4c3af157684 100644 --- a/spec/javascripts/releases/stores/modules/list/actions_spec.js +++ b/spec/frontend/releases/stores/modules/list/actions_spec.js @@ -1,4 +1,4 @@ -import testAction from 'spec/helpers/vuex_action_helper'; +import testAction from 'helpers/vuex_action_helper'; import { requestReleases, fetchReleases, @@ -31,7 +31,7 @@ describe('Releases State actions', () => { describe('fetchReleases', () => { describe('success', () => { it('dispatches requestReleases and receiveReleasesSuccess', done => { - spyOn(api, 'releases').and.callFake((id, options) => { + jest.spyOn(api, 'releases').mockImplementation((id, options) => { expect(id).toEqual(1); expect(options.page).toEqual('1'); return Promise.resolve({ data: releases, headers: pageInfoHeadersWithoutPagination }); @@ -56,7 +56,7 @@ describe('Releases State actions', () => { }); it('dispatches requestReleases and receiveReleasesSuccess on page two', done => { - spyOn(api, 'releases').and.callFake((_, options) => { + jest.spyOn(api, 'releases').mockImplementation((_, options) => { expect(options.page).toEqual('2'); return Promise.resolve({ data: releases, headers: pageInfoHeadersWithoutPagination }); }); @@ -82,7 +82,7 @@ describe('Releases State actions', () => { describe('error', () => { it('dispatches requestReleases and receiveReleasesError', done => { - spyOn(api, 'releases').and.returnValue(Promise.reject()); + jest.spyOn(api, 'releases').mockReturnValue(Promise.reject()); testAction( fetchReleases, diff --git a/spec/javascripts/releases/stores/modules/list/helpers.js b/spec/frontend/releases/stores/modules/list/helpers.js index 435ca36047e..435ca36047e 100644 --- a/spec/javascripts/releases/stores/modules/list/helpers.js +++ b/spec/frontend/releases/stores/modules/list/helpers.js diff --git a/spec/javascripts/releases/stores/modules/list/mutations_spec.js b/spec/frontend/releases/stores/modules/list/mutations_spec.js index 3035b916ff6..3035b916ff6 100644 --- a/spec/javascripts/releases/stores/modules/list/mutations_spec.js +++ b/spec/frontend/releases/stores/modules/list/mutations_spec.js diff --git a/spec/frontend/snippets/components/snippet_blob_view_spec.js b/spec/frontend/snippets/components/snippet_blob_view_spec.js index d06489cffa9..e4d8ee9b7df 100644 --- a/spec/frontend/snippets/components/snippet_blob_view_spec.js +++ b/spec/frontend/snippets/components/snippet_blob_view_spec.js @@ -3,7 +3,11 @@ import SnippetBlobView from '~/snippets/components/snippet_blob_view.vue'; import BlobHeader from '~/blob/components/blob_header.vue'; import BlobEmbeddable from '~/blob/components/blob_embeddable.vue'; import BlobContent from '~/blob/components/blob_content.vue'; -import { BLOB_RENDER_EVENT_LOAD, BLOB_RENDER_EVENT_SHOW_SOURCE } from '~/blob/components/constants'; +import { + BLOB_RENDER_EVENT_LOAD, + BLOB_RENDER_EVENT_SHOW_SOURCE, + BLOB_RENDER_ERRORS, +} from '~/blob/components/constants'; import { RichViewer, SimpleViewer } from '~/vue_shared/components/blob_viewers'; import { SNIPPET_VISIBILITY_PRIVATE, @@ -109,6 +113,20 @@ describe('Blob Embeddable', () => { }); }); + it('passes information about render error down to blob header', () => { + createComponent({ + blob: { + ...BlobMock, + simpleViewer: { + ...SimpleViewerMock, + renderError: BLOB_RENDER_ERRORS.REASONS.COLLAPSED.id, + }, + }, + }); + + expect(wrapper.find(BlobHeader).props('hasRenderError')).toBe(true); + }); + describe('URLS with hash', () => { beforeEach(() => { window.location.hash = '#LC2'; diff --git a/spec/frontend/vue_mr_widget/components/mr_widget_rebase_spec.js b/spec/frontend/vue_mr_widget/components/mr_widget_rebase_spec.js index c8c2bff033c..6ec30493f8b 100644 --- a/spec/frontend/vue_mr_widget/components/mr_widget_rebase_spec.js +++ b/spec/frontend/vue_mr_widget/components/mr_widget_rebase_spec.js @@ -45,10 +45,8 @@ describe('Merge request widget rebase component', () => { expect(text).toContain('Fast-forward merge is not possible.'); expect(text.replace(/\s\s+/g, ' ')).toContain( - 'Rebase the source branch onto the target branch or merge target', + 'Rebase the source branch onto the target branch.', ); - - expect(text).toContain('branch into source branch to allow this merge request to be merged.'); }); it('it should render error message when it fails', done => { diff --git a/spec/graphql/resolvers/projects/jira_imports_resolver_spec.rb b/spec/graphql/resolvers/projects/jira_imports_resolver_spec.rb index 7146bfb441b..9811075a613 100644 --- a/spec/graphql/resolvers/projects/jira_imports_resolver_spec.rb +++ b/spec/graphql/resolvers/projects/jira_imports_resolver_spec.rb @@ -40,16 +40,6 @@ describe Resolvers::Projects::JiraImportsResolver do let_it_be(:jira_import1) { create(:jira_import_state, :finished, project: project, jira_project_key: 'AA', created_at: 2.days.ago) } let_it_be(:jira_import2) { create(:jira_import_state, :finished, project: project, jira_project_key: 'BB', created_at: 5.days.ago) } - context 'when feature flag disabled' do - let(:current_user) { user } - - before do - stub_feature_flags(jira_issue_import: false) - end - - it_behaves_like 'no Jira import access' - end - context 'when user cannot read Jira imports' do context 'when anonymous user' do let(:current_user) { nil } diff --git a/spec/helpers/notes_helper_spec.rb b/spec/helpers/notes_helper_spec.rb index f074a918e7f..543a9081779 100644 --- a/spec/helpers/notes_helper_spec.rb +++ b/spec/helpers/notes_helper_spec.rb @@ -24,6 +24,36 @@ describe NotesHelper do project.add_guest(guest) end + describe '#note_target_title' do + context 'note does not exist' do + it 'returns nil' do + expect(helper.note_target_title(nil)).to be_blank + end + end + + context 'target does not exist' do + it 'returns nil' do + note = Note.new + expect(helper.note_target_title(note)).to be_blank + end + end + + context 'when given a design target' do + it 'returns nil' do + note = build_stubbed(:note_on_design) + expect(helper.note_target_title(note)).to be_blank + end + end + + context 'when given a non-design target' do + it 'returns the issue title' do + issue = build_stubbed(:issue, title: 'Issue 1') + note = build_stubbed(:note, noteable: issue) + expect(helper.note_target_title(note)).to eq('Issue 1') + end + end + end + describe "#notes_max_access_for_users" do it 'returns access levels' do expect(helper.note_max_access_for_user(owner_note)).to eq(Gitlab::Access::OWNER) diff --git a/spec/helpers/todos_helper_spec.rb b/spec/helpers/todos_helper_spec.rb index 19a0826be1d..411d1d6f1fe 100644 --- a/spec/helpers/todos_helper_spec.rb +++ b/spec/helpers/todos_helper_spec.rb @@ -89,7 +89,7 @@ describe TodosHelper do context 'when given a non-design todo' do let(:todo) do - create(:todo, :assigned, + build_stubbed(:todo, :assigned, user: user, project: issue.project, target: issue, diff --git a/spec/javascripts/releases/mock_data.js b/spec/javascripts/releases/mock_data.js deleted file mode 100644 index 72875dff172..00000000000 --- a/spec/javascripts/releases/mock_data.js +++ /dev/null @@ -1,148 +0,0 @@ -export const pageInfoHeadersWithoutPagination = { - 'X-NEXT-PAGE': '', - 'X-PAGE': '1', - 'X-PER-PAGE': '20', - 'X-PREV-PAGE': '', - 'X-TOTAL': '19', - 'X-TOTAL-PAGES': '1', -}; - -export const pageInfoHeadersWithPagination = { - 'X-NEXT-PAGE': '2', - 'X-PAGE': '1', - 'X-PER-PAGE': '20', - 'X-PREV-PAGE': '', - 'X-TOTAL': '21', - 'X-TOTAL-PAGES': '2', -}; - -export const release = { - name: 'Bionic Beaver', - tag_name: '18.04', - description: '## changelog\n\n* line 1\n* line2', - description_html: '<div><h2>changelog</h2><ul><li>line1</li<li>line 2</li></ul></div>', - author_name: 'Release bot', - author_email: 'release-bot@example.com', - created_at: '2012-05-28T05:00:00-07:00', - commit: { - id: '2695effb5807a22ff3d138d593fd856244e155e7', - short_id: '2695effb', - title: 'Initial commit', - created_at: '2017-07-26T11:08:53.000+02:00', - parent_ids: ['2a4b78934375d7f53875269ffd4f45fd83a84ebe'], - message: 'Initial commit', - author: { - avatar_url: 'uploads/-/system/user/avatar/johndoe/avatar.png', - id: 482476, - name: 'John Doe', - path: '/johndoe', - state: 'active', - status_tooltip_html: null, - username: 'johndoe', - web_url: 'https://gitlab.com/johndoe', - }, - authored_date: '2012-05-28T04:42:42-07:00', - committer_name: 'Jack Smith', - committer_email: 'jack@example.com', - committed_date: '2012-05-28T04:42:42-07:00', - }, - assets: { - count: 6, - sources: [ - { - format: 'zip', - url: 'https://gitlab.com/gitlab-org/gitlab-foss/-/archive/v11.3.12/gitlab-ce-v11.3.12.zip', - }, - { - format: 'tar.gz', - url: - 'https://gitlab.com/gitlab-org/gitlab-foss/-/archive/v11.3.12/gitlab-ce-v11.3.12.tar.gz', - }, - { - format: 'tar.bz2', - url: - 'https://gitlab.com/gitlab-org/gitlab-foss/-/archive/v11.3.12/gitlab-ce-v11.3.12.tar.bz2', - }, - { - format: 'tar', - url: 'https://gitlab.com/gitlab-org/gitlab-foss/-/archive/v11.3.12/gitlab-ce-v11.3.12.tar', - }, - ], - links: [ - { - name: 'release-18.04.dmg', - url: 'https://my-external-hosting.example.com/scrambled-url/', - external: true, - }, - { - name: 'binary-linux-amd64', - url: - 'https://gitlab.com/gitlab-org/gitlab-foss/-/jobs/artifacts/v11.6.0-rc4/download?job=rspec-mysql+41%2F50', - external: false, - }, - ], - }, -}; - -export const releases = [ - release, - { - name: 'JoJos Bizarre Adventure', - tag_name: '19.00', - description: '## changelog\n\n* line 1\n* line2', - description_html: '<div><h2>changelog</h2><ul><li>line1</li<li>line 2</li></ul></div>', - author_name: 'Release bot', - author_email: 'release-bot@example.com', - created_at: '2012-05-28T05:00:00-07:00', - commit: { - id: '2695effb5807a22ff3d138d593fd856244e155e7', - short_id: '2695effb', - title: 'Initial commit', - created_at: '2017-07-26T11:08:53.000+02:00', - parent_ids: ['2a4b78934375d7f53875269ffd4f45fd83a84ebe'], - message: 'Initial commit', - author: { - avatar_url: 'uploads/-/system/user/avatar/johndoe/avatar.png', - id: 482476, - name: 'John Doe', - path: '/johndoe', - state: 'active', - status_tooltip_html: null, - username: 'johndoe', - web_url: 'https://gitlab.com/johndoe', - }, - authored_date: '2012-05-28T04:42:42-07:00', - committer_name: 'Jack Smith', - committer_email: 'jack@example.com', - committed_date: '2012-05-28T04:42:42-07:00', - }, - assets: { - count: 4, - sources: [ - { - format: 'tar.gz', - url: - 'https://gitlab.com/gitlab-org/gitlab-foss/-/archive/v11.3.12/gitlab-ce-v11.3.12.tar.gz', - }, - { - format: 'tar.bz2', - url: - 'https://gitlab.com/gitlab-org/gitlab-foss/-/archive/v11.3.12/gitlab-ce-v11.3.12.tar.bz2', - }, - { - format: 'tar', - url: - 'https://gitlab.com/gitlab-org/gitlab-foss/-/archive/v11.3.12/gitlab-ce-v11.3.12.tar', - }, - ], - links: [ - { - name: 'binary-linux-amd64', - url: - 'https://gitlab.com/gitlab-org/gitlab-foss/-/jobs/artifacts/v11.6.0-rc4/download?job=rspec-mysql+41%2F50', - external: false, - }, - ], - }, - }, -]; diff --git a/spec/lib/gitlab/jira_import/base_importer_spec.rb b/spec/lib/gitlab/jira_import/base_importer_spec.rb index ecaf3def589..3bccb2395d6 100644 --- a/spec/lib/gitlab/jira_import/base_importer_spec.rb +++ b/spec/lib/gitlab/jira_import/base_importer_spec.rb @@ -8,24 +8,10 @@ describe Gitlab::JiraImport::BaseImporter do let(:project) { create(:project) } describe 'with any inheriting class' do - context 'when an error is returned from the project validation' do - before do - stub_feature_flags(jira_issue_import: false) - - allow(project).to receive(:validate_jira_import_settings!) - .and_raise(Projects::ImportService::Error, 'Jira import feature is disabled.') - end - - it 'raises exception' do - expect { described_class.new(project) }.to raise_error(Projects::ImportService::Error, 'Jira import feature is disabled.') - end - end - context 'when project validation is ok' do let!(:jira_service) { create(:jira_service, project: project) } before do - stub_feature_flags(jira_issue_import: true) stub_jira_service_test allow(project).to receive(:validate_jira_import_settings!) diff --git a/spec/lib/gitlab/jira_import/issues_importer_spec.rb b/spec/lib/gitlab/jira_import/issues_importer_spec.rb index 436fb139b36..0d790f49450 100644 --- a/spec/lib/gitlab/jira_import/issues_importer_spec.rb +++ b/spec/lib/gitlab/jira_import/issues_importer_spec.rb @@ -14,7 +14,6 @@ describe Gitlab::JiraImport::IssuesImporter do subject { described_class.new(project) } before do - stub_feature_flags(jira_issue_import: true) stub_jira_service_test end diff --git a/spec/lib/gitlab/jira_import/labels_importer_spec.rb b/spec/lib/gitlab/jira_import/labels_importer_spec.rb index 67eb541d376..19661ff4e73 100644 --- a/spec/lib/gitlab/jira_import/labels_importer_spec.rb +++ b/spec/lib/gitlab/jira_import/labels_importer_spec.rb @@ -15,7 +15,6 @@ describe Gitlab::JiraImport::LabelsImporter do subject { importer.execute } before do - stub_feature_flags(jira_issue_import: true) stub_const('Gitlab::JiraImport::LabelsImporter::MAX_LABELS', 2) end diff --git a/spec/models/iteration_spec.rb b/spec/models/iteration_spec.rb index 51e2c7a03ae..2386e2ecd41 100644 --- a/spec/models/iteration_spec.rb +++ b/spec/models/iteration_spec.rb @@ -50,7 +50,10 @@ describe Iteration do end context 'when dates overlap' do - context 'same group' do + let(:start_date) { 5.days.from_now } + let(:due_date) { 6.days.from_now } + + shared_examples_for 'overlapping dates' do context 'when start_date is in range' do let(:start_date) { 5.days.from_now } let(:due_date) { 3.weeks.from_now } @@ -59,6 +62,11 @@ describe Iteration do expect(subject).not_to be_valid expect(subject.errors[:base]).to include('Dates cannot overlap with other existing Iterations') end + + it 'is not valid even if forced' do + subject.validate # to generate iid/etc + expect { subject.save(validate: false) }.to raise_exception(ActiveRecord::StatementInvalid, /#{constraint_name}/) + end end context 'when end_date is in range' do @@ -69,25 +77,84 @@ describe Iteration do expect(subject).not_to be_valid expect(subject.errors[:base]).to include('Dates cannot overlap with other existing Iterations') end + + it 'is not valid even if forced' do + subject.validate # to generate iid/etc + expect { subject.save(validate: false) }.to raise_exception(ActiveRecord::StatementInvalid, /#{constraint_name}/) + end end context 'when both overlap' do - let(:start_date) { 5.days.from_now } - let(:due_date) { 6.days.from_now } - it 'is not valid' do expect(subject).not_to be_valid expect(subject.errors[:base]).to include('Dates cannot overlap with other existing Iterations') end + + it 'is not valid even if forced' do + subject.validate # to generate iid/etc + expect { subject.save(validate: false) }.to raise_exception(ActiveRecord::StatementInvalid, /#{constraint_name}/) + end end end - context 'different group' do - let(:start_date) { 5.days.from_now } - let(:due_date) { 6.days.from_now } - let(:group) { create(:group) } + context 'group' do + it_behaves_like 'overlapping dates' do + let(:constraint_name) { 'iteration_start_and_due_daterange_group_id_constraint' } + end + + context 'different group' do + let(:group) { create(:group) } + + it { is_expected.to be_valid } + + it 'does not trigger exclusion constraints' do + expect { subject.save }.not_to raise_exception + end + end + + context 'in a project' do + let(:project) { create(:project) } + + subject { build(:iteration, project: project, start_date: start_date, due_date: due_date) } + + it { is_expected.to be_valid } - it { is_expected.to be_valid } + it 'does not trigger exclusion constraints' do + expect { subject.save }.not_to raise_exception + end + end + end + + context 'project' do + let_it_be(:existing_iteration) { create(:iteration, project: project, start_date: 4.days.from_now, due_date: 1.week.from_now) } + + subject { build(:iteration, project: project, start_date: start_date, due_date: due_date) } + + it_behaves_like 'overlapping dates' do + let(:constraint_name) { 'iteration_start_and_due_daterange_project_id_constraint' } + end + + context 'different project' do + let(:project) { create(:project) } + + it { is_expected.to be_valid } + + it 'does not trigger exclusion constraints' do + expect { subject.save }.not_to raise_exception + end + end + + context 'in a group' do + let(:group) { create(:group) } + + subject { build(:iteration, group: group, start_date: start_date, due_date: due_date) } + + it { is_expected.to be_valid } + + it 'does not trigger exclusion constraints' do + expect { subject.save }.not_to raise_exception + end + end end end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index d4a57e832e2..28cb9b9abd7 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -6053,34 +6053,20 @@ describe Project do end shared_examples 'jira configuration base checks' do - context 'when feature flag is disabled' do - before do - stub_feature_flags(jira_issue_import: false) - end - - it_behaves_like 'raise Jira import error', 'Jira import feature is disabled.' + context 'when Jira service was not setup' do + it_behaves_like 'raise Jira import error', 'Jira integration not configured.' end - context 'when feature flag is enabled' do - before do - stub_feature_flags(jira_issue_import: true) - end - - context 'when Jira service was not setup' do - it_behaves_like 'raise Jira import error', 'Jira integration not configured.' - end - - context 'when Jira service exists' do - let!(:jira_service) { create(:jira_service, project: project, active: true) } - - context 'when Jira connection is not valid' do - before do - WebMock.stub_request(:get, 'https://jira.example.com/rest/api/2/serverInfo') - .to_raise(JIRA::HTTPError.new(double(message: 'Some failure.'))) - end + context 'when Jira service exists' do + let!(:jira_service) { create(:jira_service, project: project, active: true) } - it_behaves_like 'raise Jira import error', 'Unable to connect to the Jira instance. Please check your Jira integration configuration.' + context 'when Jira connection is not valid' do + before do + WebMock.stub_request(:get, 'https://jira.example.com/rest/api/2/serverInfo') + .to_raise(JIRA::HTTPError.new(double(message: 'Some failure.'))) end + + it_behaves_like 'raise Jira import error', 'Unable to connect to the Jira instance. Please check your Jira integration configuration.' end end end @@ -6116,38 +6102,32 @@ describe Project do it_behaves_like 'jira configuration base checks' end - context 'when feature flag is enabled' do + context 'when user does not have permissions to run the import' do before do - stub_feature_flags(jira_issue_import: true) - end + create(:jira_service, project: project, active: true) - context 'when user does not have permissions to run the import' do - before do - create(:jira_service, project: project, active: true) + project.add_developer(user) + end - project.add_developer(user) - end + it_behaves_like 'raise Jira import error', 'You do not have permissions to run the import.' + end - it_behaves_like 'raise Jira import error', 'You do not have permissions to run the import.' + context 'when user has permission to run import' do + before do + project.add_maintainer(user) end - context 'when user has permission to run import' do - before do - project.add_maintainer(user) - end - - let!(:jira_service) { create(:jira_service, project: project, active: true) } + let!(:jira_service) { create(:jira_service, project: project, active: true) } - context 'when issues feature is disabled' do - let_it_be(:project, reload: true) { create(:project, :issues_disabled) } + context 'when issues feature is disabled' do + let_it_be(:project, reload: true) { create(:project, :issues_disabled) } - it_behaves_like 'raise Jira import error', 'Cannot import because issues are not available in this project.' - end + it_behaves_like 'raise Jira import error', 'Cannot import because issues are not available in this project.' + end - context 'when everything is ok' do - it 'does not return any error' do - expect { subject }.not_to raise_error - end + context 'when everything is ok' do + it 'does not return any error' do + expect { subject }.not_to raise_error end end end diff --git a/spec/requests/api/graphql/mutations/jira_import/start_spec.rb b/spec/requests/api/graphql/mutations/jira_import/start_spec.rb index 84110098400..296d33aec5d 100644 --- a/spec/requests/api/graphql/mutations/jira_import/start_spec.rb +++ b/spec/requests/api/graphql/mutations/jira_import/start_spec.rb @@ -29,10 +29,6 @@ describe 'Starting a Jira Import' do end context 'when the user does not have permission' do - before do - stub_feature_flags(jira_issue_import: true) - end - shared_examples 'Jira import does not start' do it 'does not start the Jira import' do post_graphql_mutation(mutation, current_user: current_user) @@ -83,53 +79,39 @@ describe 'Starting a Jira Import' do end end - context 'when feature jira_issue_import feature flag is disabled' do - before do - stub_feature_flags(jira_issue_import: false) - end - - it_behaves_like 'a mutation that returns errors in the response', errors: ['Jira import feature is disabled.'] + context 'when project has no Jira service' do + it_behaves_like 'a mutation that returns errors in the response', errors: ['Jira integration not configured.'] end - context 'when feature jira_issue_import feature flag is enabled' do + context 'when when project has Jira service' do + let!(:service) { create(:jira_service, project: project) } + before do - stub_feature_flags(jira_issue_import: true) - end + project.reload - context 'when project has no Jira service' do - it_behaves_like 'a mutation that returns errors in the response', errors: ['Jira integration not configured.'] + stub_jira_service_test end - context 'when when project has Jira service' do - let!(:service) { create(:jira_service, project: project) } + context 'when issues feature are disabled' do + let_it_be(:project, reload: true) { create(:project, :issues_disabled) } - before do - project.reload - - stub_jira_service_test - end - - context 'when issues feature are disabled' do - let_it_be(:project, reload: true) { create(:project, :issues_disabled) } - - it_behaves_like 'a mutation that returns errors in the response', errors: ['Cannot import because issues are not available in this project.'] - end + it_behaves_like 'a mutation that returns errors in the response', errors: ['Cannot import because issues are not available in this project.'] + end - context 'when jira_project_key not provided' do - let(:jira_project_key) { '' } + context 'when jira_project_key not provided' do + let(:jira_project_key) { '' } - it_behaves_like 'a mutation that returns errors in the response', errors: ['Unable to find Jira project to import data from.'] - end + it_behaves_like 'a mutation that returns errors in the response', errors: ['Unable to find Jira project to import data from.'] + end - context 'when Jira import successfully scheduled' do - it 'schedules a Jira import' do - post_graphql_mutation(mutation, current_user: current_user) + context 'when Jira import successfully scheduled' do + it 'schedules a Jira import' do + post_graphql_mutation(mutation, current_user: current_user) - expect(jira_import['jiraProjectKey']).to eq 'AA' - expect(jira_import['scheduledBy']['username']).to eq current_user.username - expect(project.latest_jira_import).not_to be_nil - expect(project.latest_jira_import).to be_scheduled - end + expect(jira_import['jiraProjectKey']).to eq 'AA' + expect(jira_import['scheduledBy']['username']).to eq current_user.username + expect(project.latest_jira_import).not_to be_nil + expect(project.latest_jira_import).to be_scheduled end end end diff --git a/spec/workers/gitlab/jira_import/stage/finish_import_worker_spec.rb b/spec/workers/gitlab/jira_import/stage/finish_import_worker_spec.rb index 4cb6f5e28b8..084302be7d8 100644 --- a/spec/workers/gitlab/jira_import/stage/finish_import_worker_spec.rb +++ b/spec/workers/gitlab/jira_import/stage/finish_import_worker_spec.rb @@ -11,47 +11,33 @@ describe Gitlab::JiraImport::Stage::FinishImportWorker do end describe '#perform' do - context 'when feature flag enabled' do - before do - stub_feature_flags(jira_issue_import: false) - end + let_it_be(:jira_import, reload: true) { create(:jira_import_state, :scheduled, project: project) } + context 'when import did not start' do it_behaves_like 'cannot do Jira import' end - context 'when feature flag enabled' do - let_it_be(:jira_import, reload: true) { create(:jira_import_state, :scheduled, project: project) } + context 'when import started' do + let_it_be(:import_label) { create(:label, project: project, title: 'jira-import') } + let_it_be(:imported_issues) { create_list(:labeled_issue, 3, project: project, labels: [import_label]) } before do - stub_feature_flags(jira_issue_import: true) - end + expect(Gitlab::JiraImport).to receive(:get_import_label_id).and_return(import_label.id) + expect(Gitlab::JiraImport).to receive(:issue_failures).and_return(2) - context 'when import did not start' do - it_behaves_like 'cannot do Jira import' + jira_import.start! + worker.perform(project.id) end - context 'when import started' do - let_it_be(:import_label) { create(:label, project: project, title: 'jira-import') } - let_it_be(:imported_issues) { create_list(:labeled_issue, 3, project: project, labels: [import_label]) } - - before do - expect(Gitlab::JiraImport).to receive(:get_import_label_id).and_return(import_label.id) - expect(Gitlab::JiraImport).to receive(:issue_failures).and_return(2) - - jira_import.start! - worker.perform(project.id) - end - - it 'changes import state to finished' do - expect(project.jira_import_status).to eq('finished') - end + it 'changes import state to finished' do + expect(project.jira_import_status).to eq('finished') + end - it 'saves imported issues counts' do - latest_jira_import = project.latest_jira_import - expect(latest_jira_import.total_issue_count).to eq(5) - expect(latest_jira_import.failed_to_import_count).to eq(2) - expect(latest_jira_import.imported_issues_count).to eq(3) - end + it 'saves imported issues counts' do + latest_jira_import = project.latest_jira_import + expect(latest_jira_import.total_issue_count).to eq(5) + expect(latest_jira_import.failed_to_import_count).to eq(2) + expect(latest_jira_import.imported_issues_count).to eq(3) end end end diff --git a/spec/workers/gitlab/jira_import/stage/import_attachments_worker_spec.rb b/spec/workers/gitlab/jira_import/stage/import_attachments_worker_spec.rb index e6d41ae8bb4..34981d974cd 100644 --- a/spec/workers/gitlab/jira_import/stage/import_attachments_worker_spec.rb +++ b/spec/workers/gitlab/jira_import/stage/import_attachments_worker_spec.rb @@ -10,34 +10,19 @@ describe Gitlab::JiraImport::Stage::ImportAttachmentsWorker do end describe '#perform' do - context 'when feature flag disabled' do - before do - stub_feature_flags(jira_issue_import: false) - end + let_it_be(:jira_import) { create(:jira_import_state, :scheduled, project: project) } + context 'when import did not start' do it_behaves_like 'cannot do Jira import' it_behaves_like 'does not advance to next stage' end - context 'when feature flag enabled' do - let_it_be(:jira_import) { create(:jira_import_state, :scheduled, project: project) } - + context 'when import started' do before do - stub_feature_flags(jira_issue_import: true) + jira_import.start! end - context 'when import did not start' do - it_behaves_like 'cannot do Jira import' - it_behaves_like 'does not advance to next stage' - end - - context 'when import started' do - before do - jira_import.start! - end - - it_behaves_like 'advance to next stage', :notes - end + it_behaves_like 'advance to next stage', :notes end end end diff --git a/spec/workers/gitlab/jira_import/stage/import_issues_worker_spec.rb b/spec/workers/gitlab/jira_import/stage/import_issues_worker_spec.rb index f2067522af4..40f6cf75412 100644 --- a/spec/workers/gitlab/jira_import/stage/import_issues_worker_spec.rb +++ b/spec/workers/gitlab/jira_import/stage/import_issues_worker_spec.rb @@ -13,65 +13,53 @@ describe Gitlab::JiraImport::Stage::ImportIssuesWorker do end describe '#perform' do - context 'when feature flag disabled' do - before do - stub_feature_flags(jira_issue_import: false) - end + let_it_be(:jira_import, reload: true) { create(:jira_import_state, :scheduled, project: project) } + + before do + stub_jira_service_test + end + context 'when import did not start' do it_behaves_like 'cannot do Jira import' it_behaves_like 'does not advance to next stage' end - context 'when feature flag enabled' do - let_it_be(:jira_import, reload: true) { create(:jira_import_state, :scheduled, project: project) } + context 'when import started', :clean_gitlab_redis_cache do + let_it_be(:jira_service) { create(:jira_service, project: project) } before do - stub_feature_flags(jira_issue_import: true) - stub_jira_service_test + jira_import.start! + allow_next_instance_of(Gitlab::JiraImport::IssuesImporter) do |instance| + allow(instance).to receive(:fetch_issues).and_return([]) + end end - context 'when import did not start' do - it_behaves_like 'cannot do Jira import' - it_behaves_like 'does not advance to next stage' + context 'when start_at is nil' do + it_behaves_like 'advance to next stage', :attachments end - context 'when import started', :clean_gitlab_redis_cache do - let_it_be(:jira_service) { create(:jira_service, project: project) } - + context 'when start_at is zero' do before do - jira_import.start! - allow_next_instance_of(Gitlab::JiraImport::IssuesImporter) do |instance| - allow(instance).to receive(:fetch_issues).and_return([]) - end - end - - context 'when start_at is nil' do - it_behaves_like 'advance to next stage', :attachments + allow(Gitlab::Cache::Import::Caching).to receive(:read).and_return(0) end - context 'when start_at is zero' do - before do - allow(Gitlab::Cache::Import::Caching).to receive(:read).and_return(0) - end + it_behaves_like 'advance to next stage', :issues + end - it_behaves_like 'advance to next stage', :issues + context 'when start_at is greater than zero' do + before do + allow(Gitlab::Cache::Import::Caching).to receive(:read).and_return(25) end - context 'when start_at is greater than zero' do - before do - allow(Gitlab::Cache::Import::Caching).to receive(:read).and_return(25) - end + it_behaves_like 'advance to next stage', :issues + end - it_behaves_like 'advance to next stage', :issues + context 'when start_at is below zero' do + before do + allow(Gitlab::Cache::Import::Caching).to receive(:read).and_return(-1) end - context 'when start_at is below zero' do - before do - allow(Gitlab::Cache::Import::Caching).to receive(:read).and_return(-1) - end - - it_behaves_like 'advance to next stage', :attachments - end + it_behaves_like 'advance to next stage', :attachments end end end diff --git a/spec/workers/gitlab/jira_import/stage/import_labels_worker_spec.rb b/spec/workers/gitlab/jira_import/stage/import_labels_worker_spec.rb index 7f289de5422..1215b41bd9f 100644 --- a/spec/workers/gitlab/jira_import/stage/import_labels_worker_spec.rb +++ b/spec/workers/gitlab/jira_import/stage/import_labels_worker_spec.rb @@ -13,48 +13,33 @@ describe Gitlab::JiraImport::Stage::ImportLabelsWorker do end describe '#perform' do - context 'when feature flag disabled' do - before do - stub_feature_flags(jira_issue_import: false) - end + let_it_be(:jira_import, reload: true) { create(:jira_import_state, :scheduled, project: project) } + context 'when import did not start' do it_behaves_like 'cannot do Jira import' it_behaves_like 'does not advance to next stage' end - context 'when feature flag enabled' do - let_it_be(:jira_import, reload: true) { create(:jira_import_state, :scheduled, project: project) } + context 'when import started' do + let!(:jira_service) { create(:jira_service, project: project) } before do - stub_feature_flags(jira_issue_import: true) - end - - context 'when import did not start' do - it_behaves_like 'cannot do Jira import' - it_behaves_like 'does not advance to next stage' - end + stub_jira_service_test - context 'when import started' do - let!(:jira_service) { create(:jira_service, project: project) } + jira_import.start! - before do - stub_jira_service_test + WebMock.stub_request(:get, 'https://jira.example.com/rest/api/2/label?maxResults=500&startAt=0') + .to_return(body: {}.to_json ) + end - jira_import.start! + it_behaves_like 'advance to next stage', :issues - WebMock.stub_request(:get, 'https://jira.example.com/rest/api/2/label?maxResults=500&startAt=0') - .to_return(body: {}.to_json ) + it 'executes labels importer' do + expect_next_instance_of(Gitlab::JiraImport::LabelsImporter) do |instance| + expect(instance).to receive(:execute).and_return(Gitlab::JobWaiter.new) end - it_behaves_like 'advance to next stage', :issues - - it 'executes labels importer' do - expect_next_instance_of(Gitlab::JiraImport::LabelsImporter) do |instance| - expect(instance).to receive(:execute).and_return(Gitlab::JobWaiter.new) - end - - described_class.new.perform(project.id) - end + described_class.new.perform(project.id) end end end diff --git a/spec/workers/gitlab/jira_import/stage/import_notes_worker_spec.rb b/spec/workers/gitlab/jira_import/stage/import_notes_worker_spec.rb index f9bdbd669d8..a0a9ad6f695 100644 --- a/spec/workers/gitlab/jira_import/stage/import_notes_worker_spec.rb +++ b/spec/workers/gitlab/jira_import/stage/import_notes_worker_spec.rb @@ -10,34 +10,19 @@ describe Gitlab::JiraImport::Stage::ImportNotesWorker do end describe '#perform' do - context 'when feature flag disabled' do - before do - stub_feature_flags(jira_issue_import: false) - end + let_it_be(:jira_import) { create(:jira_import_state, :scheduled, project: project) } + context 'when import did not start' do it_behaves_like 'cannot do Jira import' it_behaves_like 'does not advance to next stage' end - context 'when feature flag enabled' do - let_it_be(:jira_import) { create(:jira_import_state, :scheduled, project: project) } - + context 'when import started' do before do - stub_feature_flags(jira_issue_import: true) + jira_import.start! end - context 'when import did not start' do - it_behaves_like 'cannot do Jira import' - it_behaves_like 'does not advance to next stage' - end - - context 'when import started' do - before do - jira_import.start! - end - - it_behaves_like 'advance to next stage', :finish - end + it_behaves_like 'advance to next stage', :finish end end end diff --git a/spec/workers/gitlab/jira_import/stage/start_import_worker_spec.rb b/spec/workers/gitlab/jira_import/stage/start_import_worker_spec.rb index 9cffe6e4ff7..a4fc761accf 100644 --- a/spec/workers/gitlab/jira_import/stage/start_import_worker_spec.rb +++ b/spec/workers/gitlab/jira_import/stage/start_import_worker_spec.rb @@ -12,80 +12,62 @@ describe Gitlab::JiraImport::Stage::StartImportWorker do end describe '#perform' do - context 'when feature flag not disabled' do - before do - stub_feature_flags(jira_issue_import: false) - end + let_it_be(:jira_import, reload: true) { create(:jira_import_state, project: project, jid: jid) } - it 'exits because import not allowed' do + context 'when import is not scheduled' do + it 'exits because import not started' do expect(Gitlab::JiraImport::Stage::ImportLabelsWorker).not_to receive(:perform_async) worker.perform(project.id) end end - context 'when feature flag enabled' do - let_it_be(:jira_import, reload: true) { create(:jira_import_state, project: project, jid: jid) } - + context 'when import is scheduled' do before do - stub_feature_flags(jira_issue_import: true) + jira_import.schedule! end - context 'when import is not scheduled' do - it 'exits because import not started' do - expect(Gitlab::JiraImport::Stage::ImportLabelsWorker).not_to receive(:perform_async) + it 'advances to importing labels' do + expect(Gitlab::JiraImport::Stage::ImportLabelsWorker).to receive(:perform_async) - worker.perform(project.id) - end + worker.perform(project.id) end + end - context 'when import is scheduled' do - before do - jira_import.schedule! - end + context 'when import is started' do + before do + jira_import.update!(status: :started) + end + context 'when this is the same worker that stated import' do it 'advances to importing labels' do + allow(worker).to receive(:jid).and_return(jid) expect(Gitlab::JiraImport::Stage::ImportLabelsWorker).to receive(:perform_async) worker.perform(project.id) end end - context 'when import is started' do - before do - jira_import.update!(status: :started) - end - - context 'when this is the same worker that stated import' do - it 'advances to importing labels' do - allow(worker).to receive(:jid).and_return(jid) - expect(Gitlab::JiraImport::Stage::ImportLabelsWorker).to receive(:perform_async) - - worker.perform(project.id) - end - end - - context 'when this is a different worker that stated import' do - it 'advances to importing labels' do - allow(worker).to receive(:jid).and_return('87654321') - expect(Gitlab::JiraImport::Stage::ImportLabelsWorker).not_to receive(:perform_async) + context 'when this is a different worker that stated import' do + it 'advances to importing labels' do + allow(worker).to receive(:jid).and_return('87654321') + expect(Gitlab::JiraImport::Stage::ImportLabelsWorker).not_to receive(:perform_async) - worker.perform(project.id) - end + worker.perform(project.id) end end + end - context 'when import is finished' do - before do - jira_import.update!(status: :finished) - end + context 'when import is finished' do + before do + jira_import.update!(status: :finished) + end - it 'advances to importing labels' do - allow(worker).to receive(:jid).and_return(jid) - expect(Gitlab::JiraImport::Stage::ImportLabelsWorker).not_to receive(:perform_async) + it 'advances to importing labels' do + allow(worker).to receive(:jid).and_return(jid) + expect(Gitlab::JiraImport::Stage::ImportLabelsWorker).not_to receive(:perform_async) - worker.perform(project.id) - end + worker.perform(project.id) end end end |