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
diff options
context:
space:
mode:
Diffstat (limited to 'spec/controllers/projects/import/jira_controller_spec.rb')
-rw-r--r--spec/controllers/projects/import/jira_controller_spec.rb173
1 files changed, 173 insertions, 0 deletions
diff --git a/spec/controllers/projects/import/jira_controller_spec.rb b/spec/controllers/projects/import/jira_controller_spec.rb
new file mode 100644
index 00000000000..9d68104b755
--- /dev/null
+++ b/spec/controllers/projects/import/jira_controller_spec.rb
@@ -0,0 +1,173 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Projects::Import::JiraController do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+
+ 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 }
+
+ expect(response).to redirect_to(new_user_session_path)
+ 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: 'Test' }
+
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+ end
+
+ context 'with logged in user' do
+ before do
+ sign_in(user)
+ project.add_maintainer(user)
+ end
+
+ context 'when feature flag not enabled' do
+ before do
+ stub_feature_flags(jira_issue_import: false)
+ end
+
+ context 'get show' do
+ it 'redirects to issues page' do
+ get :show, params: { namespace_id: project.namespace, project_id: project }
+
+ expect(response).to redirect_to(project_issues_path(project))
+ 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: 'Test' }
+
+ 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)
+ end
+
+ context 'when jira service is enabled for the project' do
+ let_it_be(:jira_service) { create(:jira_service, project: project) }
+
+ context 'when running jira import first time' do
+ context 'get show' do
+ it 'renders show template' do
+ allow(JIRA::Resource::Project).to receive(:all).and_return([])
+ expect(project.import_state).to be_nil
+
+ get :show, params: { namespace_id: project.namespace.to_param, project_id: project }
+
+ expect(response).to render_template :show
+ end
+ end
+
+ context 'post import' do
+ it 'creates import state' do
+ expect(project.import_state).to be_nil
+
+ post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: 'Test' }
+
+ project.reload
+
+ jira_project = project.import_data.data.dig('jira', 'projects').first
+ expect(project.import_type).to eq 'jira'
+ expect(project.import_state.status).to eq 'scheduled'
+ expect(jira_project['key']).to eq 'Test'
+ expect(response).to redirect_to(project_import_jira_path(project))
+ end
+ end
+ end
+
+ context 'when import state is scheduled' do
+ let_it_be(:import_state) { create(:import_state, project: project, status: :scheduled) }
+
+ context 'get show' do
+ it 'renders import status' do
+ get :show, params: { namespace_id: project.namespace.to_param, project_id: project }
+
+ expect(project.import_state.status).to eq 'scheduled'
+ expect(flash.now[:notice]).to eq 'Import scheduled'
+ end
+ end
+
+ context 'post import' do
+ before do
+ project.reload
+ project.create_import_data(
+ data: {
+ 'jira': {
+ 'projects': [{ 'key': 'Test', scheduled_at: 5.days.ago, scheduled_by: { user_id: user.id, name: user.name } }]
+ }
+ }
+ )
+ end
+
+ it 'uses the existing import data' do
+ expect(controller).not_to receive(:schedule_import)
+
+ post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: 'New Project' }
+
+ expect(response).to redirect_to(project_import_jira_path(project))
+ end
+ end
+ end
+
+ context 'when jira import ran before' do
+ let_it_be(:import_state) { create(:import_state, project: project, status: :finished) }
+
+ 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.import_state.status).to eq 'finished'
+ expect(flash.now[:notice]).to eq 'Import finished'
+ end
+ end
+
+ context 'post import' do
+ before do
+ project.reload
+ project.create_import_data(
+ data: {
+ 'jira': {
+ 'projects': [{ 'key': 'Test', scheduled_at: 5.days.ago, scheduled_by: { user_id: user.id, name: user.name } }]
+ }
+ }
+ )
+ end
+
+ it 'uses the existing import data' do
+ expect(controller).to receive(:schedule_import).and_call_original
+
+ post :import, params: { namespace_id: project.namespace, project_id: project, jira_project_key: 'New Project' }
+
+ project.reload
+ expect(project.import_state.status).to eq 'scheduled'
+ jira_imported_projects = project.import_data.data.dig('jira', 'projects')
+ expect(jira_imported_projects.size).to eq 2
+ expect(jira_imported_projects.first['key']).to eq 'Test'
+ expect(jira_imported_projects.last['key']).to eq 'New Project'
+ expect(response).to redirect_to(project_import_jira_path(project))
+ end
+ end
+ end
+ end
+ end
+ end
+end