From d004c768417ef95a4aecb58c6c241ceed1a73d8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Coutable?= Date: Thu, 30 Aug 2018 17:18:01 +0200 Subject: Reorganize issues and merge request feature specs in the same folder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Coutable --- spec/features/issues/rss_spec.rb | 32 ++++ .../features/issues/user_comments_on_issue_spec.rb | 84 ++++++++++ spec/features/issues/user_creates_issue_spec.rb | 90 +++++++++++ spec/features/issues/user_edits_issue_spec.rb | 25 +++ spec/features/issues/user_sorts_issues_spec.rb | 63 ++++++++ .../issues/user_toggles_subscription_spec.rb | 28 ++++ spec/features/issues/user_views_issue_spec.rb | 50 ++++++ spec/features/issues/user_views_issues_spec.rb | 116 ++++++++++++++ .../user_accepts_merge_request_spec.rb | 93 +++++++++++ .../user_closes_merge_request_spec.rb | 21 +++ .../merge_request/user_comments_on_commit_spec.rb | 19 +++ .../merge_request/user_comments_on_diff_spec.rb | 173 +++++++++++++++++++++ .../user_comments_on_merge_request_spec.rb | 49 ++++++ .../user_creates_merge_request_spec.rb | 84 ++++++++++ .../merge_request/user_edits_merge_request_spec.rb | 26 ++++ .../user_manages_subscription_spec.rb | 30 ++++ .../user_merges_merge_request_spec.rb | 43 +++++ .../user_rebases_merge_request_spec.rb | 34 ++++ .../user_reopens_merge_request_spec.rb | 22 +++ .../user_reverts_merge_request_spec.rb | 69 ++++++++ .../merge_request/user_views_diffs_spec.rb | 58 +++++++ .../user_views_open_merge_request_spec.rb | 92 +++++++++++ ...user_views_user_status_on_merge_request_spec.rb | 36 +++++ .../user_sorts_merge_requests_spec.rb | 92 +++++++++++ .../user_views_all_merge_requests_spec.rb | 15 ++ .../user_views_closed_merge_requests_spec.rb | 15 ++ .../user_views_merged_merge_requests_spec.rb | 15 ++ .../user_views_open_merge_requests_spec.rb | 127 +++++++++++++++ spec/features/projects/issues/rss_spec.rb | 32 ---- .../projects/issues/user_comments_on_issue_spec.rb | 84 ---------- .../projects/issues/user_creates_issue_spec.rb | 90 ----------- .../projects/issues/user_edits_issue_spec.rb | 25 --- .../projects/issues/user_sorts_issues_spec.rb | 63 -------- .../issues/user_toggles_subscription_spec.rb | 28 ---- .../projects/issues/user_views_issue_spec.rb | 50 ------ .../projects/issues/user_views_issues_spec.rb | 116 -------------- .../user_accepts_merge_request_spec.rb | 93 ----------- .../user_closes_merge_request_spec.rb | 21 --- .../merge_requests/user_comments_on_commit_spec.rb | 19 --- .../merge_requests/user_comments_on_diff_spec.rb | 173 --------------------- .../user_comments_on_merge_request_spec.rb | 49 ------ .../user_creates_merge_request_spec.rb | 84 ---------- .../user_edits_merge_request_spec.rb | 26 ---- .../user_manages_subscription_spec.rb | 30 ---- .../user_merges_merge_request_spec.rb | 43 ----- .../user_rebases_merge_request_spec.rb | 34 ---- .../user_reopens_merge_request_spec.rb | 22 --- .../user_reverts_merge_request_spec.rb | 69 -------- .../user_sorts_merge_requests_spec.rb | 92 ----------- .../user_views_all_merge_requests_spec.rb | 15 -- .../user_views_closed_merge_requests_spec.rb | 15 -- .../merge_requests/user_views_diffs_spec.rb | 58 ------- .../user_views_merged_merge_requests_spec.rb | 15 -- .../user_views_open_merge_request_spec.rb | 92 ----------- .../user_views_open_merge_requests_spec.rb | 127 --------------- ...user_views_user_status_on_merge_request_spec.rb | 36 ----- 56 files changed, 1601 insertions(+), 1601 deletions(-) create mode 100644 spec/features/issues/rss_spec.rb create mode 100644 spec/features/issues/user_comments_on_issue_spec.rb create mode 100644 spec/features/issues/user_creates_issue_spec.rb create mode 100644 spec/features/issues/user_edits_issue_spec.rb create mode 100644 spec/features/issues/user_sorts_issues_spec.rb create mode 100644 spec/features/issues/user_toggles_subscription_spec.rb create mode 100644 spec/features/issues/user_views_issue_spec.rb create mode 100644 spec/features/issues/user_views_issues_spec.rb create mode 100644 spec/features/merge_request/user_accepts_merge_request_spec.rb create mode 100644 spec/features/merge_request/user_closes_merge_request_spec.rb create mode 100644 spec/features/merge_request/user_comments_on_commit_spec.rb create mode 100644 spec/features/merge_request/user_comments_on_diff_spec.rb create mode 100644 spec/features/merge_request/user_comments_on_merge_request_spec.rb create mode 100644 spec/features/merge_request/user_creates_merge_request_spec.rb create mode 100644 spec/features/merge_request/user_edits_merge_request_spec.rb create mode 100644 spec/features/merge_request/user_manages_subscription_spec.rb create mode 100644 spec/features/merge_request/user_merges_merge_request_spec.rb create mode 100644 spec/features/merge_request/user_rebases_merge_request_spec.rb create mode 100644 spec/features/merge_request/user_reopens_merge_request_spec.rb create mode 100644 spec/features/merge_request/user_reverts_merge_request_spec.rb create mode 100644 spec/features/merge_request/user_views_diffs_spec.rb create mode 100644 spec/features/merge_request/user_views_open_merge_request_spec.rb create mode 100644 spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb create mode 100644 spec/features/merge_requests/user_sorts_merge_requests_spec.rb create mode 100644 spec/features/merge_requests/user_views_all_merge_requests_spec.rb create mode 100644 spec/features/merge_requests/user_views_closed_merge_requests_spec.rb create mode 100644 spec/features/merge_requests/user_views_merged_merge_requests_spec.rb create mode 100644 spec/features/merge_requests/user_views_open_merge_requests_spec.rb delete mode 100644 spec/features/projects/issues/rss_spec.rb delete mode 100644 spec/features/projects/issues/user_comments_on_issue_spec.rb delete mode 100644 spec/features/projects/issues/user_creates_issue_spec.rb delete mode 100644 spec/features/projects/issues/user_edits_issue_spec.rb delete mode 100644 spec/features/projects/issues/user_sorts_issues_spec.rb delete mode 100644 spec/features/projects/issues/user_toggles_subscription_spec.rb delete mode 100644 spec/features/projects/issues/user_views_issue_spec.rb delete mode 100644 spec/features/projects/issues/user_views_issues_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_accepts_merge_request_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_closes_merge_request_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_comments_on_commit_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_comments_on_diff_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_comments_on_merge_request_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_creates_merge_request_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_edits_merge_request_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_manages_subscription_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_merges_merge_request_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_rebases_merge_request_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_reopens_merge_request_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_reverts_merge_request_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_sorts_merge_requests_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_views_all_merge_requests_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_views_closed_merge_requests_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_views_diffs_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_views_merged_merge_requests_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_views_open_merge_request_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_views_open_merge_requests_spec.rb delete mode 100644 spec/features/projects/merge_requests/user_views_user_status_on_merge_request_spec.rb diff --git a/spec/features/issues/rss_spec.rb b/spec/features/issues/rss_spec.rb new file mode 100644 index 00000000000..0e1383cd607 --- /dev/null +++ b/spec/features/issues/rss_spec.rb @@ -0,0 +1,32 @@ +require 'spec_helper' + +describe 'Project Issues RSS' do + let(:project) { create(:project, visibility_level: Gitlab::VisibilityLevel::PUBLIC) } + let(:path) { project_issues_path(project) } + + before do + create(:issue, project: project) + end + + context 'when signed in' do + let(:user) { create(:user) } + + before do + project.add_developer(user) + sign_in(user) + visit path + end + + it_behaves_like "it has an RSS button with current_user's feed token" + it_behaves_like "an autodiscoverable RSS feed with current_user's feed token" + end + + context 'when signed out' do + before do + visit path + end + + it_behaves_like "it has an RSS button without a feed token" + it_behaves_like "an autodiscoverable RSS feed without a feed token" + end +end diff --git a/spec/features/issues/user_comments_on_issue_spec.rb b/spec/features/issues/user_comments_on_issue_spec.rb new file mode 100644 index 00000000000..ba5b80ed04b --- /dev/null +++ b/spec/features/issues/user_comments_on_issue_spec.rb @@ -0,0 +1,84 @@ +require "spec_helper" + +describe "User comments on issue", :js do + include Spec::Support::Helpers::Features::NotesHelpers + + let(:project) { create(:project_empty_repo, :public) } + let(:issue) { create(:issue, project: project) } + let(:user) { create(:user) } + + before do + project.add_guest(user) + sign_in(user) + + visit(project_issue_path(project, issue)) + end + + context "when adding comments" do + it "adds comment" do + content = "XML attached" + target_form = ".js-main-target-form" + + add_note(content) + + page.within(".note") do + expect(page).to have_content(content) + end + + page.within(target_form) do + find(".error-alert", visible: false) + end + end + + it "adds comment with code block" do + code_block_content = "Command [1]: /usr/local/bin/git , see [text](doc/text)" + comment = "```\n#{code_block_content}\n```" + + add_note(comment) + + wait_for_requests + + expect(page.find('pre code').text).to eq code_block_content + end + end + + context "when editing comments" do + it "edits comment" do + add_note("# Comment with a header") + + page.within(".note-body > .note-text") do + expect(page).to have_content("Comment with a header").and have_no_css("#comment-with-a-header") + end + + page.within(".main-notes-list") do + note = find(".note") + + note.hover + note.find(".js-note-edit").click + end + + expect(page).to have_css(".current-note-edit-form textarea") + + comment = "+1 Awesome!" + + page.within(".current-note-edit-form") do + fill_in("note[note]", with: comment) + find('textarea').send_keys [:control, :shift, 'p'] + expect(page).to have_selector('.current-note-edit-form .md-preview-holder') + expect(page.find('.current-note-edit-form .md-preview-holder p')).to have_content(comment) + end + + expect(page).to have_selector('.new-note .note-textarea') + + page.within(".current-note-edit-form") do + click_button("Save comment") + end + + wait_for_requests + + page.within(".note") do + expect(page).to have_content(comment) + end + end + end +end diff --git a/spec/features/issues/user_creates_issue_spec.rb b/spec/features/issues/user_creates_issue_spec.rb new file mode 100644 index 00000000000..5e8662100c5 --- /dev/null +++ b/spec/features/issues/user_creates_issue_spec.rb @@ -0,0 +1,90 @@ +require "spec_helper" + +describe "User creates issue" do + let(:project) { create(:project_empty_repo, :public) } + let(:user) { create(:user) } + + context "when signed in as guest" do + before do + project.add_guest(user) + sign_in(user) + + visit(new_project_issue_path(project)) + end + + it "creates issue" do + page.within(".issue-form") do + expect(page).to have_no_content("Assign to") + .and have_no_content("Labels") + .and have_no_content("Milestone") + + expect(page.find('#issue_title')['placeholder']).to eq 'Title' + expect(page.find('#issue_description')['placeholder']).to eq 'Write a comment or drag your files here…' + end + + issue_title = "500 error on profile" + + fill_in("Title", with: issue_title) + click_button("Submit issue") + + expect(page).to have_content(issue_title) + .and have_content(user.name) + .and have_content(project.name) + end + end + + context "when signed in as developer", :js do + before do + project.add_developer(user) + sign_in(user) + + visit(new_project_issue_path(project)) + end + + context "when previewing" do + it "previews content" do + form = first(".gfm-form") + textarea = first(".gfm-form textarea") + + page.within(form) do + click_link("Preview") + + preview = find(".js-md-preview") # this element is findable only when the "Preview" link is clicked. + + expect(preview).to have_content("Nothing to preview.") + + click_link("Write") + fill_in("Description", with: "Bug fixed :smile:") + click_link("Preview") + + expect(preview).to have_css("gl-emoji") + expect(textarea).not_to be_visible + end + end + end + + context "with labels" do + LABEL_TITLES = %w(bug feature enhancement).freeze + + before do + LABEL_TITLES.each do |title| + create(:label, project: project, title: title) + end + end + + it "creates issue" do + issue_title = "500 error on profile" + + fill_in("Title", with: issue_title) + click_button("Label") + click_link(LABEL_TITLES.first) + click_button("Submit issue") + + expect(page).to have_content(issue_title) + .and have_content(user.name) + .and have_content(project.name) + .and have_content(LABEL_TITLES.first) + end + end + end +end diff --git a/spec/features/issues/user_edits_issue_spec.rb b/spec/features/issues/user_edits_issue_spec.rb new file mode 100644 index 00000000000..1d9c3abc20f --- /dev/null +++ b/spec/features/issues/user_edits_issue_spec.rb @@ -0,0 +1,25 @@ +require "spec_helper" + +describe "User edits issue", :js do + set(:project) { create(:project_empty_repo, :public) } + set(:user) { create(:user) } + set(:issue) { create(:issue, project: project, author: user) } + + before do + project.add_developer(user) + sign_in(user) + + visit(edit_project_issue_path(project, issue)) + end + + it "previews content" do + form = first(".gfm-form") + + page.within(form) do + fill_in("Description", with: "Bug fixed :smile:") + click_link("Preview") + end + + expect(form).to have_link("Write") + end +end diff --git a/spec/features/issues/user_sorts_issues_spec.rb b/spec/features/issues/user_sorts_issues_spec.rb new file mode 100644 index 00000000000..7d261ec7dae --- /dev/null +++ b/spec/features/issues/user_sorts_issues_spec.rb @@ -0,0 +1,63 @@ +require "spec_helper" + +describe "User sorts issues" do + set(:user) { create(:user) } + set(:group) { create(:group) } + set(:project) { create(:project_empty_repo, :public, group: group) } + set(:issue1) { create(:issue, project: project) } + set(:issue2) { create(:issue, project: project) } + set(:issue3) { create(:issue, project: project) } + + before do + create_list(:award_emoji, 2, :upvote, awardable: issue1) + create_list(:award_emoji, 2, :downvote, awardable: issue2) + create(:award_emoji, :downvote, awardable: issue1) + create(:award_emoji, :upvote, awardable: issue2) + + sign_in(user) + + visit(project_issues_path(project)) + end + + it 'keeps the sort option' do + find('button.dropdown-toggle').click + + page.within('.content ul.dropdown-menu.dropdown-menu-right li') do + click_link('Milestone') + end + + visit(issues_dashboard_path(assignee_id: user.id)) + + expect(find('.issues-filters a.is-active')).to have_content('Milestone') + + visit(project_issues_path(project)) + + expect(find('.issues-filters a.is-active')).to have_content('Milestone') + + visit(issues_group_path(group)) + + expect(find('.issues-filters a.is-active')).to have_content('Milestone') + end + + it "sorts by popularity" do + find("button.dropdown-toggle").click + + page.within(".content ul.dropdown-menu.dropdown-menu-right li") do + click_link("Popularity") + end + + page.within(".issues-list") do + page.within("li.issue:nth-child(1)") do + expect(page).to have_content(issue1.title) + end + + page.within("li.issue:nth-child(2)") do + expect(page).to have_content(issue2.title) + end + + page.within("li.issue:nth-child(3)") do + expect(page).to have_content(issue3.title) + end + end + end +end diff --git a/spec/features/issues/user_toggles_subscription_spec.rb b/spec/features/issues/user_toggles_subscription_spec.rb new file mode 100644 index 00000000000..c2b2a193682 --- /dev/null +++ b/spec/features/issues/user_toggles_subscription_spec.rb @@ -0,0 +1,28 @@ +require "spec_helper" + +describe "User toggles subscription", :js do + let(:project) { create(:project_empty_repo, :public) } + let(:user) { create(:user) } + let(:issue) { create(:issue, project: project, author: user) } + + before do + project.add_developer(user) + sign_in(user) + + visit(project_issue_path(project, issue)) + end + + it "unsubscribes from issue" do + subscription_button = find(".js-issuable-subscribe-button") + + # Check we're subscribed. + expect(subscription_button).to have_css("button.is-checked") + + # Toggle subscription. + find(".js-issuable-subscribe-button button").click + wait_for_requests + + # Check we're unsubscribed. + expect(subscription_button).to have_css("button:not(.is-checked)") + end +end diff --git a/spec/features/issues/user_views_issue_spec.rb b/spec/features/issues/user_views_issue_spec.rb new file mode 100644 index 00000000000..117e5986f29 --- /dev/null +++ b/spec/features/issues/user_views_issue_spec.rb @@ -0,0 +1,50 @@ +require "spec_helper" + +describe "User views issue" do + set(:project) { create(:project_empty_repo, :public) } + set(:user) { create(:user) } + set(:issue) { create(:issue, project: project, description: "# Description header", author: user) } + + before do + project.add_developer(user) + sign_in(user) + + visit(project_issue_path(project, issue)) + end + + it { expect(page).to have_header_with_correct_id_and_link(1, "Description header", "description-header") } + + it 'shows the merge request and issue actions', :aggregate_failures do + expect(page).to have_link('New issue') + expect(page).to have_button('Create merge request') + expect(page).to have_link('Close issue') + end + + context 'when the project is archived' do + let(:project) { create(:project, :public, :archived) } + + it 'hides the merge request and issue actions', :aggregate_failures do + expect(page).not_to have_link('New issue') + expect(page).not_to have_button('Create merge request') + expect(page).not_to have_link('Close issue') + end + end + + describe 'user status' do + subject { visit(project_issue_path(project, issue)) } + + describe 'showing status of the author of the issue' do + it_behaves_like 'showing user status' do + let(:user_with_status) { issue.author } + end + end + + describe 'showing status of a user who commented on an issue', :js do + let!(:note) { create(:note, noteable: issue, project: project, author: user_with_status) } + + it_behaves_like 'showing user status' do + let(:user_with_status) { create(:user) } + end + end + end +end diff --git a/spec/features/issues/user_views_issues_spec.rb b/spec/features/issues/user_views_issues_spec.rb new file mode 100644 index 00000000000..58afb4efb86 --- /dev/null +++ b/spec/features/issues/user_views_issues_spec.rb @@ -0,0 +1,116 @@ +require "spec_helper" + +describe "User views issues" do + let!(:closed_issue) { create(:closed_issue, project: project) } + let!(:open_issue1) { create(:issue, project: project) } + let!(:open_issue2) { create(:issue, project: project) } + set(:user) { create(:user) } + + shared_examples "opens issue from list" do + it "opens issue" do + click_link(issue.title) + + expect(page).to have_content(issue.title) + end + end + + shared_examples "open issues" do + context "open issues" do + let(:label) { create(:label, project: project, title: "bug") } + + before do + open_issue1.labels << label + + visit(project_issues_path(project, state: :opened)) + end + + it "shows open issues" do + expect(page).to have_content(project.name) + .and have_content(open_issue1.title) + .and have_content(open_issue2.title) + .and have_no_content(closed_issue.title) + .and have_no_selector(".js-new-board-list") + end + + it "opens issues by label" do + page.within(".issues-list") do + click_link(label.title) + end + + expect(page).to have_content(open_issue1.title) + .and have_no_content(open_issue2.title) + .and have_no_content(closed_issue.title) + end + + include_examples "opens issue from list" do + let(:issue) { open_issue1 } + end + end + end + + shared_examples "closed issues" do + context "closed issues" do + before do + visit(project_issues_path(project, state: :closed)) + end + + it "shows closed issues" do + expect(page).to have_content(project.name) + .and have_content(closed_issue.title) + .and have_no_content(open_issue1.title) + .and have_no_content(open_issue2.title) + .and have_no_selector(".js-new-board-list") + end + + include_examples "opens issue from list" do + let(:issue) { closed_issue } + end + end + end + + shared_examples "all issues" do + context "all issues" do + before do + visit(project_issues_path(project, state: :all)) + end + + it "shows all issues" do + expect(page).to have_content(project.name) + .and have_content(closed_issue.title) + .and have_content(open_issue1.title) + .and have_content(open_issue2.title) + .and have_no_selector(".js-new-board-list") + end + + include_examples "opens issue from list" do + let(:issue) { closed_issue } + end + end + end + + %w[internal public].each do |visibility| + shared_examples "#{visibility} project" do + context "when project is #{visibility}" do + let(:project) { create(:project_empty_repo, :"#{visibility}") } + + include_examples "open issues" + include_examples "closed issues" + include_examples "all issues" + end + end + end + + context "when signed in as developer" do + before do + project.add_developer(user) + sign_in(user) + end + + include_examples "public project" + include_examples "internal project" + end + + context "when not signed in" do + include_examples "public project" + end +end diff --git a/spec/features/merge_request/user_accepts_merge_request_spec.rb b/spec/features/merge_request/user_accepts_merge_request_spec.rb new file mode 100644 index 00000000000..01aeed93947 --- /dev/null +++ b/spec/features/merge_request/user_accepts_merge_request_spec.rb @@ -0,0 +1,93 @@ +require 'spec_helper' + +describe 'User accepts a merge request', :js do + let(:merge_request) { create(:merge_request, :with_diffs, :simple, source_project: project) } + let(:project) { create(:project, :public, :repository) } + let(:user) { create(:user) } + + before do + project.add_developer(user) + sign_in(user) + end + + it 'presents merged merge request content' do + visit(merge_request_path(merge_request)) + + click_button('Merge') + + expect(page).to have_content("The changes were merged into #{merge_request.target_branch} with \ + #{merge_request.short_merge_commit_sha}") + end + + context 'with removing the source branch' do + before do + visit(merge_request_path(merge_request)) + end + + it 'accepts a merge request' do + check('Remove source branch') + click_button('Merge') + + expect(page).to have_content('The changes were merged into') + expect(page).not_to have_selector('.js-remove-branch-button') + + # Wait for View Resource requests to complete so they don't blow up if they are + # only handled after `DatabaseCleaner` has already run. + wait_for_requests + end + end + + context 'without removing the source branch' do + before do + visit(merge_request_path(merge_request)) + end + + it 'accepts a merge request' do + click_button('Merge') + + expect(page).to have_content('The changes were merged into') + expect(page).to have_selector('.js-remove-branch-button') + + # Wait for View Resource requests to complete so they don't blow up if they are + # only handled after `DatabaseCleaner` has already run + wait_for_requests + end + end + + context 'when a URL has an anchor' do + before do + visit(merge_request_path(merge_request, anchor: 'note_123')) + end + + it 'accepts a merge request' do + check('Remove source branch') + click_button('Merge') + + expect(page).to have_content('The changes were merged into') + expect(page).not_to have_selector('.js-remove-branch-button') + + # Wait for View Resource requests to complete so they don't blow up if they are + # only handled after `DatabaseCleaner` has already run + wait_for_requests + end + end + + context 'when modifying the merge commit message' do + before do + merge_request.mark_as_mergeable + + visit(merge_request_path(merge_request)) + end + + it 'accepts a merge request' do + click_button('Modify commit message') + fill_in('Commit message', with: 'wow such merge') + + click_button('Merge') + + page.within('.status-box') do + expect(page).to have_content('Merged') + end + end + end +end diff --git a/spec/features/merge_request/user_closes_merge_request_spec.rb b/spec/features/merge_request/user_closes_merge_request_spec.rb new file mode 100644 index 00000000000..2d12d690151 --- /dev/null +++ b/spec/features/merge_request/user_closes_merge_request_spec.rb @@ -0,0 +1,21 @@ +require 'spec_helper' + +describe 'User closes a merge requests', :js do + let(:project) { create(:project, :repository) } + let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let(:user) { create(:user) } + + before do + project.add_maintainer(user) + sign_in(user) + + visit(merge_request_path(merge_request)) + end + + it 'closes a merge request' do + click_link('Close merge request', match: :first) + + expect(page).to have_content(merge_request.title) + expect(page).to have_content('Closed by') + end +end diff --git a/spec/features/merge_request/user_comments_on_commit_spec.rb b/spec/features/merge_request/user_comments_on_commit_spec.rb new file mode 100644 index 00000000000..8ea358bcc70 --- /dev/null +++ b/spec/features/merge_request/user_comments_on_commit_spec.rb @@ -0,0 +1,19 @@ +require 'spec_helper' + +describe 'User comments on a commit', :js do + include MergeRequestDiffHelpers + include RepoHelpers + + let(:project) { create(:project, :repository) } + let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let(:user) { create(:user) } + + before do + project.add_maintainer(user) + sign_in(user) + + visit(project_commit_path(project, sample_commit.id)) + end + + include_examples 'comment on merge request file' +end diff --git a/spec/features/merge_request/user_comments_on_diff_spec.rb b/spec/features/merge_request/user_comments_on_diff_spec.rb new file mode 100644 index 00000000000..441b080bee5 --- /dev/null +++ b/spec/features/merge_request/user_comments_on_diff_spec.rb @@ -0,0 +1,173 @@ +require 'spec_helper' + +describe 'User comments on a diff', :js do + include MergeRequestDiffHelpers + include RepoHelpers + + 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 + let(:user) { create(:user) } + + before do + project.add_maintainer(user) + sign_in(user) + + visit(diffs_project_merge_request_path(project, merge_request)) + end + + context 'when viewing comments' do + context 'when toggling inline comments' do + context 'in a single file' do + it 'hides a comment' do + click_diff_line(find("[id='#{sample_compare.changes[1][:line_code]}']")) + + page.within('.js-discussion-note-form') do + fill_in('note_note', with: 'Line is wrong') + click_button('Comment') + end + + page.within('.files > div:nth-child(3)') do + expect(page).to have_content('Line is wrong') + + find('.js-btn-vue-toggle-comments').click + + expect(page).not_to have_content('Line is wrong') + end + end + end + + context 'in multiple files' do + it 'toggles comments' do + click_diff_line(find("[id='#{sample_compare.changes[0][:line_code]}']")) + + page.within('.js-discussion-note-form') do + fill_in('note_note', with: 'Line is correct') + click_button('Comment') + end + + wait_for_requests + + page.within('.files > div:nth-child(2) .note-body > .note-text') do + expect(page).to have_content('Line is correct') + end + + click_diff_line(find("[id='#{sample_compare.changes[1][:line_code]}']")) + + page.within('.js-discussion-note-form') do + fill_in('note_note', with: 'Line is wrong') + click_button('Comment') + end + + wait_for_requests + + # Hide the comment. + page.within('.files > div:nth-child(3)') do + find('.js-btn-vue-toggle-comments').click + + expect(page).not_to have_content('Line is wrong') + end + + # At this moment a user should see only one comment. + # The other one should be hidden. + page.within('.files > div:nth-child(2) .note-body > .note-text') do + expect(page).to have_content('Line is correct') + end + + # Show the comment. + page.within('.files > div:nth-child(3)') do + find('.js-btn-vue-toggle-comments').click + end + + # Now both the comments should be shown. + page.within('.files > div:nth-child(3) .note-body > .note-text') do + expect(page).to have_content('Line is wrong') + end + + page.within('.files > div:nth-child(2) .note-body > .note-text') do + expect(page).to have_content('Line is correct') + end + + # Check the same comments in the side-by-side view. + execute_script("window.scrollTo(0,0);") + click_button 'Side-by-side' + + wait_for_requests + + page.within('.files > div:nth-child(3) .parallel .note-body > .note-text') do + expect(page).to have_content('Line is wrong') + end + + page.within('.files > div:nth-child(2) .parallel .note-body > .note-text') do + expect(page).to have_content('Line is correct') + end + end + end + end + end + + context 'when adding comments' do + include_examples 'comment on merge request file' + end + + context 'when editing comments' do + it 'edits a comment' do + click_diff_line(find("[id='#{sample_commit.line_code}']")) + + page.within('.js-discussion-note-form') do + fill_in(:note_note, with: 'Line is wrong') + click_button('Comment') + end + + page.within('.diff-file:nth-of-type(5) .discussion .note') do + find('.js-note-edit').click + + page.within('.current-note-edit-form') do + fill_in('note_note', with: 'Typo, please fix') + click_button('Save comment') + end + + expect(page).not_to have_button('Save comment', disabled: true) + end + + page.within('.diff-file:nth-of-type(5) .discussion .note') do + expect(page).to have_content('Typo, please fix').and have_no_content('Line is wrong') + end + end + end + + context 'when deleting comments' do + it 'deletes a comment' do + click_diff_line(find("[id='#{sample_commit.line_code}']")) + + page.within('.js-discussion-note-form') do + fill_in(:note_note, with: 'Line is wrong') + click_button('Comment') + end + + page.within('.notes-tab .badge') do + expect(page).to have_content('1') + end + + page.within('.diff-file:nth-of-type(5) .discussion .note') do + find('.more-actions').click + find('.more-actions .dropdown-menu li', match: :first) + + accept_confirm { find('.js-note-delete').click } + end + + page.within('.merge-request-tabs') do + find('.notes-tab').click + end + + wait_for_requests + + expect(page).not_to have_css('.notes .discussion') + + page.within('.notes-tab .badge') do + expect(page).to have_content('0') + end + end + end +end diff --git a/spec/features/merge_request/user_comments_on_merge_request_spec.rb b/spec/features/merge_request/user_comments_on_merge_request_spec.rb new file mode 100644 index 00000000000..69bdab85d81 --- /dev/null +++ b/spec/features/merge_request/user_comments_on_merge_request_spec.rb @@ -0,0 +1,49 @@ +require 'spec_helper' + +describe 'User comments on a merge request', :js do + include RepoHelpers + + let(:project) { create(:project, :repository) } + let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let(:user) { create(:user) } + + before do + project.add_maintainer(user) + sign_in(user) + + visit(merge_request_path(merge_request)) + end + + it 'adds a comment' do + page.within('.js-main-target-form') do + fill_in('note[note]', with: '# Comment with a header') + click_button('Comment') + end + + wait_for_requests + + page.within('.note') do + expect(page).to have_content('Comment with a header') + expect(page).not_to have_css('#comment-with-a-header') + end + end + + it 'loads new comment' do + # Add new comment in background in order to check + # if it's going to be loaded automatically for current user. + create(:diff_note_on_merge_request, project: project, noteable: merge_request, author: user, note: 'Line is wrong') + # Trigger a refresh of notes. + execute_script("$(document).trigger('visibilitychange');") + wait_for_requests + + page.within('.notes .discussion') do + expect(page).to have_content("#{user.name} #{user.to_reference} started a discussion") + expect(page).to have_content(sample_commit.line_code_path) + expect(page).to have_content('Line is wrong') + end + + page.within('.notes-tab .badge') do + expect(page).to have_content('1') + end + end +end diff --git a/spec/features/merge_request/user_creates_merge_request_spec.rb b/spec/features/merge_request/user_creates_merge_request_spec.rb new file mode 100644 index 00000000000..38b4e4a6d1b --- /dev/null +++ b/spec/features/merge_request/user_creates_merge_request_spec.rb @@ -0,0 +1,84 @@ +require "spec_helper" + +describe "User creates a merge request", :js do + include ProjectForksHelper + + let(:title) { "Some feature" } + let(:project) { create(:project, :repository) } + let(:user) { create(:user) } + + before do + project.add_maintainer(user) + sign_in(user) + end + + it "creates a merge request" do + visit(project_new_merge_request_path(project)) + + find(".js-source-branch").click + click_link("fix") + + find(".js-target-branch").click + click_link("feature") + + click_button("Compare branches") + + fill_in("Title", with: title) + click_button("Submit merge request") + + page.within(".merge-request") do + expect(page).to have_content(title) + end + end + + context "to a forked project" do + let(:forked_project) { fork_project(project, user, namespace: user.namespace, repository: true) } + + it "creates a merge request" do + visit(project_new_merge_request_path(forked_project)) + + expect(page).to have_content("Source branch").and have_content("Target branch") + expect(find("#merge_request_target_project_id", visible: false).value).to eq(project.id.to_s) + + click_button("Compare branches and continue") + + expect(page).to have_content("You must select source and target branch") + + first(".js-source-project").click + first(".dropdown-source-project a", text: forked_project.full_path) + + first(".js-target-project").click + first(".dropdown-target-project a", text: project.full_path) + + first(".js-source-branch").click + + wait_for_requests + + source_branch = "fix" + + first(".js-source-branch-dropdown .dropdown-content a", text: source_branch).click + + click_button("Compare branches and continue") + + expect(page).to have_css("h3.page-title", text: "New Merge Request") + + page.within("form#new_merge_request") do + fill_in("Title", with: title) + end + + click_button("Assignee") + + expect(find(".js-assignee-search")["data-project-id"]).to eq(project.id.to_s) + + page.within(".dropdown-menu-user") do + expect(page).to have_content("Unassigned") + .and have_content(user.name) + .and have_content(project.users.first.name) + end + + click_button("Submit merge request") + + expect(page).to have_content(title).and have_content("Request to merge #{user.namespace.name}:#{source_branch} into master") + end + end +end diff --git a/spec/features/merge_request/user_edits_merge_request_spec.rb b/spec/features/merge_request/user_edits_merge_request_spec.rb new file mode 100644 index 00000000000..7de0f9daac6 --- /dev/null +++ b/spec/features/merge_request/user_edits_merge_request_spec.rb @@ -0,0 +1,26 @@ +require 'spec_helper' + +describe 'User edits a merge request', :js do + include Select2Helper + + let(:project) { create(:project, :repository) } + let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let(:user) { create(:user) } + + before do + project.add_maintainer(user) + sign_in(user) + + visit(edit_project_merge_request_path(project, merge_request)) + end + + it 'changes the target branch' do + expect(page).to have_content('Target branch') + + select2('merge-test', from: '#merge_request_target_branch') + click_button('Save changes') + + expect(page).to have_content("Request to merge #{merge_request.source_branch} into merge-test") + expect(page).to have_content("changed target branch from #{merge_request.target_branch} to merge-test") + end +end diff --git a/spec/features/merge_request/user_manages_subscription_spec.rb b/spec/features/merge_request/user_manages_subscription_spec.rb new file mode 100644 index 00000000000..68a835e7f77 --- /dev/null +++ b/spec/features/merge_request/user_manages_subscription_spec.rb @@ -0,0 +1,30 @@ +require 'spec_helper' + +describe 'User manages subscription', :js do + let(:project) { create(:project, :public, :repository) } + let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let(:user) { create(:user) } + + before do + project.add_maintainer(user) + sign_in(user) + + visit(merge_request_path(merge_request)) + end + + it 'toggles subscription' do + page.within('.js-issuable-subscribe-button') do + expect(page).to have_css 'button:not(.is-checked)' + find('button:not(.is-checked)').click + + wait_for_requests + + expect(page).to have_css 'button.is-checked' + find('button.is-checked').click + + wait_for_requests + + expect(page).to have_css 'button:not(.is-checked)' + end + end +end diff --git a/spec/features/merge_request/user_merges_merge_request_spec.rb b/spec/features/merge_request/user_merges_merge_request_spec.rb new file mode 100644 index 00000000000..6539e6e9208 --- /dev/null +++ b/spec/features/merge_request/user_merges_merge_request_spec.rb @@ -0,0 +1,43 @@ +require "spec_helper" + +describe "User merges a merge request", :js do + let(:user) { project.owner } + + before do + sign_in(user) + end + + shared_examples "fast forward merge a merge request" do + it "merges a merge request" do + expect(page).to have_content("Fast-forward merge without a merge commit").and have_button("Merge") + + page.within(".mr-state-widget") do + click_button("Merge") + end + + page.within(".status-box") do + expect(page).to have_content("Merged") + end + end + end + + context "ff-only merge" do + let(:project) { create(:project, :public, :repository, merge_requests_ff_only_enabled: true) } + + before do + visit(merge_request_path(merge_request)) + end + + context "when branch is rebased" do + let!(:merge_request) { create(:merge_request, :rebased, source_project: project) } + + it_behaves_like "fast forward merge a merge request" + end + + context "when branch is merged" do + let!(:merge_request) { create(:merge_request, :merged_target, source_project: project) } + + it_behaves_like "fast forward merge a merge request" + end + end +end diff --git a/spec/features/merge_request/user_rebases_merge_request_spec.rb b/spec/features/merge_request/user_rebases_merge_request_spec.rb new file mode 100644 index 00000000000..92e1c9942b1 --- /dev/null +++ b/spec/features/merge_request/user_rebases_merge_request_spec.rb @@ -0,0 +1,34 @@ +require "spec_helper" + +describe "User rebases a merge request", :js do + let(:merge_request) { create(:merge_request, :simple, source_project: project) } + let(:user) { project.owner } + + before do + sign_in(user) + end + + shared_examples "rebases" do + it "rebases" do + visit(merge_request_path(merge_request)) + + expect(page).to have_button("Rebase") + + click_button("Rebase") + + expect(page).to have_content("Rebase in progress") + end + end + + context "when merge is regular" do + let(:project) { create(:project, :public, :repository, merge_requests_rebase_enabled: true) } + + it_behaves_like "rebases" + end + + context "when merge is ff-only" do + let(:project) { create(:project, :public, :repository, merge_requests_ff_only_enabled: true) } + + it_behaves_like "rebases" + end +end diff --git a/spec/features/merge_request/user_reopens_merge_request_spec.rb b/spec/features/merge_request/user_reopens_merge_request_spec.rb new file mode 100644 index 00000000000..745b4537e72 --- /dev/null +++ b/spec/features/merge_request/user_reopens_merge_request_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' + +describe 'User reopens a merge requests', :js do + let(:project) { create(:project, :public, :repository) } + let!(:merge_request) { create(:closed_merge_request, source_project: project, target_project: project) } + let(:user) { create(:user) } + + before do + project.add_maintainer(user) + sign_in(user) + + visit(merge_request_path(merge_request)) + end + + it 'reopens a merge request' do + click_link('Reopen merge request', match: :first) + + page.within('.status-box') do + expect(page).to have_content('Open') + end + end +end diff --git a/spec/features/merge_request/user_reverts_merge_request_spec.rb b/spec/features/merge_request/user_reverts_merge_request_spec.rb new file mode 100644 index 00000000000..67b6aefb2d8 --- /dev/null +++ b/spec/features/merge_request/user_reverts_merge_request_spec.rb @@ -0,0 +1,69 @@ +require 'spec_helper' + +describe 'User reverts a merge request', :js do + let(:merge_request) { create(:merge_request, :with_diffs, :simple, source_project: project) } + let(:project) { create(:project, :public, :repository) } + let(:user) { create(:user) } + + before do + project.add_developer(user) + sign_in(user) + + visit(merge_request_path(merge_request)) + + click_button('Merge') + + wait_for_requests + + visit(merge_request_path(merge_request)) + end + + it 'reverts a merge request' do + find("a[href='#modal-revert-commit']").click + + page.within('#modal-revert-commit') do + uncheck('create_merge_request') + click_button('Revert') + end + + expect(page).to have_content('The merge request has been successfully reverted.') + + wait_for_requests + end + + it 'does not revert a merge request that was previously reverted' do + find("a[href='#modal-revert-commit']").click + + page.within('#modal-revert-commit') do + uncheck('create_merge_request') + click_button('Revert') + end + + find("a[href='#modal-revert-commit']").click + + page.within('#modal-revert-commit') do + uncheck('create_merge_request') + click_button('Revert') + end + + expect(page).to have_content('Sorry, we cannot revert this merge request automatically.') + end + + it 'reverts a merge request in a new merge request' do + find("a[href='#modal-revert-commit']").click + + page.within('#modal-revert-commit') do + click_button('Revert') + end + + expect(page).to have_content('The merge request has been successfully reverted. You can now submit a merge request to get this change into the original branch.') + end + + it 'cannot revert a merge requests for an archived project' do + project.update!(archived: true) + + visit(merge_request_path(merge_request)) + + expect(page).not_to have_link('Revert') + end +end diff --git a/spec/features/merge_request/user_views_diffs_spec.rb b/spec/features/merge_request/user_views_diffs_spec.rb new file mode 100644 index 00000000000..b1bfe9e5de3 --- /dev/null +++ b/spec/features/merge_request/user_views_diffs_spec.rb @@ -0,0 +1,58 @@ +require 'spec_helper' + +describe 'User views diffs', :js do + let(:merge_request) do + create(:merge_request_with_diffs, source_project: project, target_project: project, source_branch: 'merge-test') + end + let(:project) { create(:project, :public, :repository) } + + before do + visit(diffs_project_merge_request_path(project, merge_request)) + + wait_for_requests + end + + shared_examples 'unfold diffs' do + it 'unfolds diffs' do + first('.js-unfold').click + + expect(find('.file-holder[id="a5cc2925ca8258af241be7e5b0381edf30266302"] .text-file')).to have_content('.bundle') + end + end + + it 'shows diffs' do + expect(page).to have_css('.tab-content #diffs.active') + expect(page).to have_css('#parallel-diff-btn', count: 1) + expect(page).to have_css('#inline-diff-btn', count: 1) + end + + it 'hides loading spinner after load' do + expect(page).not_to have_selector('.mr-loading-status .loading', visible: true) + end + + context 'when in the inline view' do + include_examples 'unfold diffs' + end + + context 'when in the side-by-side view' do + before do + click_button 'Side-by-side' + + wait_for_requests + end + + it 'shows diffs in parallel' do + expect(page).to have_css('.parallel') + end + + it 'toggles container class' do + expect(page).not_to have_css('.content-wrapper > .container-fluid.container-limited') + + click_link 'Commits' + + expect(page).to have_css('.content-wrapper > .container-fluid.container-limited') + end + + include_examples 'unfold diffs' + end +end diff --git a/spec/features/merge_request/user_views_open_merge_request_spec.rb b/spec/features/merge_request/user_views_open_merge_request_spec.rb new file mode 100644 index 00000000000..6ac495aa03d --- /dev/null +++ b/spec/features/merge_request/user_views_open_merge_request_spec.rb @@ -0,0 +1,92 @@ +require 'spec_helper' + +describe 'User views an open merge request' do + let(:merge_request) do + create(:merge_request, source_project: project, target_project: project, description: '# Description header') + end + + context 'when a merge request does not have repository' do + let(:project) { create(:project, :public, :repository) } + + before do + visit(merge_request_path(merge_request)) + end + + it 'renders both the title and the description' do + node = find('.wiki h1 a#user-content-description-header') + expect(node[:href]).to end_with('#description-header') + + # Work around a weird Capybara behavior where calling `parent` on a node + # returns the whole document, not the node's actual parent element + expect(find(:xpath, "#{node.path}/..").text).to eq(merge_request.description[2..-1]) + + expect(page).to have_content(merge_request.title).and have_content(merge_request.description) + end + end + + context 'when a merge request has repository', :js do + let(:project) { create(:project, :public, :repository) } + + context 'when rendering description preview' do + let(:user) { create(:user) } + + before do + project.add_maintainer(user) + sign_in(user) + + visit(edit_project_merge_request_path(project, merge_request)) + end + + it 'renders empty description preview' do + find('.gfm-form').fill_in(:merge_request_description, with: '') + + page.within('.gfm-form') do + click_link('Preview') + + expect(find('.js-md-preview')).to have_content('Nothing to preview.') + end + end + + it 'renders description preview' do + find('.gfm-form').fill_in(:merge_request_description, with: ':+1: Nice') + + page.within('.gfm-form') do + click_link('Preview') + + expect(find('.js-md-preview')).to have_css('gl-emoji') + end + + expect(find('.gfm-form')).to have_css('.js-md-preview').and have_link('Write') + expect(find('#merge_request_description', visible: false)).not_to be_visible + end + end + + context 'when the branch is rebased on the target' do + let(:merge_request) { create(:merge_request, :rebased, source_project: project, target_project: project) } + + before do + visit(merge_request_path(merge_request)) + end + + it 'does not show diverged commits count' do + page.within('.mr-source-target') do + expect(page).not_to have_content(/([0-9]+ commit[s]? behind)/) + end + end + end + + context 'when the branch is diverged on the target' do + let(:merge_request) { create(:merge_request, :diverged, source_project: project, target_project: project) } + + before do + visit(merge_request_path(merge_request)) + end + + it 'shows diverged commits count' do + page.within('.mr-source-target') do + expect(page).to have_content(/([0-9]+ commits behind)/) + end + end + end + end +end diff --git a/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb b/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb new file mode 100644 index 00000000000..78d9c6c6db1 --- /dev/null +++ b/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'Project > Merge request > View user status' do + let(:project) { create(:project, :public, :repository) } + let(:merge_request) do + create(:merge_request, source_project: project, target_project: project, author: create(:user)) + end + + subject { visit merge_request_path(merge_request) } + + describe 'the status of the merge request author' do + it_behaves_like 'showing user status' do + let(:user_with_status) { merge_request.author } + end + end + + context 'for notes', :js do + describe 'the status of the author of a note on a merge request' do + let(:note) { create(:note, noteable: merge_request, project: project, author: create(:user)) } + + it_behaves_like 'showing user status' do + let(:user_with_status) { note.author } + end + end + + describe 'the status of the author of a diff note on a merge request' do + let(:note) { create(:diff_note_on_merge_request, noteable: merge_request, project: project, author: create(:user)) } + + it_behaves_like 'showing user status' do + let(:user_with_status) { note.author } + end + end + end +end diff --git a/spec/features/merge_requests/user_sorts_merge_requests_spec.rb b/spec/features/merge_requests/user_sorts_merge_requests_spec.rb new file mode 100644 index 00000000000..82cfe600d52 --- /dev/null +++ b/spec/features/merge_requests/user_sorts_merge_requests_spec.rb @@ -0,0 +1,92 @@ +require 'spec_helper' + +describe 'User sorts merge requests' do + include CookieHelper + + let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let!(:merge_request2) do + create(:merge_request_with_diffs, source_project: project, target_project: project, source_branch: 'merge-test') + end + set(:user) { create(:user) } + set(:group) { create(:group) } + set(:group_member) { create(:group_member, :maintainer, user: user, group: group) } + set(:project) { create(:project, :public, group: group) } + + before do + sign_in(user) + + visit(project_merge_requests_path(project)) + end + + it 'keeps the sort option' do + find('button.dropdown-toggle').click + + page.within('.content ul.dropdown-menu.dropdown-menu-right li') do + click_link('Milestone') + end + + visit(merge_requests_dashboard_path(assignee_id: user.id)) + + expect(find('.issues-filters a.is-active')).to have_content('Milestone') + + visit(project_merge_requests_path(project)) + + expect(find('.issues-filters a.is-active')).to have_content('Milestone') + + visit(merge_requests_group_path(group)) + + expect(find('.issues-filters a.is-active')).to have_content('Milestone') + end + + it 'fallbacks to issuable_sort cookie key when remembering the sorting option' do + set_cookie('issuable_sort', 'milestone') + + visit(merge_requests_dashboard_path(assignee_id: user.id)) + + expect(find('.issues-filters a.is-active')).to have_content('Milestone') + end + + it 'separates remember sorting with issues' do + create(:issue, project: project) + + find('button.dropdown-toggle').click + + page.within('.content ul.dropdown-menu.dropdown-menu-right li') do + click_link('Milestone') + end + + visit(project_issues_path(project)) + + expect(find('.issues-filters a.is-active')).not_to have_content('Milestone') + end + + context 'when merge requests have awards' do + before do + create_list(:award_emoji, 2, awardable: merge_request) + create(:award_emoji, :downvote, awardable: merge_request) + + create(:award_emoji, awardable: merge_request2) + create_list(:award_emoji, 2, :downvote, awardable: merge_request2) + end + + it 'sorts by popularity' do + find('button.dropdown-toggle').click + + page.within('.content ul.dropdown-menu.dropdown-menu-right li') do + click_link('Popularity') + end + + page.within('.mr-list') do + page.within('li.merge-request:nth-child(1)') do + expect(page).to have_content(merge_request.title) + expect(page).to have_content('2 1') + end + + page.within('li.merge-request:nth-child(2)') do + expect(page).to have_content(merge_request2.title) + expect(page).to have_content('1 2') + end + end + end + end +end diff --git a/spec/features/merge_requests/user_views_all_merge_requests_spec.rb b/spec/features/merge_requests/user_views_all_merge_requests_spec.rb new file mode 100644 index 00000000000..6c695bd7aa9 --- /dev/null +++ b/spec/features/merge_requests/user_views_all_merge_requests_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe 'User views all merge requests' do + let!(:closed_merge_request) { create(:closed_merge_request, source_project: project, target_project: project) } + let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let(:project) { create(:project, :public) } + + before do + visit(project_merge_requests_path(project, state: :all)) + end + + it 'shows all merge requests' do + expect(page).to have_content(merge_request.title).and have_content(closed_merge_request.title) + end +end diff --git a/spec/features/merge_requests/user_views_closed_merge_requests_spec.rb b/spec/features/merge_requests/user_views_closed_merge_requests_spec.rb new file mode 100644 index 00000000000..853809fe87a --- /dev/null +++ b/spec/features/merge_requests/user_views_closed_merge_requests_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe 'User views closed merge requests' do + let!(:closed_merge_request) { create(:closed_merge_request, source_project: project, target_project: project) } + let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let(:project) { create(:project, :public) } + + before do + visit(project_merge_requests_path(project, state: :closed)) + end + + it 'shows closed merge requests' do + expect(page).to have_content(closed_merge_request.title).and have_no_content(merge_request.title) + end +end diff --git a/spec/features/merge_requests/user_views_merged_merge_requests_spec.rb b/spec/features/merge_requests/user_views_merged_merge_requests_spec.rb new file mode 100644 index 00000000000..eb012694f1e --- /dev/null +++ b/spec/features/merge_requests/user_views_merged_merge_requests_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe 'User views merged merge requests' do + let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let!(:merged_merge_request) { create(:merged_merge_request, source_project: project, target_project: project) } + let(:project) { create(:project, :public) } + + before do + visit(project_merge_requests_path(project, state: :merged)) + end + + it 'shows merged merge requests' do + expect(page).to have_content(merged_merge_request.title).and have_no_content(merge_request.title) + end +end diff --git a/spec/features/merge_requests/user_views_open_merge_requests_spec.rb b/spec/features/merge_requests/user_views_open_merge_requests_spec.rb new file mode 100644 index 00000000000..115e548b691 --- /dev/null +++ b/spec/features/merge_requests/user_views_open_merge_requests_spec.rb @@ -0,0 +1,127 @@ +require 'spec_helper' + +describe 'User views open merge requests' do + set(:user) { create(:user) } + + shared_examples_for 'shows merge requests' do + it 'shows merge requests' do + expect(page).to have_content(project.name).and have_content(merge_request.source_project.name) + end + end + + context 'when project is public' do + set(:project) { create(:project, :public, :repository) } + + context 'when not signed in' do + context "when the target branch is the project's default branch" do + let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let!(:closed_merge_request) { create(:closed_merge_request, source_project: project, target_project: project) } + + before do + visit(project_merge_requests_path(project)) + end + + include_examples 'shows merge requests' + + it 'shows open merge requests' do + expect(page).to have_content(merge_request.title).and have_no_content(closed_merge_request.title) + end + + it 'does not show target branch name' do + expect(page).to have_content(merge_request.title) + expect(find('.issuable-info')).not_to have_content(project.default_branch) + end + end + + context "when the target branch is different from the project's default branch" do + let!(:merge_request) do + create(:merge_request, + source_project: project, + target_project: project, + source_branch: 'fix', + target_branch: 'feature_conflict') + end + + before do + visit(project_merge_requests_path(project)) + end + + it 'shows target branch name' do + expect(page).to have_content(merge_request.target_branch) + end + end + + context 'when a merge request has pipelines' do + let!(:build) { create :ci_build, pipeline: pipeline } + + let(:merge_request) do + create(:merge_request_with_diffs, + source_project: project, + target_project: project, + source_branch: 'merge-test') + end + + let(:pipeline) do + create(:ci_pipeline, + project: project, + sha: merge_request.diff_head_sha, + ref: merge_request.source_branch, + head_pipeline_of: merge_request) + end + + before do + project.enable_ci + + visit(project_merge_requests_path(project)) + end + + it 'shows pipeline status' do + page.within('.mr-list') do + expect(page).to have_link('Pipeline: pending') + end + end + end + end + + context 'when signed in' do + let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + + before do + project.add_developer(user) + sign_in(user) + + visit(project_merge_requests_path(project)) + end + + include_examples 'shows merge requests' + + it 'shows the new merge request button' do + expect(page).to have_link('New merge request') + end + + context 'when the project is archived' do + let(:project) { create(:project, :public, :repository, :archived) } + + it 'hides the new merge request button' do + expect(page).not_to have_link('New merge request') + end + end + end + end + + context 'when project is internal' do + let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + set(:project) { create(:project, :internal, :repository) } + + context 'when signed in' do + before do + project.add_developer(user) + sign_in(user) + + visit(project_merge_requests_path(project)) + end + + include_examples 'shows merge requests' + end + end +end diff --git a/spec/features/projects/issues/rss_spec.rb b/spec/features/projects/issues/rss_spec.rb deleted file mode 100644 index 0e1383cd607..00000000000 --- a/spec/features/projects/issues/rss_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'spec_helper' - -describe 'Project Issues RSS' do - let(:project) { create(:project, visibility_level: Gitlab::VisibilityLevel::PUBLIC) } - let(:path) { project_issues_path(project) } - - before do - create(:issue, project: project) - end - - context 'when signed in' do - let(:user) { create(:user) } - - before do - project.add_developer(user) - sign_in(user) - visit path - end - - it_behaves_like "it has an RSS button with current_user's feed token" - it_behaves_like "an autodiscoverable RSS feed with current_user's feed token" - end - - context 'when signed out' do - before do - visit path - end - - it_behaves_like "it has an RSS button without a feed token" - it_behaves_like "an autodiscoverable RSS feed without a feed token" - end -end diff --git a/spec/features/projects/issues/user_comments_on_issue_spec.rb b/spec/features/projects/issues/user_comments_on_issue_spec.rb deleted file mode 100644 index ba5b80ed04b..00000000000 --- a/spec/features/projects/issues/user_comments_on_issue_spec.rb +++ /dev/null @@ -1,84 +0,0 @@ -require "spec_helper" - -describe "User comments on issue", :js do - include Spec::Support::Helpers::Features::NotesHelpers - - let(:project) { create(:project_empty_repo, :public) } - let(:issue) { create(:issue, project: project) } - let(:user) { create(:user) } - - before do - project.add_guest(user) - sign_in(user) - - visit(project_issue_path(project, issue)) - end - - context "when adding comments" do - it "adds comment" do - content = "XML attached" - target_form = ".js-main-target-form" - - add_note(content) - - page.within(".note") do - expect(page).to have_content(content) - end - - page.within(target_form) do - find(".error-alert", visible: false) - end - end - - it "adds comment with code block" do - code_block_content = "Command [1]: /usr/local/bin/git , see [text](doc/text)" - comment = "```\n#{code_block_content}\n```" - - add_note(comment) - - wait_for_requests - - expect(page.find('pre code').text).to eq code_block_content - end - end - - context "when editing comments" do - it "edits comment" do - add_note("# Comment with a header") - - page.within(".note-body > .note-text") do - expect(page).to have_content("Comment with a header").and have_no_css("#comment-with-a-header") - end - - page.within(".main-notes-list") do - note = find(".note") - - note.hover - note.find(".js-note-edit").click - end - - expect(page).to have_css(".current-note-edit-form textarea") - - comment = "+1 Awesome!" - - page.within(".current-note-edit-form") do - fill_in("note[note]", with: comment) - find('textarea').send_keys [:control, :shift, 'p'] - expect(page).to have_selector('.current-note-edit-form .md-preview-holder') - expect(page.find('.current-note-edit-form .md-preview-holder p')).to have_content(comment) - end - - expect(page).to have_selector('.new-note .note-textarea') - - page.within(".current-note-edit-form") do - click_button("Save comment") - end - - wait_for_requests - - page.within(".note") do - expect(page).to have_content(comment) - end - end - end -end diff --git a/spec/features/projects/issues/user_creates_issue_spec.rb b/spec/features/projects/issues/user_creates_issue_spec.rb deleted file mode 100644 index 5e8662100c5..00000000000 --- a/spec/features/projects/issues/user_creates_issue_spec.rb +++ /dev/null @@ -1,90 +0,0 @@ -require "spec_helper" - -describe "User creates issue" do - let(:project) { create(:project_empty_repo, :public) } - let(:user) { create(:user) } - - context "when signed in as guest" do - before do - project.add_guest(user) - sign_in(user) - - visit(new_project_issue_path(project)) - end - - it "creates issue" do - page.within(".issue-form") do - expect(page).to have_no_content("Assign to") - .and have_no_content("Labels") - .and have_no_content("Milestone") - - expect(page.find('#issue_title')['placeholder']).to eq 'Title' - expect(page.find('#issue_description')['placeholder']).to eq 'Write a comment or drag your files here…' - end - - issue_title = "500 error on profile" - - fill_in("Title", with: issue_title) - click_button("Submit issue") - - expect(page).to have_content(issue_title) - .and have_content(user.name) - .and have_content(project.name) - end - end - - context "when signed in as developer", :js do - before do - project.add_developer(user) - sign_in(user) - - visit(new_project_issue_path(project)) - end - - context "when previewing" do - it "previews content" do - form = first(".gfm-form") - textarea = first(".gfm-form textarea") - - page.within(form) do - click_link("Preview") - - preview = find(".js-md-preview") # this element is findable only when the "Preview" link is clicked. - - expect(preview).to have_content("Nothing to preview.") - - click_link("Write") - fill_in("Description", with: "Bug fixed :smile:") - click_link("Preview") - - expect(preview).to have_css("gl-emoji") - expect(textarea).not_to be_visible - end - end - end - - context "with labels" do - LABEL_TITLES = %w(bug feature enhancement).freeze - - before do - LABEL_TITLES.each do |title| - create(:label, project: project, title: title) - end - end - - it "creates issue" do - issue_title = "500 error on profile" - - fill_in("Title", with: issue_title) - click_button("Label") - click_link(LABEL_TITLES.first) - click_button("Submit issue") - - expect(page).to have_content(issue_title) - .and have_content(user.name) - .and have_content(project.name) - .and have_content(LABEL_TITLES.first) - end - end - end -end diff --git a/spec/features/projects/issues/user_edits_issue_spec.rb b/spec/features/projects/issues/user_edits_issue_spec.rb deleted file mode 100644 index 1d9c3abc20f..00000000000 --- a/spec/features/projects/issues/user_edits_issue_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require "spec_helper" - -describe "User edits issue", :js do - set(:project) { create(:project_empty_repo, :public) } - set(:user) { create(:user) } - set(:issue) { create(:issue, project: project, author: user) } - - before do - project.add_developer(user) - sign_in(user) - - visit(edit_project_issue_path(project, issue)) - end - - it "previews content" do - form = first(".gfm-form") - - page.within(form) do - fill_in("Description", with: "Bug fixed :smile:") - click_link("Preview") - end - - expect(form).to have_link("Write") - end -end diff --git a/spec/features/projects/issues/user_sorts_issues_spec.rb b/spec/features/projects/issues/user_sorts_issues_spec.rb deleted file mode 100644 index 7d261ec7dae..00000000000 --- a/spec/features/projects/issues/user_sorts_issues_spec.rb +++ /dev/null @@ -1,63 +0,0 @@ -require "spec_helper" - -describe "User sorts issues" do - set(:user) { create(:user) } - set(:group) { create(:group) } - set(:project) { create(:project_empty_repo, :public, group: group) } - set(:issue1) { create(:issue, project: project) } - set(:issue2) { create(:issue, project: project) } - set(:issue3) { create(:issue, project: project) } - - before do - create_list(:award_emoji, 2, :upvote, awardable: issue1) - create_list(:award_emoji, 2, :downvote, awardable: issue2) - create(:award_emoji, :downvote, awardable: issue1) - create(:award_emoji, :upvote, awardable: issue2) - - sign_in(user) - - visit(project_issues_path(project)) - end - - it 'keeps the sort option' do - find('button.dropdown-toggle').click - - page.within('.content ul.dropdown-menu.dropdown-menu-right li') do - click_link('Milestone') - end - - visit(issues_dashboard_path(assignee_id: user.id)) - - expect(find('.issues-filters a.is-active')).to have_content('Milestone') - - visit(project_issues_path(project)) - - expect(find('.issues-filters a.is-active')).to have_content('Milestone') - - visit(issues_group_path(group)) - - expect(find('.issues-filters a.is-active')).to have_content('Milestone') - end - - it "sorts by popularity" do - find("button.dropdown-toggle").click - - page.within(".content ul.dropdown-menu.dropdown-menu-right li") do - click_link("Popularity") - end - - page.within(".issues-list") do - page.within("li.issue:nth-child(1)") do - expect(page).to have_content(issue1.title) - end - - page.within("li.issue:nth-child(2)") do - expect(page).to have_content(issue2.title) - end - - page.within("li.issue:nth-child(3)") do - expect(page).to have_content(issue3.title) - end - end - end -end diff --git a/spec/features/projects/issues/user_toggles_subscription_spec.rb b/spec/features/projects/issues/user_toggles_subscription_spec.rb deleted file mode 100644 index c2b2a193682..00000000000 --- a/spec/features/projects/issues/user_toggles_subscription_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -require "spec_helper" - -describe "User toggles subscription", :js do - let(:project) { create(:project_empty_repo, :public) } - let(:user) { create(:user) } - let(:issue) { create(:issue, project: project, author: user) } - - before do - project.add_developer(user) - sign_in(user) - - visit(project_issue_path(project, issue)) - end - - it "unsubscribes from issue" do - subscription_button = find(".js-issuable-subscribe-button") - - # Check we're subscribed. - expect(subscription_button).to have_css("button.is-checked") - - # Toggle subscription. - find(".js-issuable-subscribe-button button").click - wait_for_requests - - # Check we're unsubscribed. - expect(subscription_button).to have_css("button:not(.is-checked)") - end -end diff --git a/spec/features/projects/issues/user_views_issue_spec.rb b/spec/features/projects/issues/user_views_issue_spec.rb deleted file mode 100644 index 117e5986f29..00000000000 --- a/spec/features/projects/issues/user_views_issue_spec.rb +++ /dev/null @@ -1,50 +0,0 @@ -require "spec_helper" - -describe "User views issue" do - set(:project) { create(:project_empty_repo, :public) } - set(:user) { create(:user) } - set(:issue) { create(:issue, project: project, description: "# Description header", author: user) } - - before do - project.add_developer(user) - sign_in(user) - - visit(project_issue_path(project, issue)) - end - - it { expect(page).to have_header_with_correct_id_and_link(1, "Description header", "description-header") } - - it 'shows the merge request and issue actions', :aggregate_failures do - expect(page).to have_link('New issue') - expect(page).to have_button('Create merge request') - expect(page).to have_link('Close issue') - end - - context 'when the project is archived' do - let(:project) { create(:project, :public, :archived) } - - it 'hides the merge request and issue actions', :aggregate_failures do - expect(page).not_to have_link('New issue') - expect(page).not_to have_button('Create merge request') - expect(page).not_to have_link('Close issue') - end - end - - describe 'user status' do - subject { visit(project_issue_path(project, issue)) } - - describe 'showing status of the author of the issue' do - it_behaves_like 'showing user status' do - let(:user_with_status) { issue.author } - end - end - - describe 'showing status of a user who commented on an issue', :js do - let!(:note) { create(:note, noteable: issue, project: project, author: user_with_status) } - - it_behaves_like 'showing user status' do - let(:user_with_status) { create(:user) } - end - end - end -end diff --git a/spec/features/projects/issues/user_views_issues_spec.rb b/spec/features/projects/issues/user_views_issues_spec.rb deleted file mode 100644 index 58afb4efb86..00000000000 --- a/spec/features/projects/issues/user_views_issues_spec.rb +++ /dev/null @@ -1,116 +0,0 @@ -require "spec_helper" - -describe "User views issues" do - let!(:closed_issue) { create(:closed_issue, project: project) } - let!(:open_issue1) { create(:issue, project: project) } - let!(:open_issue2) { create(:issue, project: project) } - set(:user) { create(:user) } - - shared_examples "opens issue from list" do - it "opens issue" do - click_link(issue.title) - - expect(page).to have_content(issue.title) - end - end - - shared_examples "open issues" do - context "open issues" do - let(:label) { create(:label, project: project, title: "bug") } - - before do - open_issue1.labels << label - - visit(project_issues_path(project, state: :opened)) - end - - it "shows open issues" do - expect(page).to have_content(project.name) - .and have_content(open_issue1.title) - .and have_content(open_issue2.title) - .and have_no_content(closed_issue.title) - .and have_no_selector(".js-new-board-list") - end - - it "opens issues by label" do - page.within(".issues-list") do - click_link(label.title) - end - - expect(page).to have_content(open_issue1.title) - .and have_no_content(open_issue2.title) - .and have_no_content(closed_issue.title) - end - - include_examples "opens issue from list" do - let(:issue) { open_issue1 } - end - end - end - - shared_examples "closed issues" do - context "closed issues" do - before do - visit(project_issues_path(project, state: :closed)) - end - - it "shows closed issues" do - expect(page).to have_content(project.name) - .and have_content(closed_issue.title) - .and have_no_content(open_issue1.title) - .and have_no_content(open_issue2.title) - .and have_no_selector(".js-new-board-list") - end - - include_examples "opens issue from list" do - let(:issue) { closed_issue } - end - end - end - - shared_examples "all issues" do - context "all issues" do - before do - visit(project_issues_path(project, state: :all)) - end - - it "shows all issues" do - expect(page).to have_content(project.name) - .and have_content(closed_issue.title) - .and have_content(open_issue1.title) - .and have_content(open_issue2.title) - .and have_no_selector(".js-new-board-list") - end - - include_examples "opens issue from list" do - let(:issue) { closed_issue } - end - end - end - - %w[internal public].each do |visibility| - shared_examples "#{visibility} project" do - context "when project is #{visibility}" do - let(:project) { create(:project_empty_repo, :"#{visibility}") } - - include_examples "open issues" - include_examples "closed issues" - include_examples "all issues" - end - end - end - - context "when signed in as developer" do - before do - project.add_developer(user) - sign_in(user) - end - - include_examples "public project" - include_examples "internal project" - end - - context "when not signed in" do - include_examples "public project" - end -end diff --git a/spec/features/projects/merge_requests/user_accepts_merge_request_spec.rb b/spec/features/projects/merge_requests/user_accepts_merge_request_spec.rb deleted file mode 100644 index 01aeed93947..00000000000 --- a/spec/features/projects/merge_requests/user_accepts_merge_request_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -require 'spec_helper' - -describe 'User accepts a merge request', :js do - let(:merge_request) { create(:merge_request, :with_diffs, :simple, source_project: project) } - let(:project) { create(:project, :public, :repository) } - let(:user) { create(:user) } - - before do - project.add_developer(user) - sign_in(user) - end - - it 'presents merged merge request content' do - visit(merge_request_path(merge_request)) - - click_button('Merge') - - expect(page).to have_content("The changes were merged into #{merge_request.target_branch} with \ - #{merge_request.short_merge_commit_sha}") - end - - context 'with removing the source branch' do - before do - visit(merge_request_path(merge_request)) - end - - it 'accepts a merge request' do - check('Remove source branch') - click_button('Merge') - - expect(page).to have_content('The changes were merged into') - expect(page).not_to have_selector('.js-remove-branch-button') - - # Wait for View Resource requests to complete so they don't blow up if they are - # only handled after `DatabaseCleaner` has already run. - wait_for_requests - end - end - - context 'without removing the source branch' do - before do - visit(merge_request_path(merge_request)) - end - - it 'accepts a merge request' do - click_button('Merge') - - expect(page).to have_content('The changes were merged into') - expect(page).to have_selector('.js-remove-branch-button') - - # Wait for View Resource requests to complete so they don't blow up if they are - # only handled after `DatabaseCleaner` has already run - wait_for_requests - end - end - - context 'when a URL has an anchor' do - before do - visit(merge_request_path(merge_request, anchor: 'note_123')) - end - - it 'accepts a merge request' do - check('Remove source branch') - click_button('Merge') - - expect(page).to have_content('The changes were merged into') - expect(page).not_to have_selector('.js-remove-branch-button') - - # Wait for View Resource requests to complete so they don't blow up if they are - # only handled after `DatabaseCleaner` has already run - wait_for_requests - end - end - - context 'when modifying the merge commit message' do - before do - merge_request.mark_as_mergeable - - visit(merge_request_path(merge_request)) - end - - it 'accepts a merge request' do - click_button('Modify commit message') - fill_in('Commit message', with: 'wow such merge') - - click_button('Merge') - - page.within('.status-box') do - expect(page).to have_content('Merged') - end - end - end -end diff --git a/spec/features/projects/merge_requests/user_closes_merge_request_spec.rb b/spec/features/projects/merge_requests/user_closes_merge_request_spec.rb deleted file mode 100644 index 2d12d690151..00000000000 --- a/spec/features/projects/merge_requests/user_closes_merge_request_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'spec_helper' - -describe 'User closes a merge requests', :js do - let(:project) { create(:project, :repository) } - let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:user) { create(:user) } - - before do - project.add_maintainer(user) - sign_in(user) - - visit(merge_request_path(merge_request)) - end - - it 'closes a merge request' do - click_link('Close merge request', match: :first) - - expect(page).to have_content(merge_request.title) - expect(page).to have_content('Closed by') - end -end diff --git a/spec/features/projects/merge_requests/user_comments_on_commit_spec.rb b/spec/features/projects/merge_requests/user_comments_on_commit_spec.rb deleted file mode 100644 index 8ea358bcc70..00000000000 --- a/spec/features/projects/merge_requests/user_comments_on_commit_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'spec_helper' - -describe 'User comments on a commit', :js do - include MergeRequestDiffHelpers - include RepoHelpers - - let(:project) { create(:project, :repository) } - let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:user) { create(:user) } - - before do - project.add_maintainer(user) - sign_in(user) - - visit(project_commit_path(project, sample_commit.id)) - end - - include_examples 'comment on merge request file' -end diff --git a/spec/features/projects/merge_requests/user_comments_on_diff_spec.rb b/spec/features/projects/merge_requests/user_comments_on_diff_spec.rb deleted file mode 100644 index 441b080bee5..00000000000 --- a/spec/features/projects/merge_requests/user_comments_on_diff_spec.rb +++ /dev/null @@ -1,173 +0,0 @@ -require 'spec_helper' - -describe 'User comments on a diff', :js do - include MergeRequestDiffHelpers - include RepoHelpers - - 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 - let(:user) { create(:user) } - - before do - project.add_maintainer(user) - sign_in(user) - - visit(diffs_project_merge_request_path(project, merge_request)) - end - - context 'when viewing comments' do - context 'when toggling inline comments' do - context 'in a single file' do - it 'hides a comment' do - click_diff_line(find("[id='#{sample_compare.changes[1][:line_code]}']")) - - page.within('.js-discussion-note-form') do - fill_in('note_note', with: 'Line is wrong') - click_button('Comment') - end - - page.within('.files > div:nth-child(3)') do - expect(page).to have_content('Line is wrong') - - find('.js-btn-vue-toggle-comments').click - - expect(page).not_to have_content('Line is wrong') - end - end - end - - context 'in multiple files' do - it 'toggles comments' do - click_diff_line(find("[id='#{sample_compare.changes[0][:line_code]}']")) - - page.within('.js-discussion-note-form') do - fill_in('note_note', with: 'Line is correct') - click_button('Comment') - end - - wait_for_requests - - page.within('.files > div:nth-child(2) .note-body > .note-text') do - expect(page).to have_content('Line is correct') - end - - click_diff_line(find("[id='#{sample_compare.changes[1][:line_code]}']")) - - page.within('.js-discussion-note-form') do - fill_in('note_note', with: 'Line is wrong') - click_button('Comment') - end - - wait_for_requests - - # Hide the comment. - page.within('.files > div:nth-child(3)') do - find('.js-btn-vue-toggle-comments').click - - expect(page).not_to have_content('Line is wrong') - end - - # At this moment a user should see only one comment. - # The other one should be hidden. - page.within('.files > div:nth-child(2) .note-body > .note-text') do - expect(page).to have_content('Line is correct') - end - - # Show the comment. - page.within('.files > div:nth-child(3)') do - find('.js-btn-vue-toggle-comments').click - end - - # Now both the comments should be shown. - page.within('.files > div:nth-child(3) .note-body > .note-text') do - expect(page).to have_content('Line is wrong') - end - - page.within('.files > div:nth-child(2) .note-body > .note-text') do - expect(page).to have_content('Line is correct') - end - - # Check the same comments in the side-by-side view. - execute_script("window.scrollTo(0,0);") - click_button 'Side-by-side' - - wait_for_requests - - page.within('.files > div:nth-child(3) .parallel .note-body > .note-text') do - expect(page).to have_content('Line is wrong') - end - - page.within('.files > div:nth-child(2) .parallel .note-body > .note-text') do - expect(page).to have_content('Line is correct') - end - end - end - end - end - - context 'when adding comments' do - include_examples 'comment on merge request file' - end - - context 'when editing comments' do - it 'edits a comment' do - click_diff_line(find("[id='#{sample_commit.line_code}']")) - - page.within('.js-discussion-note-form') do - fill_in(:note_note, with: 'Line is wrong') - click_button('Comment') - end - - page.within('.diff-file:nth-of-type(5) .discussion .note') do - find('.js-note-edit').click - - page.within('.current-note-edit-form') do - fill_in('note_note', with: 'Typo, please fix') - click_button('Save comment') - end - - expect(page).not_to have_button('Save comment', disabled: true) - end - - page.within('.diff-file:nth-of-type(5) .discussion .note') do - expect(page).to have_content('Typo, please fix').and have_no_content('Line is wrong') - end - end - end - - context 'when deleting comments' do - it 'deletes a comment' do - click_diff_line(find("[id='#{sample_commit.line_code}']")) - - page.within('.js-discussion-note-form') do - fill_in(:note_note, with: 'Line is wrong') - click_button('Comment') - end - - page.within('.notes-tab .badge') do - expect(page).to have_content('1') - end - - page.within('.diff-file:nth-of-type(5) .discussion .note') do - find('.more-actions').click - find('.more-actions .dropdown-menu li', match: :first) - - accept_confirm { find('.js-note-delete').click } - end - - page.within('.merge-request-tabs') do - find('.notes-tab').click - end - - wait_for_requests - - expect(page).not_to have_css('.notes .discussion') - - page.within('.notes-tab .badge') do - expect(page).to have_content('0') - end - end - end -end diff --git a/spec/features/projects/merge_requests/user_comments_on_merge_request_spec.rb b/spec/features/projects/merge_requests/user_comments_on_merge_request_spec.rb deleted file mode 100644 index 69bdab85d81..00000000000 --- a/spec/features/projects/merge_requests/user_comments_on_merge_request_spec.rb +++ /dev/null @@ -1,49 +0,0 @@ -require 'spec_helper' - -describe 'User comments on a merge request', :js do - include RepoHelpers - - let(:project) { create(:project, :repository) } - let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:user) { create(:user) } - - before do - project.add_maintainer(user) - sign_in(user) - - visit(merge_request_path(merge_request)) - end - - it 'adds a comment' do - page.within('.js-main-target-form') do - fill_in('note[note]', with: '# Comment with a header') - click_button('Comment') - end - - wait_for_requests - - page.within('.note') do - expect(page).to have_content('Comment with a header') - expect(page).not_to have_css('#comment-with-a-header') - end - end - - it 'loads new comment' do - # Add new comment in background in order to check - # if it's going to be loaded automatically for current user. - create(:diff_note_on_merge_request, project: project, noteable: merge_request, author: user, note: 'Line is wrong') - # Trigger a refresh of notes. - execute_script("$(document).trigger('visibilitychange');") - wait_for_requests - - page.within('.notes .discussion') do - expect(page).to have_content("#{user.name} #{user.to_reference} started a discussion") - expect(page).to have_content(sample_commit.line_code_path) - expect(page).to have_content('Line is wrong') - end - - page.within('.notes-tab .badge') do - expect(page).to have_content('1') - end - end -end diff --git a/spec/features/projects/merge_requests/user_creates_merge_request_spec.rb b/spec/features/projects/merge_requests/user_creates_merge_request_spec.rb deleted file mode 100644 index 38b4e4a6d1b..00000000000 --- a/spec/features/projects/merge_requests/user_creates_merge_request_spec.rb +++ /dev/null @@ -1,84 +0,0 @@ -require "spec_helper" - -describe "User creates a merge request", :js do - include ProjectForksHelper - - let(:title) { "Some feature" } - let(:project) { create(:project, :repository) } - let(:user) { create(:user) } - - before do - project.add_maintainer(user) - sign_in(user) - end - - it "creates a merge request" do - visit(project_new_merge_request_path(project)) - - find(".js-source-branch").click - click_link("fix") - - find(".js-target-branch").click - click_link("feature") - - click_button("Compare branches") - - fill_in("Title", with: title) - click_button("Submit merge request") - - page.within(".merge-request") do - expect(page).to have_content(title) - end - end - - context "to a forked project" do - let(:forked_project) { fork_project(project, user, namespace: user.namespace, repository: true) } - - it "creates a merge request" do - visit(project_new_merge_request_path(forked_project)) - - expect(page).to have_content("Source branch").and have_content("Target branch") - expect(find("#merge_request_target_project_id", visible: false).value).to eq(project.id.to_s) - - click_button("Compare branches and continue") - - expect(page).to have_content("You must select source and target branch") - - first(".js-source-project").click - first(".dropdown-source-project a", text: forked_project.full_path) - - first(".js-target-project").click - first(".dropdown-target-project a", text: project.full_path) - - first(".js-source-branch").click - - wait_for_requests - - source_branch = "fix" - - first(".js-source-branch-dropdown .dropdown-content a", text: source_branch).click - - click_button("Compare branches and continue") - - expect(page).to have_css("h3.page-title", text: "New Merge Request") - - page.within("form#new_merge_request") do - fill_in("Title", with: title) - end - - click_button("Assignee") - - expect(find(".js-assignee-search")["data-project-id"]).to eq(project.id.to_s) - - page.within(".dropdown-menu-user") do - expect(page).to have_content("Unassigned") - .and have_content(user.name) - .and have_content(project.users.first.name) - end - - click_button("Submit merge request") - - expect(page).to have_content(title).and have_content("Request to merge #{user.namespace.name}:#{source_branch} into master") - end - end -end diff --git a/spec/features/projects/merge_requests/user_edits_merge_request_spec.rb b/spec/features/projects/merge_requests/user_edits_merge_request_spec.rb deleted file mode 100644 index 7de0f9daac6..00000000000 --- a/spec/features/projects/merge_requests/user_edits_merge_request_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'spec_helper' - -describe 'User edits a merge request', :js do - include Select2Helper - - let(:project) { create(:project, :repository) } - let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:user) { create(:user) } - - before do - project.add_maintainer(user) - sign_in(user) - - visit(edit_project_merge_request_path(project, merge_request)) - end - - it 'changes the target branch' do - expect(page).to have_content('Target branch') - - select2('merge-test', from: '#merge_request_target_branch') - click_button('Save changes') - - expect(page).to have_content("Request to merge #{merge_request.source_branch} into merge-test") - expect(page).to have_content("changed target branch from #{merge_request.target_branch} to merge-test") - end -end diff --git a/spec/features/projects/merge_requests/user_manages_subscription_spec.rb b/spec/features/projects/merge_requests/user_manages_subscription_spec.rb deleted file mode 100644 index 68a835e7f77..00000000000 --- a/spec/features/projects/merge_requests/user_manages_subscription_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'spec_helper' - -describe 'User manages subscription', :js do - let(:project) { create(:project, :public, :repository) } - let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:user) { create(:user) } - - before do - project.add_maintainer(user) - sign_in(user) - - visit(merge_request_path(merge_request)) - end - - it 'toggles subscription' do - page.within('.js-issuable-subscribe-button') do - expect(page).to have_css 'button:not(.is-checked)' - find('button:not(.is-checked)').click - - wait_for_requests - - expect(page).to have_css 'button.is-checked' - find('button.is-checked').click - - wait_for_requests - - expect(page).to have_css 'button:not(.is-checked)' - end - end -end diff --git a/spec/features/projects/merge_requests/user_merges_merge_request_spec.rb b/spec/features/projects/merge_requests/user_merges_merge_request_spec.rb deleted file mode 100644 index 6539e6e9208..00000000000 --- a/spec/features/projects/merge_requests/user_merges_merge_request_spec.rb +++ /dev/null @@ -1,43 +0,0 @@ -require "spec_helper" - -describe "User merges a merge request", :js do - let(:user) { project.owner } - - before do - sign_in(user) - end - - shared_examples "fast forward merge a merge request" do - it "merges a merge request" do - expect(page).to have_content("Fast-forward merge without a merge commit").and have_button("Merge") - - page.within(".mr-state-widget") do - click_button("Merge") - end - - page.within(".status-box") do - expect(page).to have_content("Merged") - end - end - end - - context "ff-only merge" do - let(:project) { create(:project, :public, :repository, merge_requests_ff_only_enabled: true) } - - before do - visit(merge_request_path(merge_request)) - end - - context "when branch is rebased" do - let!(:merge_request) { create(:merge_request, :rebased, source_project: project) } - - it_behaves_like "fast forward merge a merge request" - end - - context "when branch is merged" do - let!(:merge_request) { create(:merge_request, :merged_target, source_project: project) } - - it_behaves_like "fast forward merge a merge request" - end - end -end diff --git a/spec/features/projects/merge_requests/user_rebases_merge_request_spec.rb b/spec/features/projects/merge_requests/user_rebases_merge_request_spec.rb deleted file mode 100644 index 92e1c9942b1..00000000000 --- a/spec/features/projects/merge_requests/user_rebases_merge_request_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require "spec_helper" - -describe "User rebases a merge request", :js do - let(:merge_request) { create(:merge_request, :simple, source_project: project) } - let(:user) { project.owner } - - before do - sign_in(user) - end - - shared_examples "rebases" do - it "rebases" do - visit(merge_request_path(merge_request)) - - expect(page).to have_button("Rebase") - - click_button("Rebase") - - expect(page).to have_content("Rebase in progress") - end - end - - context "when merge is regular" do - let(:project) { create(:project, :public, :repository, merge_requests_rebase_enabled: true) } - - it_behaves_like "rebases" - end - - context "when merge is ff-only" do - let(:project) { create(:project, :public, :repository, merge_requests_ff_only_enabled: true) } - - it_behaves_like "rebases" - end -end diff --git a/spec/features/projects/merge_requests/user_reopens_merge_request_spec.rb b/spec/features/projects/merge_requests/user_reopens_merge_request_spec.rb deleted file mode 100644 index 745b4537e72..00000000000 --- a/spec/features/projects/merge_requests/user_reopens_merge_request_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'spec_helper' - -describe 'User reopens a merge requests', :js do - let(:project) { create(:project, :public, :repository) } - let!(:merge_request) { create(:closed_merge_request, source_project: project, target_project: project) } - let(:user) { create(:user) } - - before do - project.add_maintainer(user) - sign_in(user) - - visit(merge_request_path(merge_request)) - end - - it 'reopens a merge request' do - click_link('Reopen merge request', match: :first) - - page.within('.status-box') do - expect(page).to have_content('Open') - end - end -end diff --git a/spec/features/projects/merge_requests/user_reverts_merge_request_spec.rb b/spec/features/projects/merge_requests/user_reverts_merge_request_spec.rb deleted file mode 100644 index 67b6aefb2d8..00000000000 --- a/spec/features/projects/merge_requests/user_reverts_merge_request_spec.rb +++ /dev/null @@ -1,69 +0,0 @@ -require 'spec_helper' - -describe 'User reverts a merge request', :js do - let(:merge_request) { create(:merge_request, :with_diffs, :simple, source_project: project) } - let(:project) { create(:project, :public, :repository) } - let(:user) { create(:user) } - - before do - project.add_developer(user) - sign_in(user) - - visit(merge_request_path(merge_request)) - - click_button('Merge') - - wait_for_requests - - visit(merge_request_path(merge_request)) - end - - it 'reverts a merge request' do - find("a[href='#modal-revert-commit']").click - - page.within('#modal-revert-commit') do - uncheck('create_merge_request') - click_button('Revert') - end - - expect(page).to have_content('The merge request has been successfully reverted.') - - wait_for_requests - end - - it 'does not revert a merge request that was previously reverted' do - find("a[href='#modal-revert-commit']").click - - page.within('#modal-revert-commit') do - uncheck('create_merge_request') - click_button('Revert') - end - - find("a[href='#modal-revert-commit']").click - - page.within('#modal-revert-commit') do - uncheck('create_merge_request') - click_button('Revert') - end - - expect(page).to have_content('Sorry, we cannot revert this merge request automatically.') - end - - it 'reverts a merge request in a new merge request' do - find("a[href='#modal-revert-commit']").click - - page.within('#modal-revert-commit') do - click_button('Revert') - end - - expect(page).to have_content('The merge request has been successfully reverted. You can now submit a merge request to get this change into the original branch.') - end - - it 'cannot revert a merge requests for an archived project' do - project.update!(archived: true) - - visit(merge_request_path(merge_request)) - - expect(page).not_to have_link('Revert') - end -end diff --git a/spec/features/projects/merge_requests/user_sorts_merge_requests_spec.rb b/spec/features/projects/merge_requests/user_sorts_merge_requests_spec.rb deleted file mode 100644 index 82cfe600d52..00000000000 --- a/spec/features/projects/merge_requests/user_sorts_merge_requests_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -require 'spec_helper' - -describe 'User sorts merge requests' do - include CookieHelper - - let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let!(:merge_request2) do - create(:merge_request_with_diffs, source_project: project, target_project: project, source_branch: 'merge-test') - end - set(:user) { create(:user) } - set(:group) { create(:group) } - set(:group_member) { create(:group_member, :maintainer, user: user, group: group) } - set(:project) { create(:project, :public, group: group) } - - before do - sign_in(user) - - visit(project_merge_requests_path(project)) - end - - it 'keeps the sort option' do - find('button.dropdown-toggle').click - - page.within('.content ul.dropdown-menu.dropdown-menu-right li') do - click_link('Milestone') - end - - visit(merge_requests_dashboard_path(assignee_id: user.id)) - - expect(find('.issues-filters a.is-active')).to have_content('Milestone') - - visit(project_merge_requests_path(project)) - - expect(find('.issues-filters a.is-active')).to have_content('Milestone') - - visit(merge_requests_group_path(group)) - - expect(find('.issues-filters a.is-active')).to have_content('Milestone') - end - - it 'fallbacks to issuable_sort cookie key when remembering the sorting option' do - set_cookie('issuable_sort', 'milestone') - - visit(merge_requests_dashboard_path(assignee_id: user.id)) - - expect(find('.issues-filters a.is-active')).to have_content('Milestone') - end - - it 'separates remember sorting with issues' do - create(:issue, project: project) - - find('button.dropdown-toggle').click - - page.within('.content ul.dropdown-menu.dropdown-menu-right li') do - click_link('Milestone') - end - - visit(project_issues_path(project)) - - expect(find('.issues-filters a.is-active')).not_to have_content('Milestone') - end - - context 'when merge requests have awards' do - before do - create_list(:award_emoji, 2, awardable: merge_request) - create(:award_emoji, :downvote, awardable: merge_request) - - create(:award_emoji, awardable: merge_request2) - create_list(:award_emoji, 2, :downvote, awardable: merge_request2) - end - - it 'sorts by popularity' do - find('button.dropdown-toggle').click - - page.within('.content ul.dropdown-menu.dropdown-menu-right li') do - click_link('Popularity') - end - - page.within('.mr-list') do - page.within('li.merge-request:nth-child(1)') do - expect(page).to have_content(merge_request.title) - expect(page).to have_content('2 1') - end - - page.within('li.merge-request:nth-child(2)') do - expect(page).to have_content(merge_request2.title) - expect(page).to have_content('1 2') - end - end - end - end -end diff --git a/spec/features/projects/merge_requests/user_views_all_merge_requests_spec.rb b/spec/features/projects/merge_requests/user_views_all_merge_requests_spec.rb deleted file mode 100644 index 6c695bd7aa9..00000000000 --- a/spec/features/projects/merge_requests/user_views_all_merge_requests_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'spec_helper' - -describe 'User views all merge requests' do - let!(:closed_merge_request) { create(:closed_merge_request, source_project: project, target_project: project) } - let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:project) { create(:project, :public) } - - before do - visit(project_merge_requests_path(project, state: :all)) - end - - it 'shows all merge requests' do - expect(page).to have_content(merge_request.title).and have_content(closed_merge_request.title) - end -end diff --git a/spec/features/projects/merge_requests/user_views_closed_merge_requests_spec.rb b/spec/features/projects/merge_requests/user_views_closed_merge_requests_spec.rb deleted file mode 100644 index 853809fe87a..00000000000 --- a/spec/features/projects/merge_requests/user_views_closed_merge_requests_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'spec_helper' - -describe 'User views closed merge requests' do - let!(:closed_merge_request) { create(:closed_merge_request, source_project: project, target_project: project) } - let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:project) { create(:project, :public) } - - before do - visit(project_merge_requests_path(project, state: :closed)) - end - - it 'shows closed merge requests' do - expect(page).to have_content(closed_merge_request.title).and have_no_content(merge_request.title) - end -end diff --git a/spec/features/projects/merge_requests/user_views_diffs_spec.rb b/spec/features/projects/merge_requests/user_views_diffs_spec.rb deleted file mode 100644 index b1bfe9e5de3..00000000000 --- a/spec/features/projects/merge_requests/user_views_diffs_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -require 'spec_helper' - -describe 'User views diffs', :js do - let(:merge_request) do - create(:merge_request_with_diffs, source_project: project, target_project: project, source_branch: 'merge-test') - end - let(:project) { create(:project, :public, :repository) } - - before do - visit(diffs_project_merge_request_path(project, merge_request)) - - wait_for_requests - end - - shared_examples 'unfold diffs' do - it 'unfolds diffs' do - first('.js-unfold').click - - expect(find('.file-holder[id="a5cc2925ca8258af241be7e5b0381edf30266302"] .text-file')).to have_content('.bundle') - end - end - - it 'shows diffs' do - expect(page).to have_css('.tab-content #diffs.active') - expect(page).to have_css('#parallel-diff-btn', count: 1) - expect(page).to have_css('#inline-diff-btn', count: 1) - end - - it 'hides loading spinner after load' do - expect(page).not_to have_selector('.mr-loading-status .loading', visible: true) - end - - context 'when in the inline view' do - include_examples 'unfold diffs' - end - - context 'when in the side-by-side view' do - before do - click_button 'Side-by-side' - - wait_for_requests - end - - it 'shows diffs in parallel' do - expect(page).to have_css('.parallel') - end - - it 'toggles container class' do - expect(page).not_to have_css('.content-wrapper > .container-fluid.container-limited') - - click_link 'Commits' - - expect(page).to have_css('.content-wrapper > .container-fluid.container-limited') - end - - include_examples 'unfold diffs' - end -end diff --git a/spec/features/projects/merge_requests/user_views_merged_merge_requests_spec.rb b/spec/features/projects/merge_requests/user_views_merged_merge_requests_spec.rb deleted file mode 100644 index eb012694f1e..00000000000 --- a/spec/features/projects/merge_requests/user_views_merged_merge_requests_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'spec_helper' - -describe 'User views merged merge requests' do - let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let!(:merged_merge_request) { create(:merged_merge_request, source_project: project, target_project: project) } - let(:project) { create(:project, :public) } - - before do - visit(project_merge_requests_path(project, state: :merged)) - end - - it 'shows merged merge requests' do - expect(page).to have_content(merged_merge_request.title).and have_no_content(merge_request.title) - end -end diff --git a/spec/features/projects/merge_requests/user_views_open_merge_request_spec.rb b/spec/features/projects/merge_requests/user_views_open_merge_request_spec.rb deleted file mode 100644 index 6ac495aa03d..00000000000 --- a/spec/features/projects/merge_requests/user_views_open_merge_request_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -require 'spec_helper' - -describe 'User views an open merge request' do - let(:merge_request) do - create(:merge_request, source_project: project, target_project: project, description: '# Description header') - end - - context 'when a merge request does not have repository' do - let(:project) { create(:project, :public, :repository) } - - before do - visit(merge_request_path(merge_request)) - end - - it 'renders both the title and the description' do - node = find('.wiki h1 a#user-content-description-header') - expect(node[:href]).to end_with('#description-header') - - # Work around a weird Capybara behavior where calling `parent` on a node - # returns the whole document, not the node's actual parent element - expect(find(:xpath, "#{node.path}/..").text).to eq(merge_request.description[2..-1]) - - expect(page).to have_content(merge_request.title).and have_content(merge_request.description) - end - end - - context 'when a merge request has repository', :js do - let(:project) { create(:project, :public, :repository) } - - context 'when rendering description preview' do - let(:user) { create(:user) } - - before do - project.add_maintainer(user) - sign_in(user) - - visit(edit_project_merge_request_path(project, merge_request)) - end - - it 'renders empty description preview' do - find('.gfm-form').fill_in(:merge_request_description, with: '') - - page.within('.gfm-form') do - click_link('Preview') - - expect(find('.js-md-preview')).to have_content('Nothing to preview.') - end - end - - it 'renders description preview' do - find('.gfm-form').fill_in(:merge_request_description, with: ':+1: Nice') - - page.within('.gfm-form') do - click_link('Preview') - - expect(find('.js-md-preview')).to have_css('gl-emoji') - end - - expect(find('.gfm-form')).to have_css('.js-md-preview').and have_link('Write') - expect(find('#merge_request_description', visible: false)).not_to be_visible - end - end - - context 'when the branch is rebased on the target' do - let(:merge_request) { create(:merge_request, :rebased, source_project: project, target_project: project) } - - before do - visit(merge_request_path(merge_request)) - end - - it 'does not show diverged commits count' do - page.within('.mr-source-target') do - expect(page).not_to have_content(/([0-9]+ commit[s]? behind)/) - end - end - end - - context 'when the branch is diverged on the target' do - let(:merge_request) { create(:merge_request, :diverged, source_project: project, target_project: project) } - - before do - visit(merge_request_path(merge_request)) - end - - it 'shows diverged commits count' do - page.within('.mr-source-target') do - expect(page).to have_content(/([0-9]+ commits behind)/) - end - end - end - end -end diff --git a/spec/features/projects/merge_requests/user_views_open_merge_requests_spec.rb b/spec/features/projects/merge_requests/user_views_open_merge_requests_spec.rb deleted file mode 100644 index 115e548b691..00000000000 --- a/spec/features/projects/merge_requests/user_views_open_merge_requests_spec.rb +++ /dev/null @@ -1,127 +0,0 @@ -require 'spec_helper' - -describe 'User views open merge requests' do - set(:user) { create(:user) } - - shared_examples_for 'shows merge requests' do - it 'shows merge requests' do - expect(page).to have_content(project.name).and have_content(merge_request.source_project.name) - end - end - - context 'when project is public' do - set(:project) { create(:project, :public, :repository) } - - context 'when not signed in' do - context "when the target branch is the project's default branch" do - let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let!(:closed_merge_request) { create(:closed_merge_request, source_project: project, target_project: project) } - - before do - visit(project_merge_requests_path(project)) - end - - include_examples 'shows merge requests' - - it 'shows open merge requests' do - expect(page).to have_content(merge_request.title).and have_no_content(closed_merge_request.title) - end - - it 'does not show target branch name' do - expect(page).to have_content(merge_request.title) - expect(find('.issuable-info')).not_to have_content(project.default_branch) - end - end - - context "when the target branch is different from the project's default branch" do - let!(:merge_request) do - create(:merge_request, - source_project: project, - target_project: project, - source_branch: 'fix', - target_branch: 'feature_conflict') - end - - before do - visit(project_merge_requests_path(project)) - end - - it 'shows target branch name' do - expect(page).to have_content(merge_request.target_branch) - end - end - - context 'when a merge request has pipelines' do - let!(:build) { create :ci_build, pipeline: pipeline } - - let(:merge_request) do - create(:merge_request_with_diffs, - source_project: project, - target_project: project, - source_branch: 'merge-test') - end - - let(:pipeline) do - create(:ci_pipeline, - project: project, - sha: merge_request.diff_head_sha, - ref: merge_request.source_branch, - head_pipeline_of: merge_request) - end - - before do - project.enable_ci - - visit(project_merge_requests_path(project)) - end - - it 'shows pipeline status' do - page.within('.mr-list') do - expect(page).to have_link('Pipeline: pending') - end - end - end - end - - context 'when signed in' do - let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - - before do - project.add_developer(user) - sign_in(user) - - visit(project_merge_requests_path(project)) - end - - include_examples 'shows merge requests' - - it 'shows the new merge request button' do - expect(page).to have_link('New merge request') - end - - context 'when the project is archived' do - let(:project) { create(:project, :public, :repository, :archived) } - - it 'hides the new merge request button' do - expect(page).not_to have_link('New merge request') - end - end - end - end - - context 'when project is internal' do - let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - set(:project) { create(:project, :internal, :repository) } - - context 'when signed in' do - before do - project.add_developer(user) - sign_in(user) - - visit(project_merge_requests_path(project)) - end - - include_examples 'shows merge requests' - end - end -end diff --git a/spec/features/projects/merge_requests/user_views_user_status_on_merge_request_spec.rb b/spec/features/projects/merge_requests/user_views_user_status_on_merge_request_spec.rb deleted file mode 100644 index 78d9c6c6db1..00000000000 --- a/spec/features/projects/merge_requests/user_views_user_status_on_merge_request_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -describe 'Project > Merge request > View user status' do - let(:project) { create(:project, :public, :repository) } - let(:merge_request) do - create(:merge_request, source_project: project, target_project: project, author: create(:user)) - end - - subject { visit merge_request_path(merge_request) } - - describe 'the status of the merge request author' do - it_behaves_like 'showing user status' do - let(:user_with_status) { merge_request.author } - end - end - - context 'for notes', :js do - describe 'the status of the author of a note on a merge request' do - let(:note) { create(:note, noteable: merge_request, project: project, author: create(:user)) } - - it_behaves_like 'showing user status' do - let(:user_with_status) { note.author } - end - end - - describe 'the status of the author of a diff note on a merge request' do - let(:note) { create(:diff_note_on_merge_request, noteable: merge_request, project: project, author: create(:user)) } - - it_behaves_like 'showing user status' do - let(:user_with_status) { note.author } - end - end - end -end -- cgit v1.2.1