Skip to content
代码片段 群组 项目
未验证 提交 fb95a2fb 编辑于 作者: Vijay Hawoldar's avatar Vijay Hawoldar 提交者: GitLab
浏览文件

Merge branch '439558-bulk_user_assignment' into 'master'

Extend bulk_user_assignment lib to support gitlab.com

See merge request https://gitlab.com/gitlab-org/gitlab/-/merge_requests/143372



Merged-by: default avatarVijay Hawoldar <vhawoldar@gitlab.com>
Approved-by: default avatarVijay Hawoldar <vhawoldar@gitlab.com>
Approved-by: default avatarBishwa Hang Rai <bhrai@gitlab.com>
Reviewed-by: default avatarVijay Hawoldar <vhawoldar@gitlab.com>
Reviewed-by: default avatarBishwa Hang Rai <bhrai@gitlab.com>
Reviewed-by: default avatarMohamed Hamda <mhamda@gitlab.com>
Co-authored-by: default avatarMohamed Hamda <mhamda@gitlab.com>
No related branches found
No related tags found
无相关合并请求
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
module DuoPro module DuoPro
class BulkUserAssignment class BulkUserAssignment
include ::GitlabSubscriptions::SubscriptionHelper
attr_reader :usernames, :add_on_purchase, :successful_assignments, :failed_assignments attr_reader :usernames, :add_on_purchase, :successful_assignments, :failed_assignments
def initialize(usernames, add_on_purchase) def initialize(usernames, add_on_purchase)
...@@ -57,10 +58,13 @@ def process_users(usernames) ...@@ -57,10 +58,13 @@ def process_users(usernames)
end end
def assign(user) def assign(user)
::GitlabSubscriptions::UserAddOnAssignments::SelfManaged::CreateService.new( service_class = if gitlab_com_subscription?
add_on_purchase: add_on_purchase, ::GitlabSubscriptions::UserAddOnAssignments::Saas::CreateService
user: user else
).execute ::GitlabSubscriptions::UserAddOnAssignments::SelfManaged::CreateService
end
service_class.new(add_on_purchase: add_on_purchase, user: user).execute
end end
def log_no_seats_available(result, username) def log_no_seats_available(result, username)
......
...@@ -15,19 +15,46 @@ ...@@ -15,19 +15,46 @@
end end
describe '#execute' do describe '#execute' do
let(:add_on) { create(:gitlab_subscription_add_on) } let_it_be(:add_on) { create(:gitlab_subscription_add_on) }
let(:usernames) { User.pluck(:username) + ['code_suggestions_not_found_username'] } let(:usernames) { User.pluck(:username) + ['code_suggestions_not_found_username'] }
before do subject(:bulk_assignment) { described_class.new(usernames, add_on_purchase) }
create(:user, username: 'code_suggestions_active_user1')
create(:user, username: 'code_suggestions_active_user2') shared_examples 'bulk user assignment with enough seats' do
create(:user, username: 'code_suggestions_active_user3') it 'returns success and failed assignments' do
create(:user, username: 'code_suggestions_extra_user1') results = bulk_assignment.execute
create(:user, username: 'code_suggestions_extra_user2')
create(:user, :blocked, username: 'code_suggestions_blocked_user') expect(results[:successful_assignments]).to eq([
create(:user, :banned, username: 'code_suggestions_banned_user') "User assigned: code_suggestions_active_user1",
create(:user, :bot, username: 'code_suggestions_bot_user') "User assigned: code_suggestions_active_user2",
create(:user, :ghost, username: 'code_suggestions_ghost_user') "User assigned: code_suggestions_active_user3",
"User assigned: code_suggestions_extra_user1",
"User assigned: code_suggestions_extra_user2"
])
expect(results[:failed_assignments]).to eq([
"Failed to assign seat to user: code_suggestions_blocked_user, Errors: [\"INVALID_USER_MEMBERSHIP\"]",
"Failed to assign seat to user: code_suggestions_banned_user, Errors: [\"INVALID_USER_MEMBERSHIP\"]",
"Failed to assign seat to user: code_suggestions_bot_user, Errors: [\"INVALID_USER_MEMBERSHIP\"]",
"Failed to assign seat to user: code_suggestions_ghost_user, Errors: [\"INVALID_USER_MEMBERSHIP\"]",
"User is not found: code_suggestions_not_found_username"
])
end
end
shared_examples 'bulk user assignment with not enough seats' do
it 'returns success and failed assignments and stops execution' do
results = bulk_assignment.execute
expect(results[:successful_assignments]).to eq(
["User assigned: code_suggestions_active_user1",
"User assigned: code_suggestions_active_user2",
"User assigned: code_suggestions_active_user3"])
expect(results[:failed_assignments]).to eq(
["Failed to assign seat to user: code_suggestions_extra_user1, Errors: [\"NO_SEATS_AVAILABLE\"]",
"##No seats are left; users starting from @code_suggestions_extra_user1 onwards were not assigned.##"])
end
end end
context 'when the AddOn is not purchased' do context 'when the AddOn is not purchased' do
...@@ -37,51 +64,72 @@ ...@@ -37,51 +64,72 @@
end end
end end
context 'when the AddOn is purchased' do context 'on self managed instances' do
let(:add_on_purchase) do before do
create(:gitlab_subscription_add_on_purchase, :self_managed, quantity: 10, add_on: add_on) create(:user, username: 'code_suggestions_active_user1')
create(:user, username: 'code_suggestions_active_user2')
create(:user, username: 'code_suggestions_active_user3')
create(:user, username: 'code_suggestions_extra_user1')
create(:user, username: 'code_suggestions_extra_user2')
create(:user, :blocked, username: 'code_suggestions_blocked_user')
create(:user, :banned, username: 'code_suggestions_banned_user')
create(:user, :bot, username: 'code_suggestions_bot_user')
create(:user, :ghost, username: 'code_suggestions_ghost_user')
end end
subject(:bulk_assignment) { described_class.new(usernames, add_on_purchase) } context 'when the AddOn is purchased' do
context 'with enough seats' do
context 'with enough seats' do include_examples 'bulk user assignment with enough seats' do
it 'returns success and failed assignments' do let(:add_on_purchase) do
results = bulk_assignment.execute create(:gitlab_subscription_add_on_purchase, :self_managed, quantity: 10, add_on: add_on)
end
end
end
expect(results[:successful_assignments]).to eq([ context 'with not enough seats' do
"User assigned: code_suggestions_active_user1", include_examples 'bulk user assignment with not enough seats' do
"User assigned: code_suggestions_active_user2", let(:add_on_purchase) do
"User assigned: code_suggestions_active_user3", create(:gitlab_subscription_add_on_purchase, :self_managed, quantity: 3, add_on: add_on)
"User assigned: code_suggestions_extra_user1", end
"User assigned: code_suggestions_extra_user2" end
])
expect(results[:failed_assignments]).to eq([
"Failed to assign seat to user: code_suggestions_blocked_user, Errors: [\"INVALID_USER_MEMBERSHIP\"]",
"Failed to assign seat to user: code_suggestions_banned_user, Errors: [\"INVALID_USER_MEMBERSHIP\"]",
"Failed to assign seat to user: code_suggestions_bot_user, Errors: [\"INVALID_USER_MEMBERSHIP\"]",
"Failed to assign seat to user: code_suggestions_ghost_user, Errors: [\"INVALID_USER_MEMBERSHIP\"]",
"User is not found: code_suggestions_not_found_username"
])
end end
end end
end
context 'with not enough seats' do context 'on Gitlab.com' do
let(:add_on_purchase) do before do
create(:gitlab_subscription_add_on_purchase, :self_managed, quantity: 3, add_on: add_on) stub_saas_features(gitlab_com_subscriptions: true)
end
let_it_be(:namespace) { create(:group) }
context 'with bulk assignment' do
before_all do
namespace.add_developer(create(:user, username: 'code_suggestions_active_user1'))
namespace.add_developer(create(:user, username: 'code_suggestions_active_user2'))
namespace.add_developer(create(:user, username: 'code_suggestions_active_user3'))
namespace.add_developer(create(:user, username: 'code_suggestions_extra_user1'))
namespace.add_developer(create(:user, username: 'code_suggestions_extra_user2'))
namespace.add_developer(create(:user, :blocked, username: 'code_suggestions_blocked_user'))
namespace.add_developer(create(:user, :banned, username: 'code_suggestions_banned_user'))
namespace.add_developer(create(:user, :bot, username: 'code_suggestions_bot_user'))
namespace.add_developer(create(:user, :ghost, username: 'code_suggestions_ghost_user'))
end end
it 'returns success and failed assignments and stops execution' do context 'with enough seats' do
results = bulk_assignment.execute let_it_be(:add_on_purchase) do
create(:gitlab_subscription_add_on_purchase, quantity: 10, namespace: namespace, add_on: add_on)
end
include_examples 'bulk user assignment with enough seats'
end
expect(results[:successful_assignments]).to eq( context 'with not enough seats' do
["User assigned: code_suggestions_active_user1", let_it_be(:add_on_purchase) do
"User assigned: code_suggestions_active_user2", create(:gitlab_subscription_add_on_purchase, quantity: 3, namespace: namespace, add_on: add_on)
"User assigned: code_suggestions_active_user3"]) end
expect(results[:failed_assignments]).to eq( include_examples 'bulk user assignment with not enough seats'
["Failed to assign seat to user: code_suggestions_extra_user1, Errors: [\"NO_SEATS_AVAILABLE\"]",
"##No seats are left; users starting from @code_suggestions_extra_user1 onwards were not assigned.##"])
end end
end end
end end
......
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册