debian-mirror-gitlab/spec/services/members/create_service_spec.rb

230 lines
7.3 KiB
Ruby
Raw Normal View History

2019-07-31 22:56:46 +05:30
# frozen_string_literal: true
2017-08-17 22:00:37 +05:30
require 'spec_helper'
2021-09-30 23:02:18 +05:30
RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_cache, :clean_gitlab_redis_shared_state, :sidekiq_inline do
2021-10-27 15:23:28 +05:30
let_it_be(:source, reload: true) { create(:project) }
2021-02-22 17:27:13 +05:30
let_it_be(:user) { create(:user) }
2021-03-08 18:12:59 +05:30
let_it_be(:member) { create(:user) }
let_it_be(:user_ids) { member.id.to_s }
2021-02-22 17:27:13 +05:30
let_it_be(:access_level) { Gitlab::Access::GUEST }
2021-09-30 23:02:18 +05:30
2021-09-04 01:27:46 +05:30
let(:additional_params) { { invite_source: '_invite_source_' } }
let(:params) { { user_ids: user_ids, access_level: access_level }.merge(additional_params) }
2021-02-22 17:27:13 +05:30
2021-04-29 21:17:54 +05:30
subject(:execute_service) { described_class.new(user, params.merge({ source: source })).execute }
2017-08-17 22:00:37 +05:30
2017-09-10 17:25:29 +05:30
before do
2021-03-08 18:12:59 +05:30
if source.is_a?(Project)
source.add_maintainer(user)
OnboardingProgress.onboard(source.namespace)
else
source.add_owner(user)
OnboardingProgress.onboard(source)
end
2017-09-10 17:25:29 +05:30
end
2017-08-17 22:00:37 +05:30
2021-02-22 17:27:13 +05:30
context 'when passing valid parameters' do
it 'adds a user to members' do
expect(execute_service[:status]).to eq(:success)
2021-03-08 18:12:59 +05:30
expect(source.users).to include member
expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(true)
end
context 'when executing on a group' do
let_it_be(:source) { create(:group) }
it 'adds a user to members' do
expect(execute_service[:status]).to eq(:success)
expect(source.users).to include member
expect(OnboardingProgress.completed?(source, :user_added)).to be(true)
end
2021-02-22 17:27:13 +05:30
end
2017-08-17 22:00:37 +05:30
end
2021-02-22 17:27:13 +05:30
context 'when passing no user ids' do
let(:user_ids) { '' }
2017-08-17 22:00:37 +05:30
2021-02-22 17:27:13 +05:30
it 'does not add a member' do
expect(execute_service[:status]).to eq(:error)
expect(execute_service[:message]).to be_present
2021-03-08 18:12:59 +05:30
expect(source.users).not_to include member
expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(false)
2021-02-22 17:27:13 +05:30
end
2017-09-10 17:25:29 +05:30
end
2021-02-22 17:27:13 +05:30
context 'when passing many user ids' do
let(:user_ids) { 1.upto(101).to_a.join(',') }
2017-09-10 17:25:29 +05:30
2021-02-22 17:27:13 +05:30
it 'limits the number of users to 100' do
expect(execute_service[:status]).to eq(:error)
expect(execute_service[:message]).to be_present
2021-03-08 18:12:59 +05:30
expect(source.users).not_to include member
expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(false)
2021-02-22 17:27:13 +05:30
end
2017-08-17 22:00:37 +05:30
end
2019-03-02 22:35:43 +05:30
2021-02-22 17:27:13 +05:30
context 'when passing an invalid access level' do
let(:access_level) { -1 }
2019-03-02 22:35:43 +05:30
2021-02-22 17:27:13 +05:30
it 'does not add a member' do
expect(execute_service[:status]).to eq(:error)
2021-03-08 18:12:59 +05:30
expect(execute_service[:message]).to include("#{member.username}: Access level is not included in the list")
expect(source.users).not_to include member
expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(false)
2021-02-22 17:27:13 +05:30
end
2019-03-02 22:35:43 +05:30
end
2019-07-31 22:56:46 +05:30
2021-02-22 17:27:13 +05:30
context 'when passing an existing invite user id' do
2021-03-08 18:12:59 +05:30
let(:user_ids) { create(:project_member, :invited, project: source).invite_email }
2019-07-31 22:56:46 +05:30
2021-02-22 17:27:13 +05:30
it 'does not add a member' do
expect(execute_service[:status]).to eq(:error)
2021-11-18 22:05:49 +05:30
expect(execute_service[:message]).to eq("The member's email address has already been taken")
2021-03-08 18:12:59 +05:30
expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(false)
2021-02-22 17:27:13 +05:30
end
2019-07-31 22:56:46 +05:30
end
2021-09-04 01:27:46 +05:30
context 'when tracking the invite source', :snowplow do
context 'when invite_source is not passed' do
let(:additional_params) { {} }
2021-10-27 15:23:28 +05:30
it 'raises an error' do
2021-09-04 01:27:46 +05:30
expect { execute_service }.to raise_error(ArgumentError, 'No invite source provided.')
expect_no_snowplow_event
end
end
context 'when invite_source is passed' do
it 'tracks the invite source from params' do
execute_service
expect_snowplow_event(
category: described_class.name,
action: 'create_member',
label: '_invite_source_',
property: 'existing_user',
user: user
)
end
end
context 'when it is a net_new_user' do
let(:additional_params) { { invite_source: '_invite_source_', user_ids: 'email@example.org' } }
it 'tracks the invite source from params' do
execute_service
expect_snowplow_event(
category: described_class.name,
action: 'create_member',
label: '_invite_source_',
property: 'net_new_user',
user: user
)
end
end
end
2021-10-27 15:23:28 +05:30
2021-12-11 22:18:48 +05:30
context 'when assigning tasks to be done' do
let(:additional_params) do
{ invite_source: '_invite_source_', tasks_to_be_done: %w(ci code), tasks_project_id: source.id }
end
it 'creates 2 task issues', :aggregate_failures do
expect(TasksToBeDone::CreateWorker)
.to receive(:perform_async)
.with(anything, user.id, [member.id])
.once
.and_call_original
expect { execute_service }.to change { source.issues.count }.by(2)
expect(source.issues).to all have_attributes(
project: source,
author: user
)
end
context 'when passing many user ids' do
before do
stub_licensed_features(multiple_issue_assignees: false)
end
let(:another_user) { create(:user) }
let(:user_ids) { [member.id, another_user.id].join(',') }
it 'still creates 2 task issues', :aggregate_failures do
expect(TasksToBeDone::CreateWorker)
.to receive(:perform_async)
.with(anything, user.id, array_including(member.id, another_user.id))
.once
.and_call_original
expect { execute_service }.to change { source.issues.count }.by(2)
expect(source.issues).to all have_attributes(
project: source,
author: user
)
end
end
context 'when a `tasks_project_id` is missing' do
let(:additional_params) do
{ invite_source: '_invite_source_', tasks_to_be_done: %w(ci code) }
end
it 'does not create task issues' do
expect(TasksToBeDone::CreateWorker).not_to receive(:perform_async)
execute_service
end
end
context 'when `tasks_to_be_done` are missing' do
let(:additional_params) do
{ invite_source: '_invite_source_', tasks_project_id: source.id }
end
it 'does not create task issues' do
expect(TasksToBeDone::CreateWorker).not_to receive(:perform_async)
execute_service
end
end
context 'when invalid `tasks_to_be_done` are passed' do
let(:additional_params) do
{ invite_source: '_invite_source_', tasks_project_id: source.id, tasks_to_be_done: %w(invalid_task) }
end
it 'does not create task issues' do
expect(TasksToBeDone::CreateWorker).not_to receive(:perform_async)
execute_service
end
end
context 'when invalid `tasks_project_id` is passed' do
let(:another_project) { create(:project) }
let(:additional_params) do
{ invite_source: '_invite_source_', tasks_project_id: another_project.id, tasks_to_be_done: %w(ci code) }
end
it 'does not create task issues' do
expect(TasksToBeDone::CreateWorker).not_to receive(:perform_async)
execute_service
end
end
context 'when a member was already invited' do
let(:user_ids) { create(:project_member, :invited, project: source).invite_email }
let(:additional_params) do
{ invite_source: '_invite_source_', tasks_project_id: source.id, tasks_to_be_done: %w(ci code) }
end
it 'does not create task issues' do
expect(TasksToBeDone::CreateWorker).not_to receive(:perform_async)
execute_service
end
end
end
2017-08-17 22:00:37 +05:30
end