diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-06-18 11:18:50 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-06-18 11:18:50 +0000 |
commit | 8c7f4e9d5f36cff46365a7f8c4b9c21578c1e781 (patch) | |
tree | a77e7fe7a93de11213032ed4ab1f33a3db51b738 /spec/features/merge_request/batch_comments_spec.rb | |
parent | 00b35af3db1abfe813a778f643dad221aad51fca (diff) | |
download | gitlab-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.rb | 259 |
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 |