Merge branch '31978-cross-reference-fix' into 'master'

Fix cross referencing for private and internal projects

Closes #31978

See merge request !11243
This commit is contained in:
Sean McGivern 2017-05-12 10:25:49 +00:00
commit cc9a413dcc
3 changed files with 88 additions and 6 deletions

View file

@ -44,14 +44,15 @@ module Mentionable
end
def all_references(current_user = nil, extractor: nil)
@extractors ||= {}
# Use custom extractor if it's passed in the function parameters.
if extractor
@extractor = extractor
@extractors[current_user] = extractor
else
@extractor ||= Gitlab::ReferenceExtractor.
new(project, current_user)
extractor = @extractors[current_user] ||= Gitlab::ReferenceExtractor.new(project, current_user)
@extractor.reset_memoized_values
extractor.reset_memoized_values
end
self.class.mentionable_attrs.each do |attr, options|
@ -62,10 +63,10 @@ module Mentionable
skip_project_check: skip_project_check?
)
@extractor.analyze(text, options)
extractor.analyze(text, options)
end
@extractor
extractor
end
def mentioned_users(current_user = nil)

View file

@ -0,0 +1,4 @@
---
title: Fix cross referencing for private and internal projects
merge_request: 11243
author:

View file

@ -0,0 +1,77 @@
require 'spec_helper'
describe 'Create notes on issues', :js, :feature do
let(:user) { create(:user) }
shared_examples 'notes with reference' do
let(:issue) { create(:issue, project: project) }
let(:note_text) { "Check #{mention.to_reference}" }
before do
project.team << [user, :developer]
login_as(user)
visit namespace_project_issue_path(project.namespace, project, issue)
fill_in 'note[note]', with: note_text
click_button 'Comment'
wait_for_ajax
end
it 'creates a note with reference and cross references the issue' do
page.within('div#notes li.note div.note-text') do
expect(page).to have_content(note_text)
expect(page.find('a')).to have_content(mention.to_reference)
end
find('div#notes li.note div.note-text a').click
page.within('div#notes li.note .system-note-message') do
expect(page).to have_content('mentioned in issue')
expect(page.find('a')).to have_content(issue.to_reference)
end
end
end
context 'mentioning issue on a private project' do
it_behaves_like 'notes with reference' do
let(:project) { create(:project, :private) }
let(:mention) { create(:issue, project: project) }
end
end
context 'mentioning issue on an internal project' do
it_behaves_like 'notes with reference' do
let(:project) { create(:project, :internal) }
let(:mention) { create(:issue, project: project) }
end
end
context 'mentioning issue on a public project' do
it_behaves_like 'notes with reference' do
let(:project) { create(:project, :public) }
let(:mention) { create(:issue, project: project) }
end
end
context 'mentioning merge request on a private project' do
it_behaves_like 'notes with reference' do
let(:project) { create(:project, :private) }
let(:mention) { create(:merge_request, source_project: project) }
end
end
context 'mentioning merge request on an internal project' do
it_behaves_like 'notes with reference' do
let(:project) { create(:project, :internal) }
let(:mention) { create(:merge_request, source_project: project) }
end
end
context 'mentioning merge request on a public project' do
it_behaves_like 'notes with reference' do
let(:project) { create(:project, :public) }
let(:mention) { create(:merge_request, source_project: project) }
end
end
end