Handle external issues in IssueReferenceFilter

In the past this class would use Project#get_issue to retrieve an issue
by its ID. This method would automatically determine whether to return
an Issue or ExternalIssue.

This commit changes IssueReferenceFilter to handle external issues again
and in a somewhat more explicit manner than before.

Fixes gitlab-org/gitlab-ce#18827
This commit is contained in:
Yorick Peterse 2016-06-20 11:53:08 +02:00
parent 44b8b77e02
commit ceeba75c76
No known key found for this signature in database
GPG Key ID: EDD30D2BEB691AC9
2 changed files with 43 additions and 3 deletions

View File

@ -31,10 +31,14 @@ module Banzai
projects_per_reference.each do |path, project|
issue_ids = references_per_project[path]
next unless project.default_issues_tracker?
if project.default_issues_tracker?
issues = project.issues.where(iid: issue_ids.to_a)
else
issues = issue_ids.map { |id| ExternalIssue.new(id, project) }
end
project.issues.where(iid: issue_ids.to_a).each do |issue|
hash[project][issue.iid] = issue
issues.each do |issue|
hash[project][issue.iid.to_i] = issue
end
end

View File

@ -198,4 +198,40 @@ describe Banzai::Filter::IssueReferenceFilter, lib: true do
expect(doc.to_html).to match(/\(<a.+>Reference<\/a>\.\)/)
end
end
describe '#issues_per_Project' do
context 'using an internal issue tracker' do
it 'returns a Hash containing the issues per project' do
doc = Nokogiri::HTML.fragment('')
filter = described_class.new(doc, project: project)
expect(filter).to receive(:projects_per_reference).
and_return({ project.path_with_namespace => project })
expect(filter).to receive(:references_per_project).
and_return({ project.path_with_namespace => Set.new([issue.iid]) })
expect(filter.issues_per_project).
to eq({ project => { issue.iid => issue } })
end
end
context 'using an external issue tracker' do
it 'returns a Hash containing the issues per project' do
doc = Nokogiri::HTML.fragment('')
filter = described_class.new(doc, project: project)
expect(project).to receive(:default_issues_tracker?).and_return(false)
expect(filter).to receive(:projects_per_reference).
and_return({ project.path_with_namespace => project })
expect(filter).to receive(:references_per_project).
and_return({ project.path_with_namespace => Set.new([1]) })
expect(filter.issues_per_project[project][1]).
to be_an_instance_of(ExternalIssue)
end
end
end
end