diff options
Diffstat (limited to 'spec/features/issues/user_edits_issue_spec.rb')
-rw-r--r-- | spec/features/issues/user_edits_issue_spec.rb | 436 |
1 files changed, 250 insertions, 186 deletions
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 |