summaryrefslogtreecommitdiff
path: root/spec/helpers/notes_helper_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/helpers/notes_helper_spec.rb')
-rw-r--r--spec/helpers/notes_helper_spec.rb219
1 files changed, 208 insertions, 11 deletions
diff --git a/spec/helpers/notes_helper_spec.rb b/spec/helpers/notes_helper_spec.rb
index 9c577501f00..099146678ae 100644
--- a/spec/helpers/notes_helper_spec.rb
+++ b/spec/helpers/notes_helper_spec.rb
@@ -1,6 +1,8 @@
require "spec_helper"
describe NotesHelper do
+ include RepoHelpers
+
let(:owner) { create(:owner) }
let(:group) { create(:group) }
let(:project) { create(:empty_project, namespace: group) }
@@ -37,20 +39,215 @@ describe NotesHelper do
end
end
- describe '#preload_max_access_for_authors' do
- before do
- # This method reads cache from RequestStore, so make sure it's clean.
- RequestStore.clear!
+ describe '#discussion_path' do
+ let(:project) { create(:project) }
+
+ context 'for a merge request discusion' do
+ let(:merge_request) { create(:merge_request, source_project: project, target_project: project, importing: true) }
+ let!(:merge_request_diff1) { merge_request.merge_request_diffs.create(head_commit_sha: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9') }
+ let!(:merge_request_diff2) { merge_request.merge_request_diffs.create(head_commit_sha: nil) }
+ let!(:merge_request_diff3) { merge_request.merge_request_diffs.create(head_commit_sha: '5937ac0a7beb003549fc5fd26fc247adbce4a52e') }
+
+ context 'for a diff discussion' do
+ context 'when the discussion is active' do
+ let(:discussion) { create(:diff_note_on_merge_request, noteable: merge_request, project: project).to_discussion }
+
+ it 'returns the diff path with the line code' do
+ expect(helper.discussion_path(discussion)).to eq(diffs_namespace_project_merge_request_path(project.namespace, project, merge_request, anchor: discussion.line_code))
+ end
+ end
+
+ context 'when the discussion is on an older merge request version' do
+ let(:position) do
+ Gitlab::Diff::Position.new(
+ old_path: ".gitmodules",
+ new_path: ".gitmodules",
+ old_line: nil,
+ new_line: 4,
+ diff_refs: merge_request_diff1.diff_refs
+ )
+ end
+
+ let(:diff_note) { create(:diff_note_on_merge_request, noteable: merge_request, project: project, position: position) }
+ let(:discussion) { diff_note.to_discussion }
+
+ before do
+ diff_note.position = diff_note.original_position
+ diff_note.save!
+ end
+
+ it 'returns the diff version path with the line code' do
+ expect(helper.discussion_path(discussion)).to eq(diffs_namespace_project_merge_request_path(project.namespace, project, merge_request, diff_id: merge_request_diff1, anchor: discussion.line_code))
+ end
+ end
+
+ context 'when the discussion is on a comparison between merge request versions' do
+ let(:position) do
+ Gitlab::Diff::Position.new(
+ old_path: ".gitmodules",
+ new_path: ".gitmodules",
+ old_line: 4,
+ new_line: 4,
+ diff_refs: merge_request_diff3.compare_with(merge_request_diff1.head_commit_sha).diff_refs
+ )
+ end
+
+ let(:discussion) { create(:diff_note_on_merge_request, noteable: merge_request, project: project, position: position).to_discussion }
+
+ it 'returns the diff version comparison path with the line code' do
+ expect(helper.discussion_path(discussion)).to eq(diffs_namespace_project_merge_request_path(project.namespace, project, merge_request, diff_id: merge_request_diff3, start_sha: merge_request_diff1.head_commit_sha, anchor: discussion.line_code))
+ end
+ end
+
+ context 'when the discussion does not have a merge request version' do
+ let(:outdated_diff_note) { create(:diff_note_on_merge_request, noteable: merge_request, project: project, diff_refs: project.commit(sample_commit.id).diff_refs) }
+ let(:discussion) { outdated_diff_note.to_discussion }
+
+ before do
+ outdated_diff_note.position = outdated_diff_note.original_position
+ outdated_diff_note.save!
+ end
+
+ it 'returns nil' do
+ expect(helper.discussion_path(discussion)).to be_nil
+ end
+ end
+ end
+
+ context 'for a legacy diff discussion' do
+ let(:discussion) { create(:legacy_diff_note_on_merge_request, noteable: merge_request, project: project).to_discussion }
+
+ context 'when the discussion is active' do
+ before do
+ allow(discussion).to receive(:active?).and_return(true)
+ end
+
+ it 'returns the diff path with the line code' do
+ expect(helper.discussion_path(discussion)).to eq(diffs_namespace_project_merge_request_path(project.namespace, project, merge_request, anchor: discussion.line_code))
+ end
+ end
+
+ context 'when the discussion is outdated' do
+ before do
+ allow(discussion).to receive(:active?).and_return(false)
+ end
+
+ it 'returns nil' do
+ expect(helper.discussion_path(discussion)).to be_nil
+ end
+ end
+ end
+
+ context 'for a non-diff discussion' do
+ let(:discussion) { create(:discussion_note_on_merge_request, noteable: merge_request, project: project).to_discussion }
+
+ it 'returns nil' do
+ expect(helper.discussion_path(discussion)).to be_nil
+ end
+ end
+ end
+
+ context 'for a commit discussion' do
+ let(:commit) { discussion.noteable }
+
+ context 'for a diff discussion' do
+ let(:discussion) { create(:diff_note_on_commit, project: project).to_discussion }
+
+ it 'returns the commit path with the line code' do
+ expect(helper.discussion_path(discussion)).to eq(namespace_project_commit_path(project.namespace, project, commit, anchor: discussion.line_code))
+ end
+ end
+
+ context 'for a legacy diff discussion' do
+ let(:discussion) { create(:legacy_diff_note_on_commit, project: project).to_discussion }
+
+ it 'returns the commit path with the line code' do
+ expect(helper.discussion_path(discussion)).to eq(namespace_project_commit_path(project.namespace, project, commit, anchor: discussion.line_code))
+ end
+ end
+
+ context 'for a non-diff discussion' do
+ let(:discussion) { create(:discussion_note_on_commit, project: project).to_discussion }
+
+ it 'returns the commit path' do
+ expect(helper.discussion_path(discussion)).to eq(namespace_project_commit_path(project.namespace, project, commit))
+ end
+ end
+ end
+ end
+
+ describe '#notes_url' do
+ it 'return snippet notes path for personal snippet' do
+ @snippet = create(:personal_snippet)
+
+ expect(helper.notes_url).to eq("/snippets/#{@snippet.id}/notes")
+ end
+
+ it 'return project notes path for project snippet' do
+ namespace = create(:namespace, path: 'nm')
+ @project = create(:empty_project, path: 'test', namespace: namespace)
+ @snippet = create(:project_snippet, project: @project)
+ @noteable = @snippet
+
+ expect(helper.notes_url).to eq("/nm/test/noteable/project_snippet/#{@noteable.id}/notes")
+ end
+
+ it 'return project notes path for other noteables' do
+ namespace = create(:namespace, path: 'nm')
+ @project = create(:empty_project, path: 'test', namespace: namespace)
+ @noteable = create(:issue, project: @project)
+
+ expect(helper.notes_url).to eq("/nm/test/noteable/issue/#{@noteable.id}/notes")
+ end
+ end
+
+ describe '#note_url' do
+ it 'return snippet notes path for personal snippet' do
+ note = create(:note_on_personal_snippet)
+
+ expect(helper.note_url(note)).to eq("/snippets/#{note.noteable.id}/notes/#{note.id}")
+ end
+
+ it 'return project notes path for project snippet' do
+ namespace = create(:namespace, path: 'nm')
+ @project = create(:empty_project, path: 'test', namespace: namespace)
+ note = create(:note_on_project_snippet, project: @project)
+
+ expect(helper.note_url(note)).to eq("/nm/test/notes/#{note.id}")
+ end
+
+ it 'return project notes path for other noteables' do
+ namespace = create(:namespace, path: 'nm')
+ @project = create(:empty_project, path: 'test', namespace: namespace)
+ note = create(:note_on_issue, project: @project)
+
+ expect(helper.note_url(note)).to eq("/nm/test/notes/#{note.id}")
+ end
+ end
+
+ describe '#form_resurces' do
+ it 'returns note for personal snippet' do
+ @snippet = create(:personal_snippet)
+ @note = create(:note_on_personal_snippet)
+
+ expect(helper.form_resources).to eq([@note])
+ end
+
+ it 'returns namespace, project and note for project snippet' do
+ namespace = create(:namespace, path: 'nm')
+ @project = create(:empty_project, path: 'test', namespace: namespace)
+ @snippet = create(:project_snippet, project: @project)
+ @note = create(:note_on_personal_snippet)
+
+ expect(helper.form_resources).to eq([@project.namespace, @project, @note])
end
- it 'loads multiple users' do
- expected_access = {
- owner.id => Gitlab::Access::OWNER,
- master.id => Gitlab::Access::MASTER,
- reporter.id => Gitlab::Access::REPORTER
- }
+ it 'returns namespace, project and note path for other noteables' do
+ namespace = create(:namespace, path: 'nm')
+ @project = create(:empty_project, path: 'test', namespace: namespace)
+ @note = create(:note_on_issue, project: @project)
- expect(helper.preload_max_access_for_authors(notes, project)).to eq(expected_access)
+ expect(helper.form_resources).to eq([@project.namespace, @project, @note])
end
end
end