diff options
Diffstat (limited to 'spec/features/merge_request/user_edits_assignees_sidebar_spec.rb')
-rw-r--r-- | spec/features/merge_request/user_edits_assignees_sidebar_spec.rb | 174 |
1 files changed, 140 insertions, 34 deletions
diff --git a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb index 5894ec923c2..92b9b785148 100644 --- a/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb +++ b/spec/features/merge_request/user_edits_assignees_sidebar_spec.rb @@ -17,66 +17,172 @@ RSpec.describe 'Merge request > User edits assignees sidebar', :js do let(:sidebar_assignee_block) { page.find('.js-issuable-sidebar .assignee') } let(:sidebar_assignee_avatar_link) { sidebar_assignee_block.find_all('a').find { |a| a['href'].include? assignee.username } } let(:sidebar_assignee_tooltip) { sidebar_assignee_avatar_link['title'] || '' } - let(:sidebar_assignee_dropdown_item) { sidebar_assignee_block.find(".dropdown-menu li[data-user-id=\"#{assignee.id}\"]") } - let(:sidebar_assignee_dropdown_tooltip) { sidebar_assignee_dropdown_item.find('a')['data-title'] || '' } - context 'when user is an owner' do + context 'when GraphQL assignees widget feature flag is disabled' do + let(:sidebar_assignee_dropdown_item) { sidebar_assignee_block.find(".dropdown-menu li[data-user-id=\"#{assignee.id}\"]") } + let(:sidebar_assignee_dropdown_tooltip) { sidebar_assignee_dropdown_item.find('a')['data-title'] || '' } + before do - stub_const('Autocomplete::UsersFinder::LIMIT', users_find_limit) + stub_feature_flags(issue_assignees_widget: false) + end - sign_in(project.first_owner) + context 'when user is an owner' do + before do + stub_const('Autocomplete::UsersFinder::LIMIT', users_find_limit) - merge_request.assignees << assignee + sign_in(project.first_owner) - visit project_merge_request_path(project, merge_request) + merge_request.assignees << assignee - wait_for_requests + visit project_merge_request_path(project, merge_request) + + wait_for_requests + end + + shared_examples 'when assigned' do |expected_tooltip: ''| + it 'shows assignee name' do + expect(sidebar_assignee_block).to have_text(assignee.name) + end + + it "shows assignee tooltip '#{expected_tooltip}'" do + expect(sidebar_assignee_tooltip).to eql(expected_tooltip) + end + + context 'when edit is clicked' do + before do + sidebar_assignee_block.click_link('Edit') + + wait_for_requests + end + + it "shows assignee tooltip '#{expected_tooltip}" do + expect(sidebar_assignee_dropdown_tooltip).to eql(expected_tooltip) + end + end + end + + context 'when assigned to maintainer' do + let(:assignee) { project_maintainers.last } + + it_behaves_like 'when assigned', expected_tooltip: '' + end + + context 'when assigned to developer' do + let(:assignee) { project_developers.last } + + it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge' + end end - shared_examples 'when assigned' do |expected_tooltip: ''| - it 'shows assignee name' do - expect(sidebar_assignee_block).to have_text(assignee.name) + context 'with invite members considerations' do + let_it_be(:user) { create(:user) } + + before do + sign_in(user) end - it "shows assignee tooltip '#{expected_tooltip}'" do - expect(sidebar_assignee_tooltip).to eql(expected_tooltip) + include_examples 'issuable invite members' do + let(:issuable_path) { project_merge_request_path(project, merge_request) } end + end + end + + context 'when GraphQL assignees widget feature flag is enabled' do + let(:sidebar_assignee_dropdown_item) { sidebar_assignee_block.find(".dropdown-item", text: assignee.username ) } + let(:sidebar_assignee_dropdown_tooltip) { sidebar_assignee_dropdown_item['title']} + + context 'when user is an owner' do + before do + stub_const('Autocomplete::UsersFinder::LIMIT', users_find_limit) + + sign_in(project.first_owner) + + merge_request.assignees << assignee - context 'when edit is clicked' do - before do - sidebar_assignee_block.click_link('Edit') + visit project_merge_request_path(project, merge_request) - wait_for_requests + wait_for_requests + end + + shared_examples 'when assigned' do |expected_tooltip: ''| + it 'shows assignee name' do + expect(sidebar_assignee_block).to have_text(assignee.name) end - it "shows assignee tooltip '#{expected_tooltip}" do - expect(sidebar_assignee_dropdown_tooltip).to eql(expected_tooltip) + it "shows assignee tooltip '#{expected_tooltip}'" do + expect(sidebar_assignee_tooltip).to eql(expected_tooltip) + end + + context 'when edit is clicked' do + before do + open_assignees_dropdown + end + + it "shows assignee tooltip '#{expected_tooltip}" do + expect(sidebar_assignee_dropdown_tooltip).to eql(expected_tooltip) + end end end - end - context 'when assigned to maintainer' do - let(:assignee) { project_maintainers.last } + context 'when assigned to maintainer' do + let(:assignee) { project_maintainers.last } - it_behaves_like 'when assigned', expected_tooltip: '' - end + it_behaves_like 'when assigned', expected_tooltip: '' + end - context 'when assigned to developer' do - let(:assignee) { project_developers.last } + context 'when assigned to developer' do + let(:assignee) { project_developers.last } - it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge' + it_behaves_like 'when assigned', expected_tooltip: 'Cannot merge' + end end - end - context 'with invite members considerations' do - let_it_be(:user) { create(:user) } + context 'with invite members considerations' do + let_it_be(:user) { create(:user) } - before do - sign_in(user) + before do + sign_in(user) + end + + # TODO: Move to shared examples when feature flag is removed: https://gitlab.com/gitlab-org/gitlab/-/issues/328185 + context 'when a privileged user can invite' do + it 'shows a link for inviting members and launches invite modal' do + project.add_maintainer(user) + visit project_merge_request_path(project, merge_request) + + open_assignees_dropdown + + page.within '.dropdown-menu-user' do + expect(page).to have_link('Invite members') + expect(page).to have_selector('[data-track-action="click_invite_members"]') + expect(page).to have_selector('[data-track-label="edit_assignee"]') + end + + click_link 'Invite members' + + expect(page).to have_content("You're inviting members to the") + end + end + + context 'when user cannot invite members in assignee dropdown' do + it 'shows author in assignee dropdown and no invite link' do + project.add_developer(user) + visit project_merge_request_path(project, merge_request) + + open_assignees_dropdown + + page.within '.dropdown-menu-user' do + expect(page).not_to have_link('Invite members') + end + end + end end + end - include_examples 'issuable invite members' do - let(:issuable_path) { project_merge_request_path(project, merge_request) } + def open_assignees_dropdown + page.within('.assignee') do + click_button('Edit') + wait_for_requests end end end |