summaryrefslogtreecommitdiff
path: root/spec/requests/api/graphql/mutations/jira_import/start_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/requests/api/graphql/mutations/jira_import/start_spec.rb')
-rw-r--r--spec/requests/api/graphql/mutations/jira_import/start_spec.rb130
1 files changed, 130 insertions, 0 deletions
diff --git a/spec/requests/api/graphql/mutations/jira_import/start_spec.rb b/spec/requests/api/graphql/mutations/jira_import/start_spec.rb
new file mode 100644
index 00000000000..3eb2ca6909b
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/jira_import/start_spec.rb
@@ -0,0 +1,130 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Starting a Jira Import' do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project, reload: true) { create(:project) }
+ let(:jira_project_key) { 'AA' }
+ let(:project_path) { project.full_path }
+
+ let(:mutation) do
+ variables = {
+ jira_project_key: jira_project_key,
+ project_path: project_path
+ }
+
+ graphql_mutation(:jira_import_start, variables)
+ end
+
+ def mutation_response
+ graphql_mutation_response(:jira_import_start)
+ end
+
+ def jira_import
+ mutation_response['jiraImport']
+ 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)
+
+ expect(project.reload.import_state).to be nil
+ expect(project.reload.import_data).to be nil
+ end
+ end
+
+ context 'with anonymous user' do
+ let(:current_user) { nil }
+
+ it_behaves_like 'Jira import does not start'
+ it_behaves_like 'a mutation that returns top-level errors',
+ errors: [Gitlab::Graphql::Authorize::AuthorizeResource::RESOURCE_ACCESS_ERROR]
+ end
+
+ context 'with user without permissions' do
+ let(:current_user) { user }
+ let(:project_path) { project.full_path }
+
+ before do
+ project.add_developer(current_user)
+ end
+
+ it_behaves_like 'Jira import does not start'
+ it_behaves_like 'a mutation that returns top-level errors',
+ errors: [Gitlab::Graphql::Authorize::AuthorizeResource::RESOURCE_ACCESS_ERROR]
+ end
+ end
+
+ context 'when the user has permission' do
+ let(:current_user) { user }
+
+ before do
+ project.add_maintainer(current_user)
+ end
+
+ context 'with project' do
+ context 'when the project path is invalid' do
+ let(:project_path) { 'foobar' }
+
+ it 'returns an an error' do
+ post_graphql_mutation(mutation, current_user: current_user)
+ errors = json_response['errors']
+
+ expect(errors.first['message']).to eq(Gitlab::Graphql::Authorize::AuthorizeResource::RESOURCE_ACCESS_ERROR)
+ 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.']
+ end
+
+ context 'when feature jira_issue_import feature flag is enabled' do
+ before do
+ stub_feature_flags(jira_issue_import: true)
+ end
+
+ 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 when project has Jira service' do
+ let!(:service) { create(:jira_service, project: project) }
+
+ before do
+ project.reload
+ end
+
+ 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
+
+ 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.import_state).not_to be nil
+ expect(project.import_state.status).to eq 'scheduled'
+ expect(project.import_data.becomes(JiraImportData).projects.last.scheduled_by['user_id']).to eq current_user.id
+ end
+ end
+ end
+ end
+ end
+ end
+end