diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-10-21 10:08:36 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-10-21 10:08:36 +0300 |
commit | 48aff82709769b098321c738f3444b9bdaa694c6 (patch) | |
tree | e00c7c43e2d9b603a5a6af576b1685e400410dee /spec/features/issues | |
parent | 879f5329ee916a948223f8f43d77fba4da6cd028 (diff) |
Add latest changes from gitlab-org/gitlab@13-5-stable-eev13.5.0-rc42
Diffstat (limited to 'spec/features/issues')
-rw-r--r-- | spec/features/issues/csv_spec.rb | 4 | ||||
-rw-r--r-- | spec/features/issues/gfm_autocomplete_spec.rb | 24 | ||||
-rw-r--r-- | spec/features/issues/issue_sidebar_spec.rb | 136 | ||||
-rw-r--r-- | spec/features/issues/todo_spec.rb | 4 | ||||
-rw-r--r-- | spec/features/issues/user_edits_issue_spec.rb | 436 | ||||
-rw-r--r-- | spec/features/issues/user_sees_live_update_spec.rb | 2 | ||||
-rw-r--r-- | spec/features/issues/user_views_issue_spec.rb | 4 |
7 files changed, 325 insertions, 285 deletions
diff --git a/spec/features/issues/csv_spec.rb b/spec/features/issues/csv_spec.rb index 8d06bf24f8b..c93693ec40a 100644 --- a/spec/features/issues/csv_spec.rb +++ b/spec/features/issues/csv_spec.rb @@ -31,13 +31,13 @@ RSpec.describe 'Issues csv' do end it 'triggers an email export' do - expect(ExportCsvWorker).to receive(:perform_async).with(user.id, project.id, hash_including("project_id" => project.id)) + expect(IssuableExportCsvWorker).to receive(:perform_async).with(:issue, user.id, project.id, hash_including("project_id" => project.id)) request_csv end it "doesn't send request params to ExportCsvWorker" do - expect(ExportCsvWorker).to receive(:perform_async).with(anything, anything, hash_excluding("controller" => anything, "action" => anything)) + expect(IssuableExportCsvWorker).to receive(:perform_async).with(:issue, anything, anything, hash_excluding("controller" => anything, "action" => anything)) request_csv end diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb index 0165fba9ace..ff78b9e608f 100644 --- a/spec/features/issues/gfm_autocomplete_spec.rb +++ b/spec/features/issues/gfm_autocomplete_spec.rb @@ -6,7 +6,9 @@ RSpec.describe 'GFM autocomplete', :js do let_it_be(:user_xss_title) { 'eve <img src=x onerror=alert(2)<img src=x onerror=alert(1)>' } let_it_be(:user_xss) { create(:user, name: user_xss_title, username: 'xss.user') } let_it_be(:user) { create(:user, name: '💃speciąl someone💃', username: 'someone.special') } - let_it_be(:project) { create(:project) } + let_it_be(:group) { create(:group, name: 'Ancestor') } + let_it_be(:child_group) { create(:group, parent: group, name: 'My group') } + let_it_be(:project) { create(:project, group: child_group) } let_it_be(:label) { create(:label, project: project, title: 'special+') } let(:issue) { create(:issue, project: project) } @@ -530,7 +532,7 @@ RSpec.describe 'GFM autocomplete', :js do expect(page).to have_selector('.tribute-container', visible: true) - expect(find('.tribute-container ul', visible: true).text).to have_content(user_xss.username) + expect(find('.tribute-container ul', visible: true)).to have_text(user_xss.username) end it 'selects the first item for assignee dropdowns' do @@ -558,6 +560,24 @@ RSpec.describe 'GFM autocomplete', :js do expect(find('.tribute-container ul', visible: true)).to have_content(user.name) end + context 'when autocompleting for groups' do + it 'shows the group when searching for the name of the group' do + page.within '.timeline-content-form' do + find('#note-body').native.send_keys('@mygroup') + end + + expect(find('.tribute-container ul', visible: true)).to have_text('My group') + end + + it 'does not show the group when searching for the name of the parent of the group' do + page.within '.timeline-content-form' do + find('#note-body').native.send_keys('@ancestor') + end + + expect(find('.tribute-container ul', visible: true)).not_to have_text('My group') + end + end + context 'if a selected value has special characters' do it 'wraps the result in double quotes' do note = find('#note-body') diff --git a/spec/features/issues/issue_sidebar_spec.rb b/spec/features/issues/issue_sidebar_spec.rb index 38d11ee2560..94a1de06488 100644 --- a/spec/features/issues/issue_sidebar_spec.rb +++ b/spec/features/issues/issue_sidebar_spec.rb @@ -16,129 +16,83 @@ RSpec.describe 'Issue Sidebar' do sign_in(user) end - context 'assignee', :js do + context 'when concerning the assignee', :js do let(:user2) { create(:user) } let(:issue2) { create(:issue, project: project, author: user2) } - context 'when invite_members_version_a experiment is enabled' do - before do - stub_experiment_for_user(invite_members_version_a: true) - end + include_examples 'issuable invite members experiments' do + let(:issuable_path) { project_issue_path(project, issue2) } + end - context 'when user can not see invite members' do - before do - project.add_developer(user) - visit_issue(project, issue2) + context 'when user is a developer' do + before do + project.add_developer(user) + visit_issue(project, issue2) - find('.block.assignee .edit-link').click + find('.block.assignee .edit-link').click - wait_for_requests - end + wait_for_requests + end - it 'does not see link to invite members' do - page.within '.dropdown-menu-user' do - expect(page).not_to have_link('Invite Members') - end + it 'shows author in assignee dropdown' do + page.within '.dropdown-menu-user' do + expect(page).to have_content(user2.name) end end - context 'when user can see invite members' do - before do - project.add_maintainer(user) - visit_issue(project, issue2) - - find('.block.assignee .edit-link').click + it 'shows author when filtering assignee dropdown' do + page.within '.dropdown-menu-user' do + find('.dropdown-input-field').set(user2.name) wait_for_requests - end - it 'sees link to invite members' do - page.within '.dropdown-menu-user' do - expect(page).to have_link('Invite Members', href: project_project_members_path(project)) - expect(page).to have_selector('[data-track-event="click_invite_members"]') - expect(page).to have_selector("[data-track-label='edit_assignee']") - end + expect(page).to have_content(user2.name) end end - end - - context 'when invite_members_version_a experiment is not enabled' do - context 'when user is a developer' do - before do - project.add_developer(user) - visit_issue(project, issue2) - find('.block.assignee .edit-link').click + it 'assigns yourself' do + find('.block.assignee .dropdown-menu-toggle').click - wait_for_requests - end - - it 'shows author in assignee dropdown' do - page.within '.dropdown-menu-user' do - expect(page).to have_content(user2.name) - end - end + click_button 'assign yourself' - it 'shows author when filtering assignee dropdown' do - page.within '.dropdown-menu-user' do - find('.dropdown-input-field').native.send_keys user2.name - sleep 1 # Required to wait for end of input delay + wait_for_requests - wait_for_requests + find('.block.assignee .edit-link').click - expect(page).to have_content(user2.name) - end + page.within '.dropdown-menu-user' do + expect(page.find('.dropdown-header')).to be_visible + expect(page.find('.dropdown-menu-user-link.is-active')).to have_content(user.name) end + end - it 'assigns yourself' do - find('.block.assignee .dropdown-menu-toggle').click - - click_button 'assign yourself' - - wait_for_requests + it 'keeps your filtered term after filtering and dismissing the dropdown' do + find('.dropdown-input-field').set(user2.name) - find('.block.assignee .edit-link').click + wait_for_requests - page.within '.dropdown-menu-user' do - expect(page.find('.dropdown-header')).to be_visible - expect(page.find('.dropdown-menu-user-link.is-active')).to have_content(user.name) - end + page.within '.dropdown-menu-user' do + expect(page).not_to have_content 'Unassigned' + click_link user2.name end - it 'keeps your filtered term after filtering and dismissing the dropdown' do - find('.dropdown-input-field').native.send_keys user2.name - - wait_for_requests - - page.within '.dropdown-menu-user' do - expect(page).not_to have_content 'Unassigned' - click_link user2.name - end - - find('.js-right-sidebar').click - find('.block.assignee .edit-link').click + find('.js-right-sidebar').click + find('.block.assignee .edit-link').click - expect(page.all('.dropdown-menu-user li').length).to eq(1) - expect(find('.dropdown-input-field').value).to eq(user2.name) - end + expect(page.all('.dropdown-menu-user li').length).to eq(1) + expect(find('.dropdown-input-field').value).to eq(user2.name) end + end - context 'when user is a maintainer' do - before do - project.add_maintainer(user) - visit_issue(project, issue2) + it 'shows label text as "Apply" when assignees are changed' do + project.add_developer(user) + visit_issue(project, issue2) - find('.block.assignee .edit-link').click + find('.block.assignee .edit-link').click + wait_for_requests - wait_for_requests - end + click_on 'Unassigned' - it 'shows author in assignee dropdown and no invite link' do - page.within '.dropdown-menu-user' do - expect(page).not_to have_link('Invite Members') - end - end - end + expect(page).to have_link('Apply') end end diff --git a/spec/features/issues/todo_spec.rb b/spec/features/issues/todo_spec.rb index 3de33049db0..315d1c911a2 100644 --- a/spec/features/issues/todo_spec.rb +++ b/spec/features/issues/todo_spec.rb @@ -15,7 +15,7 @@ RSpec.describe 'Manually create a todo item from issue', :js do it 'creates todo when clicking button' do page.within '.issuable-sidebar' do - click_button 'Add a To Do' + click_button 'Add a to do' expect(page).to have_content 'Mark as done' end @@ -32,7 +32,7 @@ RSpec.describe 'Manually create a todo item from issue', :js do it 'marks a todo as done' do page.within '.issuable-sidebar' do - click_button 'Add a To Do' + click_button 'Add a to do' click_button 'Mark as done' end diff --git a/spec/features/issues/user_edits_issue_spec.rb b/spec/features/issues/user_edits_issue_spec.rb index 88b8e9624e2..de746415205 100644 --- a/spec/features/issues/user_edits_issue_spec.rb +++ b/spec/features/issues/user_edits_issue_spec.rb @@ -6,292 +6,356 @@ RSpec.describe "Issues > User edits issue", :js do let_it_be(:project) { create(:project_empty_repo, :public) } let_it_be(:project_with_milestones) { create(:project_empty_repo, :public) } let_it_be(:user) { create(:user) } - let_it_be(:issue) { create(:issue, project: project, author: user, assignees: [user]) } + let_it_be(:label_assigned) { create(:label, project: project, title: 'verisimilitude') } + let_it_be(:label_unassigned) { create(:label, project: project, title: 'syzygy') } + let_it_be(:issue) { create(:issue, project: project, author: user, assignees: [user], labels: [label_assigned]) } let_it_be(:issue_with_milestones) { create(:issue, project: project_with_milestones, author: user, assignees: [user]) } - let_it_be(:label) { create(:label, project: project) } let_it_be(:milestone) { create(:milestone, project: project) } let_it_be(:milestones) { create_list(:milestone, 25, project: project_with_milestones) } - before do - project.add_developer(user) - project_with_milestones.add_developer(user) - sign_in(user) - end - - context "from edit page" do + context 'with authorized user' do before do - visit edit_project_issue_path(project, issue) + project.add_developer(user) + project_with_milestones.add_developer(user) + sign_in(user) end - it "previews content" do - form = first(".gfm-form") - - page.within(form) do - fill_in("Description", with: "Bug fixed :smile:") - click_button("Preview") + context "from edit page" do + before do + visit edit_project_issue_path(project, issue) end - expect(form).to have_button("Write") - end - - it 'allows user to select unassigned' do - visit edit_project_issue_path(project, issue) - - expect(page).to have_content "Assignee #{user.name}" + it "previews content" do + form = first(".gfm-form") - first('.js-user-search').click - click_link 'Unassigned' - - click_button 'Save changes' + page.within(form) do + fill_in("Description", with: "Bug fixed :smile:") + click_button("Preview") + end - page.within('.assignee') do - expect(page).to have_content 'None - assign yourself' + expect(form).to have_button("Write") end - end - context 'with due date' do - before do + it 'allows user to select unassigned' do visit edit_project_issue_path(project, issue) - end - - it 'saves with due date' do - date = Date.today.at_beginning_of_month.tomorrow - fill_in 'issue_title', with: 'bug 345' - fill_in 'issue_description', with: 'bug description' - find('#issuable-due-date').click - - page.within '.pika-single' do - click_button date.day - end + expect(page).to have_content "Assignee #{user.name}" - expect(find('#issuable-due-date').value).to eq date.to_s + first('.js-user-search').click + click_link 'Unassigned' click_button 'Save changes' - page.within '.issuable-sidebar' do - expect(page).to have_content date.to_s(:medium) + page.within('.assignee') do + expect(page).to have_content 'None - assign yourself' end end - it 'warns about version conflict' do - issue.update(title: "New title") + context 'with due date' do + before do + visit edit_project_issue_path(project, issue) + end - fill_in 'issue_title', with: 'bug 345' - fill_in 'issue_description', with: 'bug description' + it 'saves with due date' do + date = Date.today.at_beginning_of_month.tomorrow - click_button 'Save changes' + fill_in 'issue_title', with: 'bug 345' + fill_in 'issue_description', with: 'bug description' + find('#issuable-due-date').click - expect(page).to have_content 'Someone edited the issue the same time you did' - end - end - end + page.within '.pika-single' do + click_button date.day + end - context "from issue#show" do - before do - visit project_issue_path(project, issue) - end + expect(find('#issuable-due-date').value).to eq date.to_s + + click_button 'Save changes' + + page.within '.issuable-sidebar' do + expect(page).to have_content date.to_s(:medium) + end + end - describe 'update labels' do - it 'will not send ajax request when no data is changed' do - page.within '.labels' do - click_on 'Edit' + it 'warns about version conflict' do + issue.update(title: "New title") - find('.dropdown-title button').click + fill_in 'issue_title', with: 'bug 345' + fill_in 'issue_description', with: 'bug description' - expect(page).not_to have_selector('.block-loading') - expect(page).not_to have_selector('.gl-spinner') + click_button 'Save changes' + + expect(page).to have_content 'Someone edited the issue the same time you did' end end end - describe 'update assignee' do - context 'by authorized user' do - def close_dropdown_menu_if_visible - find('.dropdown-menu-toggle', visible: :all).tap do |toggle| - toggle.click if toggle.visible? + context "from issue#show" do + before do + visit project_issue_path(project, issue) + end + + describe 'update labels' do + it 'will not send ajax request when no data is changed' do + page.within '.labels' do + click_on 'Edit' + + find('.dropdown-title button').click + + expect(page).not_to have_selector('.block-loading') + expect(page).not_to have_selector('.gl-spinner') end end - it 'allows user to select unassigned' do - visit project_issue_path(project, issue) + it 'can add label to issue' do + page.within '.block.labels' do + expect(page).to have_text('verisimilitude') + expect(page).not_to have_text('syzygy') - page.within('.assignee') do - expect(page).to have_content "#{user.name}" + click_on 'Edit' - click_link 'Edit' - click_link 'Unassigned' - first('.title').click - expect(page).to have_content 'None - assign yourself' + wait_for_requests + + click_on 'syzygy' + find('.dropdown-header-button').click + + wait_for_requests + + expect(page).to have_text('verisimilitude') + expect(page).to have_text('syzygy') end end - it 'allows user to select an assignee' do - issue2 = create(:issue, project: project, author: user) - visit project_issue_path(project, issue2) + it 'can remove label from issue by clicking on the label `x` button' do + page.within '.block.labels' do + expect(page).to have_text('verisimilitude') + + within '.gl-label' do + click_button + end + + wait_for_requests - page.within('.assignee') do - expect(page).to have_content "None" + expect(page).not_to have_text('verisimilitude') end + end + end - page.within '.assignee' do - click_link 'Edit' + describe 'update assignee' do + context 'by authorized user' do + def close_dropdown_menu_if_visible + find('.dropdown-menu-toggle', visible: :all).tap do |toggle| + toggle.click if toggle.visible? + end end - page.within '.dropdown-menu-user' do - click_link user.name + it 'allows user to select unassigned' do + visit project_issue_path(project, issue) + + page.within('.assignee') do + expect(page).to have_content "#{user.name}" + + click_link 'Edit' + click_link 'Unassigned' + first('.title').click + expect(page).to have_content 'None - assign yourself' + end end - page.within('.assignee') do - expect(page).to have_content user.name + it 'allows user to select an assignee' do + issue2 = create(:issue, project: project, author: user) + visit project_issue_path(project, issue2) + + page.within('.assignee') do + expect(page).to have_content "None" + end + + page.within '.assignee' do + click_link 'Edit' + end + + page.within '.dropdown-menu-user' do + click_link user.name + end + + page.within('.assignee') do + expect(page).to have_content user.name + end end - end - it 'allows user to unselect themselves' do - issue2 = create(:issue, project: project, author: user, assignees: [user]) + it 'allows user to unselect themselves' do + issue2 = create(:issue, project: project, author: user, assignees: [user]) - visit project_issue_path(project, issue2) + visit project_issue_path(project, issue2) - page.within '.assignee' do - expect(page).to have_content user.name + page.within '.assignee' do + expect(page).to have_content user.name - click_link 'Edit' - click_link user.name + click_link 'Edit' + click_link user.name - close_dropdown_menu_if_visible + close_dropdown_menu_if_visible - page.within '.value .assign-yourself' do - expect(page).to have_content "None" + page.within '.value .assign-yourself' do + expect(page).to have_content "None" + end end end end - end - context 'by unauthorized user' do - let(:guest) { create(:user) } + context 'by unauthorized user' do + let(:guest) { create(:user) } - before do - project.add_guest(guest) - end + before do + project.add_guest(guest) + end - it 'shows assignee text' do - sign_out(:user) - sign_in(guest) + it 'shows assignee text' do + sign_out(:user) + sign_in(guest) - visit project_issue_path(project, issue) - expect(page).to have_content issue.assignees.first.name + visit project_issue_path(project, issue) + expect(page).to have_content issue.assignees.first.name + end end end - end - describe 'update milestone' do - context 'by authorized user' do - it 'allows user to select unassigned' do - visit project_issue_path(project, issue) + describe 'update milestone' do + context 'by authorized user' do + it 'allows user to select unassigned' do + visit project_issue_path(project, issue) - page.within('.milestone') do - expect(page).to have_content "None" - end + page.within('.milestone') do + expect(page).to have_content "None" + end - find('.block.milestone .edit-link').click - sleep 2 # wait for ajax stuff to complete - first('.dropdown-content li').click - sleep 2 - page.within('.milestone') do - expect(page).to have_content 'None' + find('.block.milestone .edit-link').click + sleep 2 # wait for ajax stuff to complete + first('.dropdown-content li').click + sleep 2 + page.within('.milestone') do + expect(page).to have_content 'None' + end end - end - it 'allows user to de-select milestone' do - visit project_issue_path(project, issue) + it 'allows user to de-select milestone' do + visit project_issue_path(project, issue) - page.within('.milestone') do - click_link 'Edit' - click_link milestone.title + page.within('.milestone') do + click_link 'Edit' + click_link milestone.title - page.within '.value' do - expect(page).to have_content milestone.title - end + page.within '.value' do + expect(page).to have_content milestone.title + end - click_link 'Edit' - click_link milestone.title + click_link 'Edit' + click_link milestone.title - page.within '.value' do - expect(page).to have_content 'None' + page.within '.value' do + expect(page).to have_content 'None' + end end end - end - it 'allows user to search milestone' do - visit project_issue_path(project_with_milestones, issue_with_milestones) + it 'allows user to search milestone' do + visit project_issue_path(project_with_milestones, issue_with_milestones) - page.within('.milestone') do - click_link 'Edit' - wait_for_requests - # We need to enclose search string in quotes for exact match as all the milestone titles - # within tests are prefixed with `My title`. - find('.dropdown-input-field', visible: true).send_keys "\"#{milestones[0].title}\"" - wait_for_requests + page.within('.milestone') do + click_link 'Edit' + wait_for_requests + # We need to enclose search string in quotes for exact match as all the milestone titles + # within tests are prefixed with `My title`. + find('.dropdown-input-field', visible: true).send_keys "\"#{milestones[0].title}\"" + wait_for_requests - page.within '.dropdown-content' do - expect(page).to have_content milestones[0].title + page.within '.dropdown-content' do + expect(page).to have_content milestones[0].title + end end end end - end - context 'by unauthorized user' do - let(:guest) { create(:user) } + context 'by unauthorized user' do + let(:guest) { create(:user) } - before do - project.add_guest(guest) - issue.milestone = milestone - issue.save - end + before do + project.add_guest(guest) + issue.milestone = milestone + issue.save + end - it 'shows milestone text' do - sign_out(:user) - sign_in(guest) + it 'shows milestone text' do + sign_out(:user) + sign_in(guest) - visit project_issue_path(project, issue) - expect(page).to have_content milestone.title + visit project_issue_path(project, issue) + expect(page).to have_content milestone.title + end end end - end - context 'update due date' do - it 'adds due date to issue' do - date = Date.today.at_beginning_of_month + 2.days + context 'update due date' do + it 'adds due date to issue' do + date = Date.today.at_beginning_of_month + 2.days - page.within '.due_date' do - click_link 'Edit' + page.within '.due_date' do + click_link 'Edit' - page.within '.pika-single' do - click_button date.day - end + page.within '.pika-single' do + click_button date.day + end - wait_for_requests + wait_for_requests - expect(find('.value').text).to have_content date.strftime('%b %-d, %Y') + expect(find('.value').text).to have_content date.strftime('%b %-d, %Y') + end end - end - it 'removes due date from issue' do - date = Date.today.at_beginning_of_month + 2.days + it 'removes due date from issue' do + date = Date.today.at_beginning_of_month + 2.days - page.within '.due_date' do - click_link 'Edit' + page.within '.due_date' do + click_link 'Edit' - page.within '.pika-single' do - click_button date.day + page.within '.pika-single' do + click_button date.day + end + + wait_for_requests + + expect(page).to have_no_content 'None' + + click_link 'remove due date' + expect(page).to have_content 'None' end + end + end + end + end - wait_for_requests + context 'with unauthorized user' do + before do + sign_in(user) + end - expect(page).to have_no_content 'None' + context "from issue#show" do + before do + visit project_issue_path(project, issue) + end - click_link 'remove due date' - expect(page).to have_content 'None' + describe 'updating labels' do + it 'cannot edit labels' do + page.within '.block.labels' do + expect(page).not_to have_button('Edit') + end + end + + it 'cannot remove label with a click as it has no `x` button' do + page.within '.block.labels' do + within '.gl-label' do + expect(page).not_to have_button + end + end end end end diff --git a/spec/features/issues/user_sees_live_update_spec.rb b/spec/features/issues/user_sees_live_update_spec.rb index c9b751715bc..d27cdb774a5 100644 --- a/spec/features/issues/user_sees_live_update_spec.rb +++ b/spec/features/issues/user_sees_live_update_spec.rb @@ -39,7 +39,7 @@ RSpec.describe 'Issues > User sees live update', :js do expect(page).to have_css('.sidebar-item-warning-message') within('.sidebar-item-warning-message') do - find('.btn-close').click + find('[data-testid="confidential-toggle"]').click end wait_for_requests diff --git a/spec/features/issues/user_views_issue_spec.rb b/spec/features/issues/user_views_issue_spec.rb index 3f18764aa58..9b1c8be1513 100644 --- a/spec/features/issues/user_views_issue_spec.rb +++ b/spec/features/issues/user_views_issue_spec.rb @@ -5,7 +5,7 @@ require "spec_helper" RSpec.describe "User views issue" do let_it_be(:project) { create(:project_empty_repo, :public) } let_it_be(:user) { create(:user) } - let_it_be(:issue) { create(:issue, project: project, description: "# Description header", author: user) } + let_it_be(:issue) { create(:issue, project: project, description: "# Description header\n\n**Lorem** _ipsum_ dolor sit [amet](https://example.com)", author: user) } let_it_be(:note) { create(:note, noteable: issue, project: project, author: user) } before_all do @@ -20,6 +20,8 @@ RSpec.describe "User views issue" do it { expect(page).to have_header_with_correct_id_and_link(1, "Description header", "description-header") } + it_behaves_like 'page meta description', ' Description header Lorem ipsum dolor sit amet' + 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') |