2019-02-15 15:39:39 +05:30
# frozen_string_literal: true
2020-03-13 15:44:24 +05:30
RSpec . shared_examples 'inherited access level as a member of entity' do
2019-02-15 15:39:39 +05:30
let ( :parent_entity ) { create ( :group ) }
let ( :user ) { create ( :user ) }
2022-03-02 08:16:31 +05:30
let ( :member ) { entity . member ( user ) }
2019-02-15 15:39:39 +05:30
context 'with root parent_entity developer member' do
before do
parent_entity . add_developer ( user )
end
it 'is allowed to be a maintainer of the entity' do
entity . add_maintainer ( user )
expect ( member . access_level ) . to eq ( Gitlab :: Access :: MAINTAINER )
end
it 'is not allowed to be a reporter of the entity' do
entity . add_reporter ( user )
expect ( member ) . to be_nil
end
it 'is allowed to change to be a developer of the entity' do
entity . add_maintainer ( user )
2020-11-24 15:15:51 +05:30
expect { member . update! ( access_level : Gitlab :: Access :: DEVELOPER ) }
2019-02-15 15:39:39 +05:30
. to change { member . access_level } . to ( Gitlab :: Access :: DEVELOPER )
end
it 'is not allowed to change to be a guest of the entity' do
entity . add_maintainer ( user )
2020-11-24 15:15:51 +05:30
expect { member . update ( access_level : Gitlab :: Access :: GUEST ) } # rubocop:disable Rails/SaveBang
2019-02-15 15:39:39 +05:30
. not_to change { member . reload . access_level }
end
it " shows an error if the member can't be updated " do
entity . add_maintainer ( user )
2020-11-24 15:15:51 +05:30
expect { member . update! ( access_level : Gitlab :: Access :: REPORTER ) } . to raise_error ( ActiveRecord :: RecordInvalid )
2019-02-15 15:39:39 +05:30
2019-07-07 11:18:12 +05:30
expect ( member . errors . full_messages ) . to eq ( [ " Access level should be greater than or equal to Developer inherited membership from group #{ parent_entity . name } " ] )
2019-02-15 15:39:39 +05:30
end
it 'allows changing the level from a non existing member' do
non_member_user = create ( :user )
entity . add_maintainer ( non_member_user )
2022-03-02 08:16:31 +05:30
non_member = entity . member ( non_member_user )
2019-02-15 15:39:39 +05:30
2020-11-24 15:15:51 +05:30
expect { non_member . update! ( access_level : Gitlab :: Access :: GUEST ) }
2019-02-15 15:39:39 +05:30
. to change { non_member . reload . access_level }
end
end
end
2020-03-13 15:44:24 +05:30
RSpec . shared_examples '#valid_level_roles' do | entity_name |
2019-02-15 15:39:39 +05:30
let ( :member_user ) { create ( :user ) }
let ( :group ) { create ( :group ) }
2020-11-24 15:15:51 +05:30
let ( :entity ) { create ( entity_name ) } # rubocop:disable Rails/SaveBang
2019-02-15 15:39:39 +05:30
let ( :entity_member ) { create ( " #{ entity_name } _member " , :developer , source : entity , user : member_user ) }
let ( :presenter ) { described_class . new ( entity_member , current_user : member_user ) }
let ( :expected_roles ) { { 'Developer' = > 30 , 'Maintainer' = > 40 , 'Reporter' = > 20 } }
it 'returns all roles when no parent member is present' do
expect ( presenter . valid_level_roles ) . to eq ( entity_member . class . access_level_roles )
end
it 'returns higher roles when a parent member is present' do
group . add_reporter ( member_user )
expect ( presenter . valid_level_roles ) . to eq ( expected_roles )
end
end
2021-09-30 23:02:18 +05:30
RSpec . shared_examples_for " member creation " do
let_it_be ( :admin ) { create ( :admin ) }
2022-07-16 23:28:13 +05:30
it 'returns a Member object' , :aggregate_failures do
2022-08-13 15:12:31 +05:30
member = described_class . add_member ( source , user , :maintainer )
2022-06-21 17:19:12 +05:30
2022-07-16 23:28:13 +05:30
expect ( member ) . to be_a member_type
expect ( member ) . to be_persisted
end
2022-06-21 17:19:12 +05:30
2022-07-16 23:28:13 +05:30
context 'when adding a project_bot' do
let_it_be ( :project_bot ) { create ( :user , :project_bot ) }
2022-06-21 17:19:12 +05:30
2022-07-16 23:28:13 +05:30
before_all do
source . add_owner ( user )
end
2022-06-21 17:19:12 +05:30
2022-07-16 23:28:13 +05:30
context 'when project_bot is already a member' do
before do
source . add_developer ( project_bot )
2022-06-21 17:19:12 +05:30
end
2022-07-16 23:28:13 +05:30
it 'does not update the member' do
2022-08-13 15:12:31 +05:30
member = described_class . add_member ( source , project_bot , :maintainer , current_user : user )
2022-06-21 17:19:12 +05:30
2022-07-16 23:28:13 +05:30
expect ( source . users . reload ) . to include ( project_bot )
expect ( member ) . to be_persisted
expect ( member . access_level ) . to eq ( Gitlab :: Access :: DEVELOPER )
expect ( member . errors . full_messages ) . to include ( / not authorized to update member / )
2022-06-21 17:19:12 +05:30
end
end
2022-07-16 23:28:13 +05:30
context 'when project_bot is not already a member' do
it 'adds the member' do
2022-08-13 15:12:31 +05:30
member = described_class . add_member ( source , project_bot , :maintainer , current_user : user )
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect ( source . users . reload ) . to include ( project_bot )
2022-06-21 17:19:12 +05:30
expect ( member ) . to be_persisted
2021-09-30 23:02:18 +05:30
end
end
2022-07-16 23:28:13 +05:30
end
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
context 'when admin mode is enabled' , :enable_admin_mode , :aggregate_failures do
it 'sets members.created_by to the given admin current_user' do
2022-08-13 15:12:31 +05:30
member = described_class . add_member ( source , user , :maintainer , current_user : admin )
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect ( member ) . to be_persisted
expect ( source . users . reload ) . to include ( user )
expect ( member . created_by ) . to eq ( admin )
2021-09-30 23:02:18 +05:30
end
2022-07-16 23:28:13 +05:30
end
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
context 'when admin mode is disabled' do
it 'rejects setting members.created_by to the given admin current_user' , :aggregate_failures do
2022-08-13 15:12:31 +05:30
member = described_class . add_member ( source , user , :maintainer , current_user : admin )
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect ( member ) . not_to be_persisted
expect ( source . users . reload ) . not_to include ( user )
expect ( member . errors . full_messages ) . to include ( / not authorized to create member / )
2021-09-30 23:02:18 +05:30
end
2022-07-16 23:28:13 +05:30
end
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
it 'sets members.expires_at to the given expires_at' do
2022-08-13 15:12:31 +05:30
member = described_class . add_member ( source , user , :maintainer , expires_at : Date . new ( 2016 , 9 , 22 ) )
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect ( member . expires_at ) . to eq ( Date . new ( 2016 , 9 , 22 ) )
end
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
described_class . access_levels . each do | sym_key , int_access_level |
it " accepts the : #{ sym_key } symbol as access level " , :aggregate_failures do
expect ( source . users ) . not_to include ( user )
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
member = described_class . add_member ( source , user . id , sym_key )
2022-07-16 23:28:13 +05:30
expect ( member . access_level ) . to eq ( int_access_level )
expect ( source . users . reload ) . to include ( user )
end
it " accepts the #{ int_access_level } integer as access level " , :aggregate_failures do
expect ( source . users ) . not_to include ( user )
2022-08-13 15:12:31 +05:30
member = described_class . add_member ( source , user . id , int_access_level )
2022-07-16 23:28:13 +05:30
expect ( member . access_level ) . to eq ( int_access_level )
expect ( source . users . reload ) . to include ( user )
end
end
context 'with no current_user' do
context 'when called with a known user id' do
it 'adds the user as a member' do
2021-09-30 23:02:18 +05:30
expect ( source . users ) . not_to include ( user )
2022-08-13 15:12:31 +05:30
described_class . add_member ( source , user . id , :maintainer )
2021-09-30 23:02:18 +05:30
expect ( source . users . reload ) . to include ( user )
end
end
2022-07-16 23:28:13 +05:30
context 'when called with an unknown user id' do
it 'does not add the user as a member' do
expect ( source . users ) . not_to include ( user )
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
described_class . add_member ( source , non_existing_record_id , :maintainer )
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect ( source . users . reload ) . not_to include ( user )
2021-09-30 23:02:18 +05:30
end
2022-07-16 23:28:13 +05:30
end
context 'when called with a user object' do
it 'adds the user as a member' do
expect ( source . users ) . not_to include ( user )
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
described_class . add_member ( source , user , :maintainer )
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect ( source . users . reload ) . to include ( user )
end
end
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
context 'when called with a requester user object' do
before do
source . request_access ( user )
2021-09-30 23:02:18 +05:30
end
2022-07-23 23:45:48 +05:30
it 'does not add the requester as a regular member' , :aggregate_failures do
2022-07-16 23:28:13 +05:30
expect ( source . users ) . not_to include ( user )
expect ( source . requesters . exists? ( user_id : user ) ) . to be_truthy
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect do
2022-08-13 15:12:31 +05:30
described_class . add_member ( source , user , :maintainer )
2022-07-16 23:28:13 +05:30
end . to raise_error ( Gitlab :: Access :: AccessDeniedError )
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect ( source . users . reload ) . not_to include ( user )
expect ( source . requesters . reload . exists? ( user_id : user ) ) . to be_truthy
2021-09-30 23:02:18 +05:30
end
2022-07-16 23:28:13 +05:30
end
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
context 'when called with a known user email' do
it 'adds the user as a member' do
expect ( source . users ) . not_to include ( user )
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
described_class . add_member ( source , user . email , :maintainer )
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect ( source . users . reload ) . to include ( user )
2021-09-30 23:02:18 +05:30
end
2022-07-16 23:28:13 +05:30
end
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
context 'when called with an unknown user email' do
it 'creates an invited member' do
expect ( source . users ) . not_to include ( user )
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
described_class . add_member ( source , 'user@example.com' , :maintainer )
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect ( source . members . invite . pluck ( :invite_email ) ) . to include ( 'user@example.com' )
2021-09-30 23:02:18 +05:30
end
2022-07-16 23:28:13 +05:30
end
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
context 'when called with an unknown user email starting with a number' do
it 'creates an invited member' , :aggregate_failures do
email_starting_with_number = " #{ user . id } _email@example.com "
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
described_class . add_member ( source , email_starting_with_number , :maintainer )
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect ( source . members . invite . pluck ( :invite_email ) ) . to include ( email_starting_with_number )
expect ( source . users . reload ) . not_to include ( user )
2021-09-30 23:02:18 +05:30
end
2022-07-16 23:28:13 +05:30
end
end
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
context 'when current_user can update member' , :enable_admin_mode do
it 'creates the member' do
expect ( source . users ) . not_to include ( user )
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
described_class . add_member ( source , user , :maintainer , current_user : admin )
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect ( source . users . reload ) . to include ( user )
2021-09-30 23:02:18 +05:30
end
2022-07-16 23:28:13 +05:30
context 'when called with a requester user object' do
before do
source . request_access ( user )
end
it 'adds the requester as a member' , :aggregate_failures do
2021-09-30 23:02:18 +05:30
expect ( source . users ) . not_to include ( user )
2022-07-16 23:28:13 +05:30
expect ( source . requesters . exists? ( user_id : user ) ) . to be_truthy
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
described_class . add_member ( source , user , :maintainer , current_user : admin )
2021-09-30 23:02:18 +05:30
expect ( source . users . reload ) . to include ( user )
2022-07-16 23:28:13 +05:30
expect ( source . requesters . reload . exists? ( user_id : user ) ) . to be_falsy
2021-09-30 23:02:18 +05:30
end
2022-07-16 23:28:13 +05:30
end
end
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
context 'when current_user cannot update member' do
it 'does not create the member' , :aggregate_failures do
expect ( source . users ) . not_to include ( user )
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
member = described_class . add_member ( source , user , :maintainer , current_user : user )
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
expect ( source . users . reload ) . not_to include ( user )
expect ( member ) . not_to be_persisted
end
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
context 'when called with a requester user object' do
before do
source . request_access ( user )
2021-09-30 23:02:18 +05:30
end
2022-07-16 23:28:13 +05:30
it 'does not destroy the requester' , :aggregate_failures do
2021-09-30 23:02:18 +05:30
expect ( source . users ) . not_to include ( user )
2022-07-16 23:28:13 +05:30
expect ( source . requesters . exists? ( user_id : user ) ) . to be_truthy
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
described_class . add_member ( source , user , :maintainer , current_user : user )
2021-09-30 23:02:18 +05:30
expect ( source . users . reload ) . not_to include ( user )
2022-07-16 23:28:13 +05:30
expect ( source . requesters . exists? ( user_id : user ) ) . to be_truthy
2021-09-30 23:02:18 +05:30
end
2022-07-16 23:28:13 +05:30
end
end
2021-09-30 23:02:18 +05:30
2022-07-16 23:28:13 +05:30
context 'when member already exists' do
2022-08-13 15:12:31 +05:30
context 'when member is a user' do
before do
source . add_member ( user , :developer )
end
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
context 'with no current_user' do
it 'updates the member' do
expect ( source . users ) . to include ( user )
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
described_class . add_member ( source , user , :maintainer )
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
expect ( source . members . find_by ( user_id : user ) . access_level ) . to eq ( Gitlab :: Access :: MAINTAINER )
end
2021-09-30 23:02:18 +05:30
end
2022-08-13 15:12:31 +05:30
context 'when current_user can update member' , :enable_admin_mode do
it 'updates the member' do
expect ( source . users ) . to include ( user )
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
described_class . add_member ( source , user , :maintainer , current_user : admin )
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
expect ( source . members . find_by ( user_id : user ) . access_level ) . to eq ( Gitlab :: Access :: MAINTAINER )
end
2021-09-30 23:02:18 +05:30
end
2022-08-13 15:12:31 +05:30
context 'when current_user cannot update member' do
it 'does not update the member' do
expect ( source . users ) . to include ( user )
described_class . add_member ( source , user , :maintainer , current_user : user )
expect ( source . members . find_by ( user_id : user ) . access_level ) . to eq ( Gitlab :: Access :: DEVELOPER )
end
end
end
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
context 'when member is an invite by email' do
let_it_be ( :email ) { 'user@email.com' }
let_it_be ( :existing_member ) { source . add_developer ( email ) }
2021-09-30 23:02:18 +05:30
2022-08-13 15:12:31 +05:30
it 'updates the member for that email' do
expect do
described_class . add_member ( source , email , :maintainer )
end . to change { existing_member . reset . access_level } . from ( Member :: DEVELOPER ) . to ( Member :: MAINTAINER )
. and not_change { source . members . invite . count }
2021-09-30 23:02:18 +05:30
end
2022-07-16 23:28:13 +05:30
end
end
2022-07-23 23:45:48 +05:30
end
2021-09-30 23:02:18 +05:30
2022-07-23 23:45:48 +05:30
RSpec . shared_examples_for " bulk member creation " do
let_it_be ( :admin ) { create ( :admin ) }
let_it_be ( :user1 ) { create ( :user ) }
let_it_be ( :user2 ) { create ( :user ) }
2021-09-30 23:02:18 +05:30
2022-07-23 23:45:48 +05:30
context 'when current user does not have permission' do
it 'does not succeed' do
# maintainers cannot add owners
source . add_maintainer ( user )
2022-07-16 23:28:13 +05:30
2022-08-13 15:12:31 +05:30
expect ( described_class . add_members ( source , [ user1 , user2 ] , :owner , current_user : user ) ) . to be_empty
2021-09-30 23:02:18 +05:30
end
2022-07-23 23:45:48 +05:30
end
2021-12-11 22:18:48 +05:30
2022-07-23 23:45:48 +05:30
it 'returns Member objects' do
2022-08-13 15:12:31 +05:30
members = described_class . add_members ( source , [ user1 , user2 ] , :maintainer )
2021-12-11 22:18:48 +05:30
2022-07-23 23:45:48 +05:30
expect ( members . map ( & :user ) ) . to contain_exactly ( user1 , user2 )
expect ( members ) . to all ( be_a ( member_type ) )
expect ( members ) . to all ( be_persisted )
end
2022-04-04 11:22:00 +05:30
2022-07-23 23:45:48 +05:30
it 'returns an empty array' do
2022-08-13 15:12:31 +05:30
members = described_class . add_members ( source , [ ] , :maintainer )
2022-07-16 23:28:13 +05:30
2022-07-23 23:45:48 +05:30
expect ( members ) . to be_a Array
expect ( members ) . to be_empty
2021-09-30 23:02:18 +05:30
end
2021-11-11 11:23:49 +05:30
2022-07-23 23:45:48 +05:30
it 'supports different formats' do
list = [ 'joe@local.test' , admin , user1 . id , user2 . id . to_s ]
2021-11-11 11:23:49 +05:30
2022-08-13 15:12:31 +05:30
members = described_class . add_members ( source , list , :maintainer )
2021-09-30 23:02:18 +05:30
2022-07-23 23:45:48 +05:30
expect ( members . size ) . to eq ( 4 )
expect ( members . first ) . to be_invite
end
2021-09-30 23:02:18 +05:30
2022-07-23 23:45:48 +05:30
context 'with de-duplication' do
it 'has the same user by id and user' do
2022-08-13 15:12:31 +05:30
members = described_class . add_members ( source , [ user1 . id , user1 , user1 . id , user2 , user2 . id , user2 ] , :maintainer )
2021-09-30 23:02:18 +05:30
2022-05-07 20:08:51 +05:30
expect ( members . map ( & :user ) ) . to contain_exactly ( user1 , user2 )
2021-11-11 11:23:49 +05:30
expect ( members ) . to all ( be_a ( member_type ) )
expect ( members ) . to all ( be_persisted )
2021-09-30 23:02:18 +05:30
end
2022-07-23 23:45:48 +05:30
it 'has the same user sent more than once' do
2022-08-13 15:12:31 +05:30
members = described_class . add_members ( source , [ user1 , user1 ] , :maintainer )
2021-09-30 23:02:18 +05:30
2022-07-23 23:45:48 +05:30
expect ( members . map ( & :user ) ) . to contain_exactly ( user1 )
expect ( members ) . to all ( be_a ( member_type ) )
expect ( members ) . to all ( be_persisted )
2021-09-30 23:02:18 +05:30
end
2022-07-23 23:45:48 +05:30
end
2021-09-30 23:02:18 +05:30
2022-07-23 23:45:48 +05:30
it 'with the same user sent more than once by user and by email' do
2022-08-13 15:12:31 +05:30
members = described_class . add_members ( source , [ user1 , user1 . email ] , :maintainer )
2021-09-30 23:02:18 +05:30
2022-07-23 23:45:48 +05:30
expect ( members . map ( & :user ) ) . to contain_exactly ( user1 )
expect ( members ) . to all ( be_a ( member_type ) )
expect ( members ) . to all ( be_persisted )
end
2021-09-30 23:02:18 +05:30
2022-07-23 23:45:48 +05:30
it 'with the same user sent more than once by user id and by email' do
2022-08-13 15:12:31 +05:30
members = described_class . add_members ( source , [ user1 . id , user1 . email ] , :maintainer )
2021-11-11 11:23:49 +05:30
2022-07-23 23:45:48 +05:30
expect ( members . map ( & :user ) ) . to contain_exactly ( user1 )
expect ( members ) . to all ( be_a ( member_type ) )
expect ( members ) . to all ( be_persisted )
end
context 'when a member already exists' do
before do
2022-08-13 15:12:31 +05:30
source . add_member ( user1 , :developer )
2022-07-23 23:45:48 +05:30
end
2021-11-11 11:23:49 +05:30
2022-07-23 23:45:48 +05:30
it 'has the same user sent more than once with the member already existing' do
expect do
2022-08-13 15:12:31 +05:30
members = described_class . add_members ( source , [ user1 , user1 , user2 ] , :maintainer )
2022-05-07 20:08:51 +05:30
expect ( members . map ( & :user ) ) . to contain_exactly ( user1 , user2 )
2021-11-11 11:23:49 +05:30
expect ( members ) . to all ( be_a ( member_type ) )
expect ( members ) . to all ( be_persisted )
2022-07-23 23:45:48 +05:30
end . to change { Member . count } . by ( 1 )
end
2021-11-11 11:23:49 +05:30
2022-07-23 23:45:48 +05:30
it 'supports existing users as expected with user_ids passed' do
user3 = create ( :user )
2021-11-11 11:23:49 +05:30
2022-07-23 23:45:48 +05:30
expect do
2022-08-13 15:12:31 +05:30
members = described_class . add_members ( source , [ user1 . id , user2 , user3 . id ] , :maintainer )
2022-07-23 23:45:48 +05:30
expect ( members . map ( & :user ) ) . to contain_exactly ( user1 , user2 , user3 )
2021-11-11 11:23:49 +05:30
expect ( members ) . to all ( be_a ( member_type ) )
expect ( members ) . to all ( be_persisted )
2022-07-23 23:45:48 +05:30
end . to change { Member . count } . by ( 2 )
2021-11-11 11:23:49 +05:30
end
2022-07-23 23:45:48 +05:30
it 'supports existing users as expected without user ids passed' do
user3 = create ( :user )
2022-06-21 17:19:12 +05:30
2022-07-23 23:45:48 +05:30
expect do
2022-08-13 15:12:31 +05:30
members = described_class . add_members ( source , [ user1 , user2 , user3 ] , :maintainer )
2022-07-23 23:45:48 +05:30
expect ( members . map ( & :user ) ) . to contain_exactly ( user1 , user2 , user3 )
expect ( members ) . to all ( be_a ( member_type ) )
expect ( members ) . to all ( be_persisted )
end . to change { Member . count } . by ( 2 )
2022-06-21 17:19:12 +05:30
end
2022-07-23 23:45:48 +05:30
end
2022-06-21 17:19:12 +05:30
2022-07-23 23:45:48 +05:30
context 'when `tasks_to_be_done` and `tasks_project_id` are passed' do
let ( :task_project ) { source . is_a? ( Group ) ? create ( :project , group : source ) : source }
2022-06-21 17:19:12 +05:30
2022-07-23 23:45:48 +05:30
it 'creates a member_task with the correct attributes' , :aggregate_failures do
2022-08-13 15:12:31 +05:30
members = described_class . add_members ( source , [ user1 ] , :developer , tasks_to_be_done : %w( ci code ) , tasks_project_id : task_project . id )
2022-07-23 23:45:48 +05:30
member = members . last
expect ( member . tasks_to_be_done ) . to match_array ( [ :ci , :code ] )
expect ( member . member_task . project ) . to eq ( task_project )
2022-06-21 17:19:12 +05:30
end
2022-07-23 23:45:48 +05:30
context 'with an already existing member' do
2021-11-11 11:23:49 +05:30
before do
2022-08-13 15:12:31 +05:30
source . add_member ( user1 , :developer )
2021-11-11 11:23:49 +05:30
end
2022-07-23 23:45:48 +05:30
it 'does not update tasks to be done if tasks already exist' , :aggregate_failures do
member = source . members . find_by ( user_id : user1 . id )
create ( :member_task , member : member , project : task_project , tasks_to_be_done : %w( code ci ) )
2021-11-11 11:23:49 +05:30
2022-05-07 20:08:51 +05:30
expect do
2022-08-13 15:12:31 +05:30
described_class . add_members ( source ,
2022-07-23 23:45:48 +05:30
[ user1 . id ] ,
:developer ,
tasks_to_be_done : %w( issues ) ,
tasks_project_id : task_project . id )
end . not_to change ( MemberTask , :count )
2022-05-07 20:08:51 +05:30
2022-07-23 23:45:48 +05:30
member . reset
expect ( member . tasks_to_be_done ) . to match_array ( [ :code , :ci ] )
expect ( member . member_task . project ) . to eq ( task_project )
end
2021-11-11 11:23:49 +05:30
2022-07-23 23:45:48 +05:30
it 'adds tasks to be done if they do not exist' , :aggregate_failures do
2022-05-07 20:08:51 +05:30
expect do
2022-08-13 15:12:31 +05:30
described_class . add_members ( source ,
2022-07-23 23:45:48 +05:30
[ user1 . id ] ,
:developer ,
tasks_to_be_done : %w( issues ) ,
tasks_project_id : task_project . id )
end . to change ( MemberTask , :count ) . by ( 1 )
member = source . members . find_by ( user_id : user1 . id )
expect ( member . tasks_to_be_done ) . to match_array ( [ :issues ] )
expect ( member . member_task . project ) . to eq ( task_project )
2021-11-11 11:23:49 +05:30
end
end
2022-07-23 23:45:48 +05:30
end
end
RSpec . shared_examples 'owner management' do
describe '.cannot_manage_owners?' do
subject { described_class . cannot_manage_owners? ( source , user ) }
2021-12-11 22:18:48 +05:30
2022-07-23 23:45:48 +05:30
context 'when maintainer' do
before do
source . add_maintainer ( user )
end
2022-04-04 11:22:00 +05:30
2022-07-23 23:45:48 +05:30
it 'cannot manage owners' do
expect ( subject ) . to be_truthy
end
end
2021-12-11 22:18:48 +05:30
2022-07-23 23:45:48 +05:30
context 'when owner' do
before do
source . add_owner ( user )
2021-12-11 22:18:48 +05:30
end
2022-04-04 11:22:00 +05:30
2022-07-23 23:45:48 +05:30
it 'can manage owners' do
expect ( subject ) . to be_falsey
2022-04-04 11:22:00 +05:30
end
2021-12-11 22:18:48 +05:30
end
2021-09-30 23:02:18 +05:30
end
end