Commit f2da2df4 authored by Sean McGivern's avatar Sean McGivern

Merge branch '31280-skip-issueables-without-project' into 'master'

Skip issuable without a project in IssuableExtractor#extract

Closes #31280

See merge request !10906
parents 8c22045e 68fa16a5
---
title: Fix 500 error due to trying to show issues from pending deleting projects
merge_request: 10906
author:
...@@ -28,9 +28,13 @@ module Banzai ...@@ -28,9 +28,13 @@ module Banzai
issue_parser = Banzai::ReferenceParser::IssueParser.new(project, user) issue_parser = Banzai::ReferenceParser::IssueParser.new(project, user)
merge_request_parser = Banzai::ReferenceParser::MergeRequestParser.new(project, user) merge_request_parser = Banzai::ReferenceParser::MergeRequestParser.new(project, user)
issue_parser.issues_for_nodes(nodes).merge( issuables_for_nodes = issue_parser.issues_for_nodes(nodes).merge(
merge_request_parser.merge_requests_for_nodes(nodes) merge_request_parser.merge_requests_for_nodes(nodes)
) )
# The project for the issue/MR might be pending for deletion!
# Filter them out because we don't care about them.
issuables_for_nodes.select { |node, issuable| issuable.project }
end end
end end
end end
...@@ -8,6 +8,10 @@ FactoryGirl.define do ...@@ -8,6 +8,10 @@ FactoryGirl.define do
confidential true confidential true
end end
trait :opened do
state :opened
end
trait :closed do trait :closed do
state :closed state :closed
end end
......
...@@ -6,11 +6,23 @@ describe Banzai::Filter::IssuableStateFilter, lib: true do ...@@ -6,11 +6,23 @@ describe Banzai::Filter::IssuableStateFilter, lib: true do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:context) { { current_user: user, issuable_state_filter_enabled: true } } let(:context) { { current_user: user, issuable_state_filter_enabled: true } }
let(:closed_issue) { create_issue(:closed) }
let(:project) { create(:empty_project, :public) }
let(:other_project) { create(:empty_project, :public) }
def create_link(text, data) def create_link(text, data)
link_to(text, '', class: 'gfm has-tooltip', data: data) link_to(text, '', class: 'gfm has-tooltip', data: data)
end end
def create_issue(state)
create(:issue, state, project: project)
end
def create_merge_request(state)
create(:merge_request, state,
source_project: project, target_project: project)
end
it 'ignores non-GFM links' do it 'ignores non-GFM links' do
html = %(See <a href="https://google.com/">Google</a>) html = %(See <a href="https://google.com/">Google</a>)
doc = filter(html, current_user: user) doc = filter(html, current_user: user)
...@@ -19,7 +31,6 @@ describe Banzai::Filter::IssuableStateFilter, lib: true do ...@@ -19,7 +31,6 @@ describe Banzai::Filter::IssuableStateFilter, lib: true do
end end
it 'ignores non-issuable links' do it 'ignores non-issuable links' do
project = create(:empty_project, :public)
link = create_link('text', project: project, reference_type: 'issue') link = create_link('text', project: project, reference_type: 'issue')
doc = filter(link, context) doc = filter(link, context)
...@@ -27,27 +38,24 @@ describe Banzai::Filter::IssuableStateFilter, lib: true do ...@@ -27,27 +38,24 @@ describe Banzai::Filter::IssuableStateFilter, lib: true do
end end
it 'ignores issuable links with empty content' do it 'ignores issuable links with empty content' do
issue = create(:issue, :closed) link = create_link('', issue: closed_issue.id, reference_type: 'issue')
link = create_link('', issue: issue.id, reference_type: 'issue')
doc = filter(link, context) doc = filter(link, context)
expect(doc.css('a').last.text).to eq('') expect(doc.css('a').last.text).to eq('')
end end
it 'ignores issuable links with custom anchor' do it 'ignores issuable links with custom anchor' do
issue = create(:issue, :closed) link = create_link('something', issue: closed_issue.id, reference_type: 'issue')
link = create_link('something', issue: issue.id, reference_type: 'issue')
doc = filter(link, context) doc = filter(link, context)
expect(doc.css('a').last.text).to eq('something') expect(doc.css('a').last.text).to eq('something')
end end
it 'ignores issuable links to specific comments' do it 'ignores issuable links to specific comments' do
issue = create(:issue, :closed) link = create_link("#{closed_issue.to_reference} (comment 1)", issue: closed_issue.id, reference_type: 'issue')
link = create_link("#{issue.to_reference} (comment 1)", issue: issue.id, reference_type: 'issue')
doc = filter(link, context) doc = filter(link, context)
expect(doc.css('a').last.text).to eq("#{issue.to_reference} (comment 1)") expect(doc.css('a').last.text).to eq("#{closed_issue.to_reference} (comment 1)")
end end
it 'ignores merge request links to diffs tab' do it 'ignores merge request links to diffs tab' do
...@@ -63,26 +71,36 @@ describe Banzai::Filter::IssuableStateFilter, lib: true do ...@@ -63,26 +71,36 @@ describe Banzai::Filter::IssuableStateFilter, lib: true do
end end
it 'handles cross project references' do it 'handles cross project references' do
issue = create(:issue, :closed) link = create_link(closed_issue.to_reference(other_project), issue: closed_issue.id, reference_type: 'issue')
project = create(:empty_project) doc = filter(link, context.merge(project: other_project))
link = create_link(issue.to_reference(project), issue: issue.id, reference_type: 'issue')
doc = filter(link, context.merge(project: project))
expect(doc.css('a').last.text).to eq("#{issue.to_reference(project)} (closed)") expect(doc.css('a').last.text).to eq("#{closed_issue.to_reference(other_project)} (closed)")
end end
it 'does not append state when filter is not enabled' do it 'does not append state when filter is not enabled' do
issue = create(:issue, :closed) link = create_link('text', issue: closed_issue.id, reference_type: 'issue')
link = create_link('text', issue: issue.id, reference_type: 'issue')
context = { current_user: user } context = { current_user: user }
doc = filter(link, context) doc = filter(link, context)
expect(doc.css('a').last.text).to eq('text') expect(doc.css('a').last.text).to eq('text')
end end
context 'when project is in pending delete' do
before do
project.update!(pending_delete: true)
end
it 'does not append issue state' do
link = create_link('text', issue: closed_issue.id, reference_type: 'issue')
doc = filter(link, context)
expect(doc.css('a').last.text).to eq('text')
end
end
context 'for issue references' do context 'for issue references' do
it 'ignores open issue references' do it 'ignores open issue references' do
issue = create(:issue) issue = create_issue(:opened)
link = create_link(issue.to_reference, issue: issue.id, reference_type: 'issue') link = create_link(issue.to_reference, issue: issue.id, reference_type: 'issue')
doc = filter(link, context) doc = filter(link, context)
...@@ -90,7 +108,7 @@ describe Banzai::Filter::IssuableStateFilter, lib: true do ...@@ -90,7 +108,7 @@ describe Banzai::Filter::IssuableStateFilter, lib: true do
end end
it 'ignores reopened issue references' do it 'ignores reopened issue references' do
issue = create(:issue, :reopened) issue = create_issue(:reopened)
link = create_link(issue.to_reference, issue: issue.id, reference_type: 'issue') link = create_link(issue.to_reference, issue: issue.id, reference_type: 'issue')
doc = filter(link, context) doc = filter(link, context)
...@@ -98,70 +116,79 @@ describe Banzai::Filter::IssuableStateFilter, lib: true do ...@@ -98,70 +116,79 @@ describe Banzai::Filter::IssuableStateFilter, lib: true do
end end
it 'appends state to closed issue references' do it 'appends state to closed issue references' do
issue = create(:issue, :closed) link = create_link(closed_issue.to_reference, issue: closed_issue.id, reference_type: 'issue')
link = create_link(issue.to_reference, issue: issue.id, reference_type: 'issue')
doc = filter(link, context) doc = filter(link, context)
expect(doc.css('a').last.text).to eq("#{issue.to_reference} (closed)") expect(doc.css('a').last.text).to eq("#{closed_issue.to_reference} (closed)")
end end
end end
context 'for merge request references' do context 'for merge request references' do
it 'ignores open merge request references' do it 'ignores open merge request references' do
merge_request = create(:merge_request) merge_request = create_merge_request(:opened)
link = create_link( link = create_link(
merge_request.to_reference, merge_request.to_reference,
merge_request: merge_request.id, merge_request: merge_request.id,
reference_type: 'merge_request' reference_type: 'merge_request'
) )
doc = filter(link, context) doc = filter(link, context)
expect(doc.css('a').last.text).to eq(merge_request.to_reference) expect(doc.css('a').last.text).to eq(merge_request.to_reference)
end end
it 'ignores reopened merge request references' do it 'ignores reopened merge request references' do
merge_request = create(:merge_request, :reopened) merge_request = create_merge_request(:reopened)
link = create_link( link = create_link(
merge_request.to_reference, merge_request.to_reference,
merge_request: merge_request.id, merge_request: merge_request.id,
reference_type: 'merge_request' reference_type: 'merge_request'
) )
doc = filter(link, context) doc = filter(link, context)
expect(doc.css('a').last.text).to eq(merge_request.to_reference) expect(doc.css('a').last.text).to eq(merge_request.to_reference)
end end
it 'ignores locked merge request references' do it 'ignores locked merge request references' do
merge_request = create(:merge_request, :locked) merge_request = create_merge_request(:locked)
link = create_link( link = create_link(
merge_request.to_reference, merge_request.to_reference,
merge_request: merge_request.id, merge_request: merge_request.id,
reference_type: 'merge_request' reference_type: 'merge_request'
) )
doc = filter(link, context) doc = filter(link, context)
expect(doc.css('a').last.text).to eq(merge_request.to_reference) expect(doc.css('a').last.text).to eq(merge_request.to_reference)
end end
it 'appends state to closed merge request references' do it 'appends state to closed merge request references' do
merge_request = create(:merge_request, :closed) merge_request = create_merge_request(:closed)
link = create_link( link = create_link(
merge_request.to_reference, merge_request.to_reference,
merge_request: merge_request.id, merge_request: merge_request.id,
reference_type: 'merge_request' reference_type: 'merge_request'
) )
doc = filter(link, context) doc = filter(link, context)
expect(doc.css('a').last.text).to eq("#{merge_request.to_reference} (closed)") expect(doc.css('a').last.text).to eq("#{merge_request.to_reference} (closed)")
end end
it 'appends state to merged merge request references' do it 'appends state to merged merge request references' do
merge_request = create(:merge_request, :merged) merge_request = create_merge_request(:merged)
link = create_link( link = create_link(
merge_request.to_reference, merge_request.to_reference,
merge_request: merge_request.id, merge_request: merge_request.id,
reference_type: 'merge_request' reference_type: 'merge_request'
) )
doc = filter(link, context) doc = filter(link, context)
expect(doc.css('a').last.text).to eq("#{merge_request.to_reference} (merged)") expect(doc.css('a').last.text).to eq("#{merge_request.to_reference} (merged)")
......
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