Skip to content
Snippets Groups Projects
Commit 9c740133 authored by Felipe Artur's avatar Felipe Artur
Browse files

Allow JIRA references for project snippets

parent 671c6d7d
No related branches found
No related tags found
No related merge requests found
# == Mentionable concern
#
# Contains functionality related to objects that can mention Users, Issues, MergeRequests, or Commits by
# Contains functionality related to objects that can mention Users, Issues, MergeRequests, Commits or Snippets by
# GFM references.
#
# Used by Issue, Note, MergeRequest, and Commit.
Loading
Loading
Loading
Loading
@@ -128,15 +128,9 @@ class JiraService < IssueTrackerService
 
return unless jira_issue.present?
 
project = self.project
noteable_name = noteable.model_name.singular
noteable_id = if noteable.is_a?(Commit)
noteable.id
else
noteable.iid
end
entity_url = build_entity_url(noteable_name.to_sym, noteable_id)
noteable_id = noteable.respond_to?(:iid) ? noteable.iid : noteable.id
noteable_type = noteable_name(noteable)
entity_url = build_entity_url(noteable_type, noteable_id)
 
data = {
user: {
Loading
Loading
@@ -144,11 +138,11 @@ class JiraService < IssueTrackerService
url: resource_url(user_path(author)),
},
project: {
name: project.path_with_namespace,
url: resource_url(namespace_project_path(project.namespace, project))
name: self.project.path_with_namespace,
url: resource_url(namespace_project_path(project.namespace, self.project))
},
entity: {
name: noteable_name.humanize.downcase,
name: noteable_type.humanize.downcase,
url: entity_url,
title: noteable.title
}
Loading
Loading
@@ -285,18 +279,26 @@ class JiraService < IssueTrackerService
"#{Settings.gitlab.base_url.chomp("/")}#{resource}"
end
 
def build_entity_url(entity_name, entity_id)
def build_entity_url(noteable_type, entity_id)
polymorphic_url(
[
self.project.namespace.becomes(Namespace),
self.project,
entity_name
noteable_type.to_sym
],
id: entity_id,
host: Settings.gitlab.base_url
)
end
 
def noteable_name(noteable)
name = noteable.model_name.singular
# ProjectSnippet inherits from Snippet class so it causes
# routing error building the URL.
name == "project_snippet" ? "snippet" : name
end
# Handle errors when doing JIRA API calls
def jira_request
yield
Loading
Loading
Loading
Loading
@@ -6,6 +6,7 @@ class Snippet < ActiveRecord::Base
include Referable
include Sortable
include Awardable
include Mentionable
 
cache_markdown_field :title, pipeline: :single_line
cache_markdown_field :content
Loading
Loading
---
title: Fix JIRA references for project snippets
merge_request:
author:
Loading
Loading
@@ -543,7 +543,10 @@ describe SystemNoteService, services: true do
let(:comment_url) { jira_api_comment_url(jira_issue.id) }
let(:success_message) { "JiraService SUCCESS: Successfully posted to http://jira.example.net." }
 
before { stub_jira_urls(jira_issue.id) }
before do
stub_jira_urls(jira_issue.id)
jira_service_settings
end
 
noteable_types = ["merge_requests", "commit"]
 
Loading
Loading
@@ -569,16 +572,16 @@ describe SystemNoteService, services: true do
end
end
 
context 'in JIRA issue tracker' do
before { jira_service_settings }
describe "new reference" do
subject { described_class.cross_reference(jira_issue, commit, author) }
describe "new reference" do
context 'for commits' do
it "creates comment" do
result = described_class.cross_reference(jira_issue, commit, author)
 
it { is_expected.to eq(success_message) }
expect(result).to eq(success_message)
end
 
it "creates remote link" do
subject
described_class.cross_reference(jira_issue, commit, author)
 
expect(WebMock).to have_requested(:post, jira_api_remote_link_url(jira_issue)).with(
body: hash_including(
Loading
Loading
@@ -593,18 +596,18 @@ describe SystemNoteService, services: true do
).once
end
end
end
 
context 'in commit' do
context 'in JIRA issue tracker' do
before { jira_service_settings }
context 'for issues' do
let(:issue) { create(:issue, project: project) }
 
subject { described_class.cross_reference(jira_issue, issue, author) }
it "creates comment" do
result = described_class.cross_reference(jira_issue, issue, author)
 
it { is_expected.to eq(success_message) }
expect(result).to eq(success_message)
end
 
it "creates remote link" do
subject
described_class.cross_reference(jira_issue, issue, author)
 
expect(WebMock).to have_requested(:post, jira_api_remote_link_url(jira_issue)).with(
body: hash_including(
Loading
Loading
@@ -619,6 +622,32 @@ describe SystemNoteService, services: true do
).once
end
end
context 'for snippets' do
let(:snippet) { create(:snippet, project: project) }
it "creates comment" do
result = described_class.cross_reference(jira_issue, snippet, author)
expect(result).to eq(success_message)
end
it "creates remote link" do
described_class.cross_reference(jira_issue, snippet, author)
expect(WebMock).to have_requested(:post, jira_api_remote_link_url(jira_issue)).with(
body: hash_including(
GlobalID: "GitLab",
object: {
url: namespace_project_snippet_url(project.namespace, project, snippet),
title: "GitLab: Mentioned on snippet - #{snippet.title}",
icon: { title: "GitLab", url16x16: "https://gitlab.com/favicon.ico" },
status: { resolved: false }
}
)
).once
end
end
end
 
describe "existing reference" do
Loading
Loading
@@ -627,9 +656,11 @@ describe SystemNoteService, services: true do
allow_any_instance_of(JIRA::Resource::Issue).to receive(:comments).and_return([OpenStruct.new(body: message)])
end
 
subject { described_class.cross_reference(jira_issue, commit, author) }
it "does not return success message" do
result = described_class.cross_reference(jira_issue, commit, author)
 
it { is_expected.not_to eq(success_message) }
expect(result).not_to eq(success_message)
end
 
it 'does not try to create comment and remote link' do
subject
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment