diff options
Diffstat (limited to 'spec/features/merge_request/user_sees_discussions_navigation_spec.rb')
-rw-r--r-- | spec/features/merge_request/user_sees_discussions_navigation_spec.rb | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/spec/features/merge_request/user_sees_discussions_navigation_spec.rb b/spec/features/merge_request/user_sees_discussions_navigation_spec.rb new file mode 100644 index 00000000000..9fbe7662fc0 --- /dev/null +++ b/spec/features/merge_request/user_sees_discussions_navigation_spec.rb @@ -0,0 +1,222 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Merge request > User sees discussions navigation', :js do + let_it_be(:project) { create(:project, :public, :repository) } + let_it_be(:user) { project.creator } + let_it_be(:merge_request) { create(:merge_request, source_project: project) } + + before do + # FIXME: before removing this please fix discussions navigation with this flag enabled + stub_feature_flags(moved_mr_sidebar: false) + project.add_maintainer(user) + sign_in(user) + end + + describe 'Code discussions' do + let!(:position) do + build(:text_diff_position, :added, + file: "files/images/wm.svg", + new_line: 1, + diff_refs: merge_request.diff_refs + ) + end + + let!(:first_discussion) do + create(:diff_note_on_merge_request, + noteable: merge_request, + project: project, + position: position + ).to_discussion + end + + let!(:second_discussion) do + create(:diff_note_on_merge_request, + noteable: merge_request, + project: project, + position: position + ).to_discussion + end + + let(:first_discussion_selector) { ".discussion[data-discussion-id='#{first_discussion.id}']" } + let(:second_discussion_selector) { ".discussion[data-discussion-id='#{second_discussion.id}']" } + + shared_examples 'a page with a thread navigation' do + context 'with active threads' do + it 'navigates to the first thread' do + goto_next_thread + expect(page).to have_selector(first_discussion_selector, obscured: false) + end + + it 'navigates to the last thread' do + goto_previous_thread + expect(page).to have_selector(second_discussion_selector, obscured: false) + end + + it 'navigates through active threads' do + goto_next_thread + goto_next_thread + expect(page).to have_selector(second_discussion_selector, obscured: false) + end + + it 'cycles back to the first thread' do + goto_next_thread + goto_next_thread + goto_next_thread + expect(page).to have_selector(first_discussion_selector, obscured: false) + end + + it 'cycles back to the last thread' do + goto_previous_thread + goto_previous_thread + goto_previous_thread + expect(page).to have_selector(second_discussion_selector, obscured: false) + end + end + + context 'with resolved threads' do + let!(:resolved_discussion) do + create(:diff_note_on_merge_request, + noteable: merge_request, + project: project, + position: position + ).to_discussion + end + + let(:resolved_discussion_selector) { ".discussion[data-discussion-id='#{resolved_discussion.id}']" } + + before do + # :resolved attr doesn't actually resolve the thread but just collapses it + page.within(resolved_discussion_selector) do + click_button text: 'Resolve thread' + end + page.execute_script("window.scrollTo(0,0)") + end + + it 'excludes resolved threads during navigation' do + goto_next_thread + goto_next_thread + goto_next_thread + expect(page).to have_selector(first_discussion_selector, obscured: false) + end + end + end + + describe "Overview page discussions navigation" do + before do + visit project_merge_request_path(project, merge_request) + end + + it_behaves_like 'a page with a thread navigation' + + context 'with collapsed threads' do + before do + page.within(first_discussion_selector) do + click_button 'Hide thread' + end + end + + it 'expands threads during navigation' do + goto_next_thread + expect(page).to have_selector "#note_#{first_discussion.first_note.id}" + end + end + end + + describe "Changes page discussions navigation" do + before do + visit diffs_project_merge_request_path(project, merge_request) + end + + it_behaves_like 'a page with a thread navigation' + end + end + + describe 'Merge request discussions' do + shared_examples 'a page with no code discussions' do + let!(:first_discussion) do + create(:discussion_note_on_merge_request, + noteable: merge_request, + project: project + ).to_discussion + end + + let!(:second_discussion) do + create(:discussion_note_on_merge_request, + noteable: merge_request, + project: project + ).to_discussion + end + + let(:first_discussion_selector) { ".discussion[data-discussion-id='#{first_discussion.id}']" } + let(:second_discussion_selector) { ".discussion[data-discussion-id='#{second_discussion.id}']" } + + describe "Changes page discussions navigation" do + it 'navigates to the first discussion on the Overview page' do + goto_next_thread + expect(page).to have_selector(first_discussion_selector, obscured: false) + end + + it 'navigates to the last discussion on the Overview page' do + goto_previous_thread + expect(page).to have_selector(second_discussion_selector, obscured: false) + end + end + end + + context 'on changes page' do + before do + visit diffs_project_merge_request_path(project, merge_request) + end + + it_behaves_like 'a page with no code discussions' + end + + context 'on commits page' do + before do + # we can't go directly to the commits page since it doesn't load discussions + visit project_merge_request_path(project, merge_request) + click_link 'Commits' + end + + it_behaves_like 'a page with no code discussions' + end + + context 'on pipelines page' do + before do + visit project_merge_request_path(project, merge_request) + click_link 'Pipelines' + end + + it_behaves_like 'a page with no code discussions' + end + end + + def goto_next_thread + begin + # this is required when moved_mr_sidebar is enabled + page.within('.issue-sticky-header') do + click_button 'Go to next unresolved thread' + end + rescue StandardError + click_button 'Go to next unresolved thread' + end + wait_for_scroll_end + end + + def goto_previous_thread + begin + page.within('.issue-sticky-header') do + click_button 'Go to previous unresolved thread' + end + rescue StandardError + click_button 'Go to previous unresolved thread' + end + wait_for_scroll_end + end + + def wait_for_scroll_end + sleep(1) + end +end |