diff options
Diffstat (limited to 'spec/services/members/invite_service_spec.rb')
-rw-r--r-- | spec/services/members/invite_service_spec.rb | 79 |
1 files changed, 51 insertions, 28 deletions
diff --git a/spec/services/members/invite_service_spec.rb b/spec/services/members/invite_service_spec.rb index cced93896a5..d7fd7d5b2ca 100644 --- a/spec/services/members/invite_service_spec.rb +++ b/spec/services/members/invite_service_spec.rb @@ -2,29 +2,43 @@ require 'spec_helper' -RSpec.describe Members::InviteService, :aggregate_failures do +RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_shared_state, :sidekiq_inline do let_it_be(:project) { create(:project) } let_it_be(:user) { project.owner } let_it_be(:project_user) { create(:user) } + let_it_be(:namespace) { project.namespace } let(:params) { {} } - let(:base_params) { { access_level: Gitlab::Access::GUEST } } + let(:base_params) { { access_level: Gitlab::Access::GUEST, source: project } } - subject(:result) { described_class.new(user, base_params.merge(params)).execute(project) } + subject(:result) { described_class.new(user, base_params.merge(params) ).execute } - context 'when email is previously unused by current members' do + context 'when there is a valid member invited' do let(:params) { { email: 'email@example.org' } } it 'successfully creates a member' do - expect { result }.to change(ProjectMember, :count).by(1) + expect_to_create_members(count: 1) expect(result[:status]).to eq(:success) end + + it_behaves_like 'records an onboarding progress action', :user_added + end + + context 'when email is not a valid email' do + let(:params) { { email: '_bogus_' } } + + it 'returns an error' do + expect_not_to_create_members + expect(result[:message]['_bogus_']).to eq("Invite email is invalid") + end + + it_behaves_like 'does not record an onboarding progress action' end context 'when emails are passed as an array' do let(:params) { { email: %w[email@example.org email2@example.org] } } it 'successfully creates members' do - expect { result }.to change(ProjectMember, :count).by(2) + expect_to_create_members(count: 2) expect(result[:status]).to eq(:success) end end @@ -33,25 +47,25 @@ RSpec.describe Members::InviteService, :aggregate_failures do let(:params) { { email: '' } } it 'returns an error' do - expect(result[:status]).to eq(:error) - expect(result[:message]).to eq('Email cannot be blank') + expect_not_to_create_members + expect(result[:message]).to eq('Emails cannot be blank') end end context 'when email param is not included' do it 'returns an error' do - expect(result[:status]).to eq(:error) - expect(result[:message]).to eq('Email cannot be blank') + expect_not_to_create_members + expect(result[:message]).to eq('Emails cannot be blank') end end - context 'when email is not a valid email' do + context 'when email is not a valid email format' do let(:params) { { email: '_bogus_' } } it 'returns an error' do expect { result }.not_to change(ProjectMember, :count) expect(result[:status]).to eq(:error) - expect(result[:message]['_bogus_']).to eq("Invite email is invalid") + expect(result[:message][params[:email]]).to eq("Invite email is invalid") end end @@ -59,7 +73,7 @@ RSpec.describe Members::InviteService, :aggregate_failures do let(:params) { { email: 'email@example.org,email@example.org' } } it 'only creates one member per unique address' do - expect { result }.to change(ProjectMember, :count).by(1) + expect_to_create_members(count: 1) expect(result[:status]).to eq(:success) end end @@ -71,8 +85,7 @@ RSpec.describe Members::InviteService, :aggregate_failures do let(:params) { { email: emails } } it 'limits the number of emails to 100' do - expect { result }.not_to change(ProjectMember, :count) - expect(result[:status]).to eq(:error) + expect_not_to_create_members expect(result[:message]).to eq('Too many users specified (limit is 100)') end end @@ -81,8 +94,7 @@ RSpec.describe Members::InviteService, :aggregate_failures do let(:params) { { email: 'email@example.org,email2@example.org', limit: 1 } } it 'limits the number of emails to the limit supplied' do - expect { result }.not_to change(ProjectMember, :count) - expect(result[:status]).to eq(:error) + expect_not_to_create_members expect(result[:message]).to eq('Too many users specified (limit is 1)') end end @@ -91,7 +103,7 @@ RSpec.describe Members::InviteService, :aggregate_failures do let(:params) { { email: emails, limit: -1 } } it 'does not limit number of emails' do - expect { result }.to change(ProjectMember, :count).by(101) + expect_to_create_members(count: 101) expect(result[:status]).to eq(:success) end end @@ -101,7 +113,7 @@ RSpec.describe Members::InviteService, :aggregate_failures do let(:params) { { email: project_user.email } } it 'adds an existing user to members' do - expect { result }.to change(ProjectMember, :count).by(1) + expect_to_create_members(count: 1) expect(result[:status]).to eq(:success) expect(project.users).to include project_user end @@ -111,9 +123,9 @@ RSpec.describe Members::InviteService, :aggregate_failures do let(:params) { { email: project_user.email, access_level: -1 } } it 'returns an error' do - expect { result }.not_to change(ProjectMember, :count) - expect(result[:status]).to eq(:error) - expect(result[:message][project_user.email]).to eq("Access level is not included in the list") + expect_not_to_create_members + expect(result[:message][project_user.email]) + .to eq("Access level is not included in the list") end end @@ -122,9 +134,10 @@ RSpec.describe Members::InviteService, :aggregate_failures do let(:params) { { email: "#{invited_member.invite_email},#{project_user.email}" } } it 'adds new email and returns an error for the already invited email' do - expect { result }.to change(ProjectMember, :count).by(1) + expect_to_create_members(count: 1) expect(result[:status]).to eq(:error) - expect(result[:message][invited_member.invite_email]).to eq("Member already invited to #{project.name}") + expect(result[:message][invited_member.invite_email]) + .to eq("Invite email has already been taken") expect(project.users).to include project_user end end @@ -134,10 +147,10 @@ RSpec.describe Members::InviteService, :aggregate_failures do let(:params) { { email: "#{requested_member.user.email},#{project_user.email}" } } it 'adds new email and returns an error for the already invited email' do - expect { result }.to change(ProjectMember, :count).by(1) + expect_to_create_members(count: 1) expect(result[:status]).to eq(:error) expect(result[:message][requested_member.user.email]) - .to eq("Member cannot be invited because they already requested to join #{project.name}") + .to eq("User already exists in source") expect(project.users).to include project_user end end @@ -147,10 +160,20 @@ RSpec.describe Members::InviteService, :aggregate_failures do let(:params) { { email: "#{existing_member.user.email},#{project_user.email}" } } it 'adds new email and returns an error for the already invited email' do - expect { result }.to change(ProjectMember, :count).by(1) + expect_to_create_members(count: 1) expect(result[:status]).to eq(:error) - expect(result[:message][existing_member.user.email]).to eq("Already a member of #{project.name}") + expect(result[:message][existing_member.user.email]) + .to eq("User already exists in source") expect(project.users).to include project_user end end + + def expect_to_create_members(count:) + expect { result }.to change(ProjectMember, :count).by(count) + end + + def expect_not_to_create_members + expect { result }.not_to change(ProjectMember, :count) + expect(result[:status]).to eq(:error) + end end |