Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-05-26 15:08:22 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-05-26 15:08:22 +0300
commit1691cbe307f7698b3ee39811278990c43b6751a5 (patch)
tree2bd7d5b7143242f540a9edde92c83c791ebf8af4 /spec
parent27c6c4bf061c3a2289ce4808b1b354535994d09d (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/projects/import/jira_controller_spec.rb240
-rw-r--r--spec/features/markdown/mermaid_spec.rb5
-rw-r--r--spec/frontend/blob/components/blob_header_default_actions_spec.js8
-rw-r--r--spec/frontend/blob/components/blob_header_spec.js11
-rw-r--r--spec/frontend/releases/components/app_index_spec.js (renamed from spec/javascripts/releases/components/app_index_spec.js)112
-rw-r--r--spec/frontend/releases/mock_data.js88
-rw-r--r--spec/frontend/releases/stores/modules/list/actions_spec.js (renamed from spec/javascripts/releases/stores/modules/list/actions_spec.js)8
-rw-r--r--spec/frontend/releases/stores/modules/list/helpers.js (renamed from spec/javascripts/releases/stores/modules/list/helpers.js)0
-rw-r--r--spec/frontend/releases/stores/modules/list/mutations_spec.js (renamed from spec/javascripts/releases/stores/modules/list/mutations_spec.js)0
-rw-r--r--spec/frontend/snippets/components/snippet_blob_view_spec.js20
-rw-r--r--spec/frontend/vue_mr_widget/components/mr_widget_rebase_spec.js4
-rw-r--r--spec/graphql/resolvers/projects/jira_imports_resolver_spec.rb10
-rw-r--r--spec/helpers/notes_helper_spec.rb30
-rw-r--r--spec/helpers/todos_helper_spec.rb2
-rw-r--r--spec/javascripts/releases/mock_data.js148
-rw-r--r--spec/lib/gitlab/jira_import/base_importer_spec.rb14
-rw-r--r--spec/lib/gitlab/jira_import/issues_importer_spec.rb1
-rw-r--r--spec/lib/gitlab/jira_import/labels_importer_spec.rb1
-rw-r--r--spec/models/iteration_spec.rb85
-rw-r--r--spec/models/project_spec.rb74
-rw-r--r--spec/requests/api/graphql/mutations/jira_import/start_spec.rb62
-rw-r--r--spec/workers/gitlab/jira_import/stage/finish_import_worker_spec.rb48
-rw-r--r--spec/workers/gitlab/jira_import/stage/import_attachments_worker_spec.rb25
-rw-r--r--spec/workers/gitlab/jira_import/stage/import_issues_worker_spec.rb66
-rw-r--r--spec/workers/gitlab/jira_import/stage/import_labels_worker_spec.rb43
-rw-r--r--spec/workers/gitlab/jira_import/stage/import_notes_worker_spec.rb25
-rw-r--r--spec/workers/gitlab/jira_import/stage/start_import_worker_spec.rb76
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