summaryrefslogtreecommitdiff
path: root/spec/features/merge_request/batch_comments_spec.rb
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-06-18 11:18:50 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-06-18 11:18:50 +0000
commit8c7f4e9d5f36cff46365a7f8c4b9c21578c1e781 (patch)
treea77e7fe7a93de11213032ed4ab1f33a3db51b738 /spec/features/merge_request/batch_comments_spec.rb
parent00b35af3db1abfe813a778f643dad221aad51fca (diff)
downloadgitlab-ce-8c7f4e9d5f36cff46365a7f8c4b9c21578c1e781.tar.gz
Add latest changes from gitlab-org/gitlab@13-1-stable-ee
Diffstat (limited to 'spec/features/merge_request/batch_comments_spec.rb')
-rw-r--r--spec/features/merge_request/batch_comments_spec.rb259
1 files changed, 259 insertions, 0 deletions
diff --git a/spec/features/merge_request/batch_comments_spec.rb b/spec/features/merge_request/batch_comments_spec.rb
new file mode 100644
index 00000000000..60671213d75
--- /dev/null
+++ b/spec/features/merge_request/batch_comments_spec.rb
@@ -0,0 +1,259 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Merge request > Batch comments', :js do
+ include MergeRequestDiffHelpers
+ include RepoHelpers
+
+ let(:user) { create(:user) }
+ let(:project) { create(:project, :repository) }
+ let(:merge_request) do
+ create(:merge_request_with_diffs, source_project: project, target_project: project, source_branch: 'merge-test')
+ end
+
+ before do
+ project.add_maintainer(user)
+
+ sign_in(user)
+ end
+
+ context 'Feature is enabled' do
+ before do
+ stub_feature_flags(diffs_batch_load: false)
+
+ visit_diffs
+ end
+
+ it 'has review bar' do
+ expect(page).to have_css('.review-bar-component', visible: false)
+ end
+
+ it 'adds draft note' do
+ write_comment
+
+ expect(find('.draft-note-component')).to have_content('Line is wrong')
+
+ expect(page).to have_css('.review-bar-component')
+
+ expect(find('.review-bar-content .btn-success')).to have_content('1')
+ end
+
+ it 'publishes review' do
+ write_comment
+
+ page.within('.review-bar-content') do
+ click_button 'Finish review'
+ click_button 'Submit review'
+ end
+
+ wait_for_requests
+
+ expect(page).not_to have_selector('.draft-note-component', text: 'Line is wrong')
+
+ expect(page).to have_selector('.note:not(.draft-note)', text: 'Line is wrong')
+ end
+
+ it 'publishes single comment' do
+ write_comment
+
+ click_button 'Add comment now'
+
+ wait_for_requests
+
+ expect(page).not_to have_selector('.draft-note-component', text: 'Line is wrong')
+
+ expect(page).to have_selector('.note:not(.draft-note)', text: 'Line is wrong')
+ end
+
+ it 'discards review' do
+ write_comment
+
+ click_button 'Discard review'
+
+ click_button 'Delete all pending comments'
+
+ wait_for_requests
+
+ expect(page).not_to have_selector('.draft-note-component')
+ end
+
+ it 'deletes draft note' do
+ write_comment
+
+ accept_alert { find('.js-note-delete').click }
+
+ wait_for_requests
+
+ expect(page).not_to have_selector('.draft-note-component', text: 'Line is wrong')
+ end
+
+ it 'edits draft note' do
+ write_comment
+
+ find('.js-note-edit').click
+
+ # make sure comment form is in view
+ execute_script("window.scrollBy(0, 200)")
+
+ page.within('.js-discussion-note-form') do
+ fill_in('note_note', with: 'Testing update')
+ click_button('Save comment')
+ end
+
+ wait_for_requests
+
+ expect(page).to have_selector('.draft-note-component', text: 'Testing update')
+ end
+
+ context 'in parallel diff' do
+ before do
+ find('.js-show-diff-settings').click
+ click_button 'Side-by-side'
+ end
+
+ it 'adds draft comments to both sides' do
+ write_parallel_comment('2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9')
+
+ # make sure line 9 is in the view
+ execute_script("window.scrollBy(0, -200)")
+
+ write_parallel_comment('2f6fcd96b88b36ce98c38da085c795a27d92a3dd_9_9', button_text: 'Add to review', text: 'Another wrong line')
+
+ expect(find('.new .draft-note-component')).to have_content('Line is wrong')
+ expect(find('.old .draft-note-component')).to have_content('Another wrong line')
+
+ expect(find('.review-bar-content .btn-success')).to have_content('2')
+ end
+ end
+
+ context 'thread is unresolved' do
+ let!(:active_discussion) { create(:diff_note_on_merge_request, noteable: merge_request, project: project).to_discussion }
+
+ before do
+ visit_diffs
+ end
+
+ it 'publishes comment right away and resolves the thread' do
+ expect(active_discussion.resolved?).to eq(false)
+
+ write_reply_to_discussion(button_text: 'Add comment now', resolve: true)
+
+ page.within '.line-resolve-all-container' do
+ expect(page).to have_content('All threads resolved')
+ expect(page).to have_selector('.line-resolve-btn.is-active')
+ end
+ end
+
+ it 'publishes review and resolves the thread' do
+ expect(active_discussion.resolved?).to eq(false)
+
+ write_reply_to_discussion(resolve: true)
+
+ page.within('.review-bar-content') do
+ click_button 'Finish review'
+ click_button 'Submit review'
+ end
+
+ wait_for_requests
+
+ page.within '.line-resolve-all-container' do
+ expect(page).to have_content('All threads resolved')
+ expect(page).to have_selector('.line-resolve-btn.is-active')
+ end
+ end
+ end
+
+ context 'thread is resolved' do
+ let!(:active_discussion) { create(:diff_note_on_merge_request, :resolved, noteable: merge_request, project: project).to_discussion }
+
+ before do
+ active_discussion.resolve!(@current_user)
+
+ visit_diffs
+
+ page.find('.js-diff-comment-avatar').click
+ end
+
+ it 'publishes comment right away and unresolves the thread' do
+ expect(active_discussion.resolved?).to eq(true)
+
+ write_reply_to_discussion(button_text: 'Add comment now', unresolve: true)
+
+ page.within '.line-resolve-all-container' do
+ expect(page).to have_content('1 unresolved thread')
+ expect(page).not_to have_selector('.line-resolve-btn.is-active')
+ end
+ end
+
+ it 'publishes review and unresolves the thread' do
+ expect(active_discussion.resolved?).to eq(true)
+
+ wait_for_requests
+
+ write_reply_to_discussion(button_text: 'Start a review', unresolve: true)
+
+ page.within('.review-bar-content') do
+ click_button 'Finish review'
+ click_button 'Submit review'
+ end
+
+ wait_for_requests
+
+ page.within '.line-resolve-all-container' do
+ expect(page).to have_content('1 unresolved thread')
+ expect(page).not_to have_selector('.line-resolve-btn.is-active')
+ end
+ end
+ end
+ end
+
+ def visit_diffs
+ visit diffs_project_merge_request_path(merge_request.project, merge_request)
+
+ wait_for_requests
+ end
+
+ def write_comment(button_text: 'Start a review', text: 'Line is wrong')
+ click_diff_line(find("[id='#{sample_compare.changes[0][:line_code]}']"))
+
+ page.within('.js-discussion-note-form') do
+ fill_in('note_note', with: text)
+ click_button(button_text)
+ end
+
+ wait_for_requests
+ end
+
+ def write_parallel_comment(line, button_text: 'Start a review', text: 'Line is wrong')
+ find("td[id='#{line}']").hover
+ find(".is-over button").click
+
+ page.within("form[data-line-code='#{line}']") do
+ fill_in('note_note', with: text)
+ click_button(button_text)
+ end
+
+ wait_for_requests
+ end
+end
+
+def write_reply_to_discussion(button_text: 'Start a review', text: 'Line is wrong', resolve: false, unresolve: false)
+ page.within(first('.diff-files-holder .discussion-reply-holder')) do
+ click_button('Reply...')
+
+ fill_in('note_note', with: text)
+
+ if resolve
+ page.check('Resolve thread')
+ end
+
+ if unresolve
+ page.check('Unresolve thread')
+ end
+
+ click_button(button_text)
+ end
+
+ wait_for_requests
+end