Commit 04233dce authored by Stan Hu's avatar Stan Hu

Merge branch '38244-fix-release-filter-on-mr-page' into 'master'

Resolve "Merge request search: "release tag" filter not working"

Closes #38244

See merge request gitlab-org/gitlab!21236
parents f67506e5 77a3bee3
...@@ -128,7 +128,7 @@ module Issuable ...@@ -128,7 +128,7 @@ module Issuable
end end
scope :joins_milestone_releases, -> do scope :joins_milestone_releases, -> do
joins("JOIN milestone_releases ON issues.milestone_id = milestone_releases.milestone_id joins("JOIN milestone_releases ON #{table_name}.milestone_id = milestone_releases.milestone_id
JOIN releases ON milestone_releases.release_id = releases.id").distinct JOIN releases ON milestone_releases.release_id = releases.id").distinct
end end
......
---
title: Fixed query behind release filter on merge request search page.
merge_request: 38244
author:
type: fixed
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
require 'spec_helper' require 'spec_helper'
describe Issuable do describe Issuable do
include ProjectForksHelper
let(:issuable_class) { Issue } let(:issuable_class) { Issue }
let(:issue) { create(:issue, title: 'An issue', description: 'A description') } let(:issue) { create(:issue, title: 'An issue', description: 'A description') }
let(:user) { create(:user) } let(:user) { create(:user) }
...@@ -855,6 +857,7 @@ describe Issuable do ...@@ -855,6 +857,7 @@ describe Issuable do
describe 'release scopes' do describe 'release scopes' do
let_it_be(:project) { create(:project) } let_it_be(:project) { create(:project) }
let(:forked_project) { fork_project(project) }
let_it_be(:release_1) { create(:release, tag: 'v1.0', project: project) } let_it_be(:release_1) { create(:release, tag: 'v1.0', project: project) }
let_it_be(:release_2) { create(:release, tag: 'v2.0', project: project) } let_it_be(:release_2) { create(:release, tag: 'v2.0', project: project) }
...@@ -875,52 +878,65 @@ describe Issuable do ...@@ -875,52 +878,65 @@ describe Issuable do
let_it_be(:issue_5) { create(:issue, milestone: milestone_6, project: project) } let_it_be(:issue_5) { create(:issue, milestone: milestone_6, project: project) }
let_it_be(:issue_6) { create(:issue, project: project) } let_it_be(:issue_6) { create(:issue, project: project) }
let_it_be(:items) { Issue.all } let(:mr_1) { create(:merge_request, milestone: milestone_1, target_project: project, source_project: project) }
let(:mr_2) { create(:merge_request, milestone: milestone_3, target_project: project, source_project: forked_project) }
let(:mr_3) { create(:merge_request, source_project: project) }
let_it_be(:issue_items) { Issue.all }
let(:mr_items) { MergeRequest.all }
describe '#without_release' do describe '#without_release' do
it 'returns the issues not tied to any milestone and the ones tied to milestone with no release' do it 'returns the issues or mrs not tied to any milestone and the ones tied to milestone with no release' do
expect(items.without_release).to contain_exactly(issue_5, issue_6) expect(issue_items.without_release).to contain_exactly(issue_5, issue_6)
expect(mr_items.without_release).to contain_exactly(mr_3)
end end
end end
describe '#any_release' do describe '#any_release' do
it 'returns all issues tied to a release' do it 'returns all issues or all mrs tied to a release' do
expect(items.any_release).to contain_exactly(issue_1, issue_2, issue_3, issue_4) expect(issue_items.any_release).to contain_exactly(issue_1, issue_2, issue_3, issue_4)
expect(mr_items.any_release).to contain_exactly(mr_1, mr_2)
end end
end end
describe '#with_release' do describe '#with_release' do
it 'returns the issues tied a specfic release' do it 'returns the issues tied to a specfic release' do
expect(items.with_release('v1.0', project.id)).to contain_exactly(issue_1, issue_2, issue_3) expect(issue_items.with_release('v1.0', project.id)).to contain_exactly(issue_1, issue_2, issue_3)
end
it 'returns the mrs tied to a specific release' do
expect(mr_items.with_release('v1.0', project.id)).to contain_exactly(mr_1)
end end
context 'when a release has a milestone with one issue and another one with no issue' do context 'when a release has a milestone with one issue and another one with no issue' do
it 'returns that one issue' do it 'returns that one issue' do
expect(items.with_release('v2.0', project.id)).to contain_exactly(issue_3) expect(issue_items.with_release('v2.0', project.id)).to contain_exactly(issue_3)
end end
context 'when the milestone with no issue is added as a filter' do context 'when the milestone with no issue is added as a filter' do
it 'returns an empty list' do it 'returns an empty list' do
expect(items.with_release('v2.0', project.id).with_milestone('m3')).to be_empty expect(issue_items.with_release('v2.0', project.id).with_milestone('m3')).to be_empty
end end
end end
context 'when the milestone with the issue is added as a filter' do context 'when the milestone with the issue is added as a filter' do
it 'returns this issue' do it 'returns this issue' do
expect(items.with_release('v2.0', project.id).with_milestone('m2')).to contain_exactly(issue_3) expect(issue_items.with_release('v2.0', project.id).with_milestone('m2')).to contain_exactly(issue_3)
end end
end end
end end
context 'when there is no issue under a specific release' do context 'when there is no issue or mr under a specific release' do
it 'returns no issue' do it 'returns no issue or no mr' do
expect(items.with_release('v4.0', project.id)).to be_empty expect(issue_items.with_release('v4.0', project.id)).to be_empty
expect(mr_items.with_release('v4.0', project.id)).to be_empty
end end
end end
context 'when a non-existent release tag is passed in' do context 'when a non-existent release tag is passed in' do
it 'returns no issue' do it 'returns no issue or no mr' do
expect(items.with_release('v999.0', project.id)).to be_empty expect(issue_items.with_release('v999.0', project.id)).to be_empty
expect(mr_items.with_release('v999.0', project.id)).to be_empty
end end
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment