diff --git a/ee/lib/gitlab_subscriptions/member_management/block_seat_overages.rb b/ee/lib/gitlab_subscriptions/member_management/block_seat_overages.rb index ece5e49f7736153805821e54a1c4d88a5a3ea574..a69eab20cc914babb9996c5487479861a4d9a1cd 100644 --- a/ee/lib/gitlab_subscriptions/member_management/block_seat_overages.rb +++ b/ee/lib/gitlab_subscriptions/member_management/block_seat_overages.rb @@ -13,9 +13,11 @@ def block_seat_overages?(source) def seats_available_for?(source, invites, access_level, member_role_id) root_namespace = source.root_ancestor - return root_namespace.seats_available_for?(invites, access_level, member_role_id) if gitlab_com_subscription? - parsed_invites = process_invites(source, invites) + if gitlab_com_subscription? + return root_namespace.seats_available_for?(parsed_invites, access_level, member_role_id) + end + seats_available_for_self_managed?(parsed_invites, access_level, member_role_id) end diff --git a/ee/spec/lib/gitlab_subscriptions/member_management/block_seat_overages_spec.rb b/ee/spec/lib/gitlab_subscriptions/member_management/block_seat_overages_spec.rb index 1d78f6ee4e6b1f2c1c629cd55e147f47c38007db..260a7289fa53b9865fdb207f704ee8fa4fc0f831 100644 --- a/ee/spec/lib/gitlab_subscriptions/member_management/block_seat_overages_spec.rb +++ b/ee/spec/lib/gitlab_subscriptions/member_management/block_seat_overages_spec.rb @@ -55,7 +55,7 @@ context 'when on GitLab.com', :saas do it 'delegates to root namespace' do - expect(group).to receive(:seats_available_for?).with(invites, access_level, member_role_id) + expect(group).to receive(:seats_available_for?).with(invites.map(&:to_s), access_level, member_role_id) seats_available? end diff --git a/ee/spec/services/ee/members/create_service_spec.rb b/ee/spec/services/ee/members/create_service_spec.rb index 4b47d5488590332e614601f73644ded42f795428..6a23b980773411fe2fc1313601f7323202e564f1 100644 --- a/ee/spec/services/ee/members/create_service_spec.rb +++ b/ee/spec/services/ee/members/create_service_spec.rb @@ -579,6 +579,31 @@ execute_service end + + context 'when email is of existing user' do + let(:invites) { project_users.map(&:email) } + + it 'does not reject membership update for already billable user on billable role' do + project_member_a = project.add_developer(project_users.first) + project_member_b = project.add_developer(project_users.second) + params[:access_level] = ::Gitlab::Access::MAINTAINER + + execute_service + + expect(project_member_a.reload.access_level).to eq ::Gitlab::Access::MAINTAINER + expect(project_member_b.reload.access_level).to eq ::Gitlab::Access::MAINTAINER + end + end + end + + context 'when we invite a bot user' do + let(:invites) { create(:user, :bot).id } + + it 'does not reject bot users' do + params[:access_level] = ::Gitlab::Access::DEVELOPER + + expect { execute_service }.to change { project.members.count }.by(1) + end end it 'adds guest users even if there are no seats available' do diff --git a/ee/spec/services/ee/members/update_service_spec.rb b/ee/spec/services/ee/members/update_service_spec.rb index 4aac07290ead75541f3076917419a754f6f3e5e0..ae301e64b6341a54f0bd1a9c8948f8353427cfdc 100644 --- a/ee/spec/services/ee/members/update_service_spec.rb +++ b/ee/spec/services/ee/members/update_service_spec.rb @@ -203,6 +203,17 @@ expect(result[:status]).to eq(:success) end + + it 'allows bot users updates' do + bot_member = group.add_developer(create(:user, :bot)) + + params = { access_level: ::Gitlab::Access::MAINTAINER, source: group } + + result = described_class.new(user, params).execute(bot_member) + + expect(result[:status]).to eq(:success) + expect(bot_member.reload.access_level).to eq(::Gitlab::Access::MAINTAINER) + end end context 'with block seat overages enabled for self-managed' do