diff --git a/lib/banzai/filter/references/merge_request_reference_filter.rb b/lib/banzai/filter/references/merge_request_reference_filter.rb index 6c5ad83d9ae810009d1ef9a6c69ef07e68389219..5f505beb0ca6301b8cf4e815b57dc31de2f91437 100644 --- a/lib/banzai/filter/references/merge_request_reference_filter.rb +++ b/lib/banzai/filter/references/merge_request_reference_filter.rb @@ -48,8 +48,12 @@ def object_link_text_extras(object, matches) end def parent_records(parent, ids) + return MergeRequest.none if ids.empty? + + mr_id_list = ids.uniq.map { |id| "(#{Integer(id)})" }.join(',') + parent.merge_requests - .where(iid: ids.to_a) + .joins("INNER JOIN (VALUES #{mr_id_list}) mr_ids (id) ON (mr_ids.id = #{MergeRequest.table_name}.iid)") .includes(target_project: :namespace) end diff --git a/spec/lib/banzai/filter/references/merge_request_reference_filter_spec.rb b/spec/lib/banzai/filter/references/merge_request_reference_filter_spec.rb index ee2ce967a47e9d84960528d63f5fd4858286076d..cd2e7d381eaeb88a484861a9f3a16a9c7424b0f0 100644 --- a/spec/lib/banzai/filter/references/merge_request_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/references/merge_request_reference_filter_spec.rb @@ -297,4 +297,24 @@ expect(result.css('a').first.attr('href')).to eq(urls.project_merge_request_url(project, merge)) end end + + describe '#parent_records' do + subject { filter_instance.parent_records(project, ids) } + + let(:ids) { [merge.iid, another_merge.iid, unrelated_merge.iid, non_existing_record_id] } + let(:another_merge) { create(:merge_request, source_project: project, source_branch: 'another') } + let(:unrelated_merge) { create(:merge_request) } + let(:input_text) { '' } + let(:current_user) { create(:user) } + + it 'returns only merge requests for the project' do + is_expected.to match_array([merge, another_merge]) + end + + context 'without merge request references' do + let(:ids) { [] } + + it { is_expected.to be_empty } + end + end end