diff --git a/ee/app/models/project_services/ee/jira_service.rb b/ee/app/models/project_services/ee/jira_service.rb index 9a0c5bdd9b874130ed96b6f8ff8b4b1618fa61fc..66fca4d87d125a4e4c80fca64ec57db13e182d9b 100644 --- a/ee/app/models/project_services/ee/jira_service.rb +++ b/ee/app/models/project_services/ee/jira_service.rb @@ -89,6 +89,8 @@ def jira_project # # @return [Array] the array of IDs def project_issuetype_scheme_ids + raise NotImplementedError unless data_fields.deployment_cloud? + query_url = Addressable::URI.join("#{client.options[:rest_base_path]}/", 'issuetypescheme/', 'project') query_url.query_values = { 'projectId' => jira_project_id } @@ -103,13 +105,24 @@ def project_issuetype_scheme_ids # @return [Array] the array of IDs def project_issuetype_ids strong_memoize(:project_issuetype_ids) do - query_url = Addressable::URI.join("#{client.options[:rest_base_path]}/", 'issuetypescheme/', 'mapping') - query_url.query_values = { 'issueTypeSchemeId' => project_issuetype_scheme_ids } - - client - .get(query_url.to_s) - .fetch('values', []) - .map { |schemes| schemes['issueTypeId'] } + if data_fields.deployment_server? + query_url = Addressable::URI.join("#{client.options[:rest_base_path]}/", 'project/', project_key) + + client + .get(query_url.to_s) + .fetch('issueTypes', []) + .map { |issue_type| issue_type['id'] } + elsif data_fields.deployment_cloud? + query_url = Addressable::URI.join("#{client.options[:rest_base_path]}/", 'issuetypescheme/', 'mapping') + query_url.query_values = { 'issueTypeSchemeId' => project_issuetype_scheme_ids } + + client + .get(query_url.to_s) + .fetch('values', []) + .map { |schemes| schemes['issueTypeId'] } + else + raise NotImplementedError + end end end diff --git a/ee/spec/models/project_services/jira_service_spec.rb b/ee/spec/models/project_services/jira_service_spec.rb index 472bc274a7f45d97737a05e5f8e7af92504628c2..c4b6b6f9c3ef25129f23eaf03be707be09e78640 100644 --- a/ee/spec/models/project_services/jira_service_spec.rb +++ b/ee/spec/models/project_services/jira_service_spec.rb @@ -15,6 +15,11 @@ } end + before do + allow(jira_service.data_fields).to receive(:deployment_cloud?).and_return(true) + allow(jira_service.data_fields).to receive(:deployment_server?).and_return(false) + end + describe 'validations' do it 'validates presence of project_key if issues_enabled' do jira_service.project_key = '' @@ -111,80 +116,150 @@ end context 'when vulnerabilities integration is enabled' do - let(:project_info_result) { { 'id' => '10000' } } + before do + allow(jira_service.project).to receive(:jira_vulnerabilities_integration_enabled?).and_return(true) + end - let(:issue_type_scheme_response) do - { - values: [ - { - issueTypeScheme: { - id: '10126', - name: 'GV: Software Development Issue Type Scheme', - defaultIssueTypeId: '10001' + context 'when deployment type is cloud' do + let(:project_info_result) { { 'id' => '10000' } } + + let(:issue_type_scheme_response) do + { + values: [ + { + issueTypeScheme: { + id: '10126', + name: 'GV: Software Development Issue Type Scheme', + defaultIssueTypeId: '10001' + }, + projectIds: [ + '10000' + ] + } + ] + } + end + + let(:issue_type_mapping_response) do + { + values: [ + { + issueTypeSchemeId: '10126', + issueTypeId: '10003' }, - projectIds: [ - '10000' - ] - } - ] - } - end + { + issueTypeSchemeId: '10126', + issueTypeId: '10001' + } + ] + } + end - let(:issue_type_mapping_response) do - { - values: [ + let(:issue_types_response) do + [ + { + id: '10004', + description: 'A new feature of the product, which has yet to be developed.', + name: 'New Feature', + untranslatedName: 'New Feature', + subtask: false, + avatarId: 10311 + }, { - issueTypeSchemeId: '10126', - issueTypeId: '10003' + id: '10001', + description: 'Jira Bug', + name: 'Bug', + untranslatedName: 'Bug', + subtask: false, + avatarId: 10303 }, { - issueTypeSchemeId: '10126', - issueTypeId: '10001' + id: '10003', + description: 'A small piece of work thats part of a larger task.', + name: 'Sub-task', + untranslatedName: 'Sub-task', + subtask: true, + avatarId: 10316 } ] - } + end + + before do + WebMock.stub_request(:get, /api\/2\/project\/GL/).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password)).to_return(body: project_info_result.to_json ) + WebMock.stub_request(:get, /api\/2\/project\/GL\z/).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password)).to_return(body: { 'id' => '10000' }.to_json, headers: headers) + WebMock.stub_request(:get, /api\/2\/issuetype\z/).to_return(body: issue_types_response.to_json, headers: headers) + WebMock.stub_request(:get, /api\/2\/issuetypescheme\/project\?projectId\=10000\z/).to_return(body: issue_type_scheme_response.to_json, headers: headers) + WebMock.stub_request(:get, /api\/2\/issuetypescheme\/mapping\?issueTypeSchemeId\=10126\z/).to_return(body: issue_type_mapping_response.to_json, headers: headers) + end + + it { is_expected.to eq(success: true, result: { jira: true }, data: { issuetypes: [{ id: '10001', name: 'Bug', description: 'Jira Bug' }] }) } end - let(:issue_types_response) do - [ + context 'when deployment type is server' do + let(:project_info_result) do { - id: '10004', - description: 'A new feature of the product, which has yet to be developed.', - name: 'New Feature', - untranslatedName: 'New Feature', - subtask: false, - avatarId: 10311 - }, - { - id: '10001', - description: 'Jira Bug', - name: 'Bug', - untranslatedName: 'Bug', - subtask: false, - avatarId: 10303 - }, - { - id: '10003', - description: 'A small piece of work thats part of a larger task.', - name: 'Sub-task', - untranslatedName: 'Sub-task', - subtask: true, - avatarId: 10316 + "id": "10000", + "issueTypes": issue_types_response } - ] - end + end - before do - allow(jira_service.project).to receive(:jira_vulnerabilities_integration_enabled?).and_return(true) + let(:issue_types_response) do + [ + { + "avatarId": 10318, + "description": "A task that needs to be done.", + "iconUrl": "http://jira.reali.sh:8080/secure/viewavatar?size=xsmall&avatarId=10318&avatarType=issuetype", + "id": "10003", + "name": "Task", + "self": "http://jira.reali.sh:8080/rest/api/2/issuetype/10003", + "subtask": false + }, + { + "description": "The sub-task of the issue", + "iconUrl": "http://jira.reali.sh:8080/images/icons/issuetypes/subtask_alternate.png", + "id": "10000", + "name": "Sub-task", + "self": "http://jira.reali.sh:8080/rest/api/2/issuetype/10000", + "subtask": true + }, + { + "description": "Created by Jira Software - do not edit or delete. Issue type for a user story.", + "iconUrl": "http://jira.reali.sh:8080/images/icons/issuetypes/story.svg", + "id": "10002", + "name": "Story", + "self": "http://jira.reali.sh:8080/rest/api/2/issuetype/10002", + "subtask": false + }, + { + "avatarId": 10303, + "description": "A problem which impairs or prevents the functions of the product.", + "iconUrl": "http://jira.reali.sh:8080/secure/viewavatar?size=xsmall&avatarId=10303&avatarType=issuetype", + "id": "10004", + "name": "Bug", + "self": "http://jira.reali.sh:8080/rest/api/2/issuetype/10004", + "subtask": false + }, + { + "description": "Created by Jira Software - do not edit or delete. Issue type for a big user story that needs to be broken down.", + "iconUrl": "http://jira.reali.sh:8080/images/icons/issuetypes/epic.svg", + "id": "10001", + "name": "Epic", + "self": "http://jira.reali.sh:8080/rest/api/2/issuetype/10001", + "subtask": false + } + ] + end - WebMock.stub_request(:get, /api\/2\/project\/GL/).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password)).to_return(body: project_info_result.to_json ) - WebMock.stub_request(:get, /api\/2\/project\/GL\z/).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password)).to_return(body: { 'id' => '10000' }.to_json, headers: headers) - WebMock.stub_request(:get, /api\/2\/issuetype\z/).to_return(body: issue_types_response.to_json, headers: headers) - WebMock.stub_request(:get, /api\/2\/issuetypescheme\/project\?projectId\=10000\z/).to_return(body: issue_type_scheme_response.to_json, headers: headers) - WebMock.stub_request(:get, /api\/2\/issuetypescheme\/mapping\?issueTypeSchemeId\=10126\z/).to_return(body: issue_type_mapping_response.to_json, headers: headers) - end + before do + allow(jira_service.data_fields).to receive(:deployment_cloud?).and_return(false) + allow(jira_service.data_fields).to receive(:deployment_server?).and_return(true) - it { is_expected.to eq(success: true, result: { jira: true }, data: { issuetypes: [{ id: '10001', name: 'Bug', description: 'Jira Bug' }] }) } + WebMock.stub_request(:get, /api\/2\/project\/GL/).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password)).to_return(body: project_info_result.to_json, headers: headers) + WebMock.stub_request(:get, /api\/2\/issuetype\z/).to_return(body: issue_types_response.to_json, headers: headers) + end + + it { is_expected.to eq(success: true, result: { jira: true }, data: { issuetypes: [{ description: "A task that needs to be done.", id: "10003", name: "Task" }, { description: "Created by Jira Software - do not edit or delete. Issue type for a user story.", id: "10002", name: "Story" }, { description: "A problem which impairs or prevents the functions of the product.", id: "10004", name: "Bug" }, { description: "Created by Jira Software - do not edit or delete. Issue type for a big user story that needs to be broken down.", id: "10001", name: "Epic" }] }) } + end end end end diff --git a/spec/factories/services.rb b/spec/factories/services.rb index 7b9d7bfb3e0fe4f7b7a441132e4a357c826136f6..25ef75880bb48d1b5e53b0c2540cce3db3f7a177 100644 --- a/spec/factories/services.rb +++ b/spec/factories/services.rb @@ -62,6 +62,7 @@ project_key { nil } vulnerabilities_enabled { false } vulnerabilities_issuetype { nil } + deployment_type { 'cloud' } end before(:create) do |service, evaluator| @@ -72,7 +73,7 @@ jira_issue_transition_id: evaluator.jira_issue_transition_id, username: evaluator.username, password: evaluator.password, issues_enabled: evaluator.issues_enabled, project_key: evaluator.project_key, vulnerabilities_enabled: evaluator.vulnerabilities_enabled, - vulnerabilities_issuetype: evaluator.vulnerabilities_issuetype + vulnerabilities_issuetype: evaluator.vulnerabilities_issuetype, deployment_type: evaluator.deployment_type ) end end