debian-mirror-gitlab/spec/support/shared_examples/features/inviting_members_shared_examples.rb
2023-03-04 22:38:38 +05:30

281 lines
9.8 KiB
Ruby

# frozen_string_literal: true
RSpec.shared_examples 'inviting members' do |snowplow_invite_label|
before_all do
group.add_owner(user1)
end
it 'adds user as member', :js, :snowplow, :aggregate_failures do
visit members_page_path
invite_member(user2.name, role: 'Reporter')
page.within find_member_row(user2) do
expect(page).to have_button('Reporter')
end
expect_snowplow_event(
category: 'Members::InviteService',
action: 'create_member',
label: snowplow_invite_label,
property: 'existing_user',
user: user1
)
end
it 'displays the user\'s avatar in the member input token', :js do
visit members_page_path
input_invites(user2.name)
expect(page).to have_selector(member_token_avatar_selector)
end
it 'does not display an avatar in the member input token for an email address', :js do
visit members_page_path
input_invites('test@example.com')
expect(page).not_to have_selector(member_token_avatar_selector)
end
it 'invites user by email', :js, :snowplow, :aggregate_failures do
visit members_page_path
invite_member('test@example.com', role: 'Reporter')
click_link 'Invited'
page.within find_invited_member_row('test@example.com') do
expect(page).to have_button('Reporter')
end
expect_snowplow_event(
category: 'Members::InviteService',
action: 'create_member',
label: snowplow_invite_label,
property: 'net_new_user',
user: user1
)
end
it 'invites user by username and invites user by email', :js, :aggregate_failures do
visit members_page_path
invite_member([user2.name, 'test@example.com'], role: 'Reporter')
page.within find_member_row(user2) do
expect(page).to have_button('Reporter')
end
click_link 'Invited'
page.within find_invited_member_row('test@example.com') do
expect(page).to have_button('Reporter')
end
end
context 'when member is already a member by username' do
it 'updates the member for that user', :js do
visit members_page_path
invite_member(user2.name, role: 'Developer')
invite_member(user2.name, role: 'Reporter')
expect(page).not_to have_selector(invite_modal_selector)
page.refresh
page.within find_invited_member_row(user2.name) do
expect(page).to have_button('Reporter')
end
end
end
context 'when member is already a member by email' do
it 'updates the member for that email', :js do
email = 'test@example.com'
visit members_page_path
invite_member(email, role: 'Developer')
invite_member(email, role: 'Reporter')
expect(page).not_to have_selector(invite_modal_selector)
page.refresh
click_link 'Invited'
page.within find_invited_member_row(email) do
expect(page).to have_button('Reporter')
end
end
end
context 'when inviting a parent group member to the sub-entity' do
before_all do
group.add_owner(user1)
group.add_developer(user2)
end
context 'when role is higher than parent group membership' do
let(:role) { 'Maintainer' }
it 'adds the user as a member on sub-entity with higher access level', :js do
visit subentity_members_page_path
invite_member(user2.name, role: role)
expect(page).not_to have_selector(invite_modal_selector)
page.refresh
page.within find_invited_member_row(user2.name) do
expect(page).to have_button(role)
end
end
end
context 'when role is lower than parent group membership' do
let(:role) { 'Reporter' }
it 'fails with an error', :js do
visit subentity_members_page_path
invite_member(user2.name, role: role)
invite_modal = page.find(invite_modal_selector)
expect(invite_modal).to have_content "#{user2.name}: Access level should be greater than or equal to " \
"Developer inherited membership from group #{group.name}"
page.refresh
page.within find_invited_member_row(user2.name) do
expect(page).to have_content('Developer')
expect(page).not_to have_button('Developer')
end
end
context 'when there are multiple users invited with errors' do
let_it_be(:user3) { create(:user) }
before do
group.add_maintainer(user3)
end
it 'shows the partial user error and success and then removes them from the form', :js do
user4 = create(:user)
user5 = create(:user)
user6 = create(:user)
user7 = create(:user)
group.add_maintainer(user6)
group.add_maintainer(user7)
visit subentity_members_page_path
invite_member([user2.name, user3.name, user4.name, user6.name, user7.name], role: role)
# we have more than 2 errors, so one will be hidden
invite_modal = page.find(invite_modal_selector)
expect(invite_modal).to have_text("The following 4 members couldn't be invited")
expect(invite_modal).to have_selector(limited_invite_error_selector, count: 2, visible: :visible)
expect(invite_modal).to have_selector(expanded_invite_error_selector, count: 2, visible: :hidden)
# unpredictability of return order means we can't rely on message showing in any order here
# so we will not expect on the message
expect_to_have_invalid_invite_indicator(invite_modal, user2, message: false)
expect_to_have_invalid_invite_indicator(invite_modal, user3, message: false)
expect_to_have_invalid_invite_indicator(invite_modal, user6, message: false)
expect_to_have_invalid_invite_indicator(invite_modal, user7, message: false)
expect_to_have_successful_invite_indicator(invite_modal, user4)
expect(invite_modal).to have_button('Show more (2)')
# now we want to test the show more errors count logic
remove_token(user7.id)
# count decreases from 4 to 3 and 2 to 1
expect(invite_modal).to have_text("The following 3 members couldn't be invited")
expect(invite_modal).to have_button('Show more (1)')
# we want to show this error now for user6
invite_modal.find(more_invite_errors_button_selector).click
# now we should see the error for all users and our collapse button text
expect(invite_modal).to have_selector(limited_invite_error_selector, count: 2, visible: :visible)
expect(invite_modal).to have_selector(expanded_invite_error_selector, count: 1, visible: :visible)
expect_to_have_invalid_invite_indicator(invite_modal, user2, message: true)
expect_to_have_invalid_invite_indicator(invite_modal, user3, message: true)
expect_to_have_invalid_invite_indicator(invite_modal, user6, message: true)
expect(invite_modal).to have_button('Show less')
# adds new token, but doesn't submit
select_members(user5.name)
expect_to_have_normal_invite_indicator(invite_modal, user5)
remove_token(user2.id)
expect(invite_modal).to have_text("The following 2 members couldn't be invited")
expect(invite_modal).not_to have_selector(more_invite_errors_button_selector)
expect_to_have_invite_removed(invite_modal, user2)
expect_to_have_invalid_invite_indicator(invite_modal, user3)
expect_to_have_invalid_invite_indicator(invite_modal, user6)
expect_to_have_successful_invite_indicator(invite_modal, user4)
expect_to_have_normal_invite_indicator(invite_modal, user5)
remove_token(user6.id)
expect(invite_modal).to have_text("The following member couldn't be invited")
expect_to_have_invite_removed(invite_modal, user6)
expect_to_have_invalid_invite_indicator(invite_modal, user3)
expect_to_have_successful_invite_indicator(invite_modal, user4)
expect_to_have_normal_invite_indicator(invite_modal, user5)
remove_token(user3.id)
expect(invite_modal).not_to have_text("The following member couldn't be invited")
expect(invite_modal).not_to have_text("Review the invite errors and try again")
expect_to_have_invite_removed(invite_modal, user3)
expect_to_have_successful_invite_indicator(invite_modal, user4)
expect_to_have_normal_invite_indicator(invite_modal, user5)
submit_invites
expect(page).not_to have_selector(invite_modal_selector)
page.refresh
page.within find_invited_member_row(user2.name) do
expect(page).to have_content('Developer')
expect(page).not_to have_button('Developer')
end
page.within find_invited_member_row(user3.name) do
expect(page).to have_content('Maintainer')
expect(page).not_to have_button('Maintainer')
end
page.within find_invited_member_row(user4.name) do
expect(page).to have_button(role)
end
end
it 'only shows the error for an invalid formatted email and does not display other member errors', :js do
visit subentity_members_page_path
invite_member([user2.name, user3.name, 'bad@email'], role: role)
invite_modal = page.find(invite_modal_selector)
expect(invite_modal).to have_text('email contains an invalid email address')
expect(invite_modal).not_to have_text("The following 2 members couldn't be invited")
expect(invite_modal).not_to have_text("Review the invite errors and try again")
expect(invite_modal).not_to have_text("#{user2.name}: Access level should be greater than or equal to")
expect(invite_modal).not_to have_text("#{user3.name}: Access level should be greater than or equal to")
end
end
end
end
end