diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-04-20 13:00:54 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-04-20 13:00:54 +0300 |
commit | 3cccd102ba543e02725d247893729e5c73b38295 (patch) | |
tree | f36a04ec38517f5deaaacb5acc7d949688d1e187 /spec/requests/api/invitations_spec.rb | |
parent | 205943281328046ef7b4528031b90fbda70c75ac (diff) |
Add latest changes from gitlab-org/gitlab@14-10-stable-eev14.10.0-rc42
Diffstat (limited to 'spec/requests/api/invitations_spec.rb')
-rw-r--r-- | spec/requests/api/invitations_spec.rb | 153 |
1 files changed, 127 insertions, 26 deletions
diff --git a/spec/requests/api/invitations_spec.rb b/spec/requests/api/invitations_spec.rb index 741cf793a77..d093894720e 100644 --- a/spec/requests/api/invitations_spec.rb +++ b/spec/requests/api/invitations_spec.rb @@ -69,7 +69,7 @@ RSpec.describe API::Invitations do end end - it 'invites a new member' do + it 'adds a new member by email' do expect do post invitations_url(source, maintainer), params: { email: email, access_level: Member::DEVELOPER } @@ -78,6 +78,24 @@ RSpec.describe API::Invitations do end.to change { source.members.invite.count }.by(1) end + it 'adds a new member by user_id' do + expect do + post invitations_url(source, maintainer), + params: { user_id: stranger.id, access_level: Member::DEVELOPER } + + expect(response).to have_gitlab_http_status(:created) + end.to change { source.members.non_invite.count }.by(1) + end + + it 'adds new members with email and user_id' do + expect do + post invitations_url(source, maintainer), + params: { email: email, user_id: stranger.id, access_level: Member::DEVELOPER } + + expect(response).to have_gitlab_http_status(:created) + end.to change { source.members.invite.count }.by(1).and change { source.members.non_invite.count }.by(1) + end + it 'invites a list of new email addresses' do expect do email_list = [email, email2].join(',') @@ -88,6 +106,19 @@ RSpec.describe API::Invitations do expect(response).to have_gitlab_http_status(:created) end.to change { source.members.invite.count }.by(2) end + + it 'invites a list of new email addresses and user ids' do + expect do + stranger2 = create(:user) + email_list = [email, email2].join(',') + user_id_list = "#{stranger.id},#{stranger2.id}" + + post invitations_url(source, maintainer), + params: { email: email_list, user_id: user_id_list, access_level: Member::DEVELOPER } + + expect(response).to have_gitlab_http_status(:created) + end.to change { source.members.invite.count }.by(2).and change { source.members.non_invite.count }.by(2) + end end context 'access levels' do @@ -235,27 +266,36 @@ RSpec.describe API::Invitations do expect(json_response['message'][developer.email]).to eq("User already exists in source") end - it 'returns 404 when the email is not valid' do + it 'returns 400 when the invite params of email and user_id are not sent' do + post invitations_url(source, maintainer), + params: { access_level: Member::MAINTAINER } + + expect(response).to have_gitlab_http_status(:bad_request) + expect(json_response['message']).to eq('400 Bad request - Must provide either email or user_id as a parameter') + end + + it 'returns 400 when the email is blank' do post invitations_url(source, maintainer), params: { email: '', access_level: Member::MAINTAINER } - expect(response).to have_gitlab_http_status(:created) - expect(json_response['message']).to eq('Emails cannot be blank') + expect(response).to have_gitlab_http_status(:bad_request) + expect(json_response['message']).to eq('400 Bad request - Must provide either email or user_id as a parameter') end - it 'returns 404 when the email list is not a valid format' do + it 'returns 400 when the user_id is blank' do post invitations_url(source, maintainer), - params: { email: 'email1@example.com,not-an-email', access_level: Member::MAINTAINER } + params: { user_id: '', access_level: Member::MAINTAINER } expect(response).to have_gitlab_http_status(:bad_request) - expect(json_response['error']).to eq('email contains an invalid email address') + expect(json_response['message']).to eq('400 Bad request - Must provide either email or user_id as a parameter') end - it 'returns 400 when email is not given' do + it 'returns 400 when the email list is not a valid format' do post invitations_url(source, maintainer), - params: { access_level: Member::MAINTAINER } + params: { email: 'email1@example.com,not-an-email', access_level: Member::MAINTAINER } expect(response).to have_gitlab_http_status(:bad_request) + expect(json_response['error']).to eq('email contains an invalid email address') end it 'returns 400 when access_level is not given' do @@ -278,12 +318,90 @@ RSpec.describe API::Invitations do it_behaves_like 'POST /:source_type/:id/invitations', 'project' do let(:source) { project } end + + it 'records queries', :request_store, :use_sql_query_cache do + post invitations_url(project, maintainer), params: { email: email, access_level: Member::DEVELOPER } + + control = ActiveRecord::QueryRecorder.new(skip_cached: false) do + post invitations_url(project, maintainer), params: { email: email2, access_level: Member::DEVELOPER } + end + + emails = 'email3@example.com,email4@example.com,email5@example.com,email6@example.com,email7@example.com' + + unresolved_n_plus_ones = 44 # old 48 with 12 per new email, currently there are 11 queries added per email + + expect do + post invitations_url(project, maintainer), params: { email: emails, access_level: Member::DEVELOPER } + end.not_to exceed_all_query_limit(control.count).with_threshold(unresolved_n_plus_ones) + end + + it 'records queries with secondary emails', :request_store, :use_sql_query_cache do + create(:email, email: email, user: create(:user)) + + post invitations_url(project, maintainer), params: { email: email, access_level: Member::DEVELOPER } + + create(:email, email: email2, user: create(:user)) + + control = ActiveRecord::QueryRecorder.new(skip_cached: false) do + post invitations_url(project, maintainer), params: { email: email2, access_level: Member::DEVELOPER } + end + + create(:email, email: 'email4@example.com', user: create(:user)) + create(:email, email: 'email6@example.com', user: create(:user)) + + emails = 'email3@example.com,email4@example.com,email5@example.com,email6@example.com,email7@example.com' + + unresolved_n_plus_ones = 67 # currently there are 11 queries added per email + + expect do + post invitations_url(project, maintainer), params: { email: emails, access_level: Member::DEVELOPER } + end.not_to exceed_all_query_limit(control.count).with_threshold(unresolved_n_plus_ones) + end end describe 'POST /groups/:id/invitations' do it_behaves_like 'POST /:source_type/:id/invitations', 'group' do let(:source) { group } end + + it 'records queries', :request_store, :use_sql_query_cache do + post invitations_url(group, maintainer), params: { email: email, access_level: Member::DEVELOPER } + + control = ActiveRecord::QueryRecorder.new(skip_cached: false) do + post invitations_url(group, maintainer), params: { email: email2, access_level: Member::DEVELOPER } + end + + emails = 'email3@example.com,email4@example.com,email5@example.com,email6@example.com,email7@example.com' + + unresolved_n_plus_ones = 36 # old 40 with 10 per new email, currently there are 9 queries added per email + + expect do + post invitations_url(group, maintainer), params: { email: emails, access_level: Member::DEVELOPER } + end.not_to exceed_all_query_limit(control.count).with_threshold(unresolved_n_plus_ones) + end + + it 'records queries with secondary emails', :request_store, :use_sql_query_cache do + create(:email, email: email, user: create(:user)) + + post invitations_url(group, maintainer), params: { email: email, access_level: Member::DEVELOPER } + + create(:email, email: email2, user: create(:user)) + + control = ActiveRecord::QueryRecorder.new(skip_cached: false) do + post invitations_url(group, maintainer), params: { email: email2, access_level: Member::DEVELOPER } + end + + create(:email, email: 'email4@example.com', user: create(:user)) + create(:email, email: 'email6@example.com', user: create(:user)) + + emails = 'email3@example.com,email4@example.com,email5@example.com,email6@example.com,email7@example.com' + + unresolved_n_plus_ones = 62 # currently there are 9 queries added per email + + expect do + post invitations_url(group, maintainer), params: { email: emails, access_level: Member::DEVELOPER } + end.not_to exceed_all_query_limit(control.count).with_threshold(unresolved_n_plus_ones) + end end shared_examples 'GET /:source_type/:id/invitations' do |source_type| @@ -315,23 +433,6 @@ RSpec.describe API::Invitations do end end - it 'avoids N+1 queries' do - invite_member_by_email(source, source_type, email, maintainer) - - # Establish baseline - get invitations_url(source, maintainer) - - control = ActiveRecord::QueryRecorder.new do - get invitations_url(source, maintainer) - end - - invite_member_by_email(source, source_type, email2, maintainer) - - expect do - get invitations_url(source, maintainer) - end.not_to exceed_query_limit(control) - end - it 'does not find confirmed members' do get invitations_url(source, maintainer) |