diff options
Diffstat (limited to 'spec/models/group_spec.rb')
-rw-r--r-- | spec/models/group_spec.rb | 121 |
1 files changed, 36 insertions, 85 deletions
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index 01fd17bfe10..23e72f6663a 100644 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -390,6 +390,13 @@ RSpec.describe Group, feature_category: :groups_and_projects do expect(internal_group).to be_invalid expect(internal_group.errors[:visibility_level]).to include('private is not allowed since this group contains projects with higher visibility.') end + + it 'is valid if higher visibility project is deleted' do + internal_project.update_attribute(:pending_delete, true) + internal_group.visibility_level = Gitlab::VisibilityLevel::PRIVATE + + expect(internal_group).to be_valid + end end context 'when group has a higher visibility' do @@ -1806,34 +1813,48 @@ RSpec.describe Group, feature_category: :groups_and_projects do end context 'members-related methods' do - let!(:group) { create(:group, :nested) } - let!(:sub_group) { create(:group, parent: group) } - let!(:maintainer) { group.parent.add_member(create(:user), GroupMember::MAINTAINER) } - let!(:developer) { group.add_member(create(:user), GroupMember::DEVELOPER) } - let!(:other_developer) { group.add_member(create(:user), GroupMember::DEVELOPER) } + let_it_be(:group) { create(:group, :nested) } + let_it_be(:sub_group) { create(:group, parent: group) } + + let_it_be(:maintainer) { group.parent.add_member(create(:user), GroupMember::MAINTAINER) } + let_it_be(:developer) { group.add_member(create(:user), GroupMember::DEVELOPER) } + let_it_be(:other_developer) { group.add_member(create(:user), GroupMember::DEVELOPER) } - describe '#direct_and_indirect_members' do + describe '#hierarchy_members' do it 'returns parents members' do - expect(group.direct_and_indirect_members).to include(developer) - expect(group.direct_and_indirect_members).to include(maintainer) + expect(group.hierarchy_members).to include(developer) + expect(group.hierarchy_members).to include(maintainer) end it 'returns descendant members' do - expect(group.direct_and_indirect_members).to include(other_developer) + expect(group.hierarchy_members).to include(other_developer) end end - describe '#direct_and_indirect_members_with_inactive' do - let!(:maintainer_blocked) { group.parent.add_member(create(:user, :blocked), GroupMember::MAINTAINER) } + describe '#hierarchy_members_with_inactive' do + let_it_be(:maintainer_blocked) { group.parent.add_member(create(:user, :blocked), GroupMember::MAINTAINER) } it 'returns parents members' do - expect(group.direct_and_indirect_members_with_inactive).to include(developer) - expect(group.direct_and_indirect_members_with_inactive).to include(maintainer) - expect(group.direct_and_indirect_members_with_inactive).to include(maintainer_blocked) + expect(group.hierarchy_members_with_inactive).to include(developer) + expect(group.hierarchy_members_with_inactive).to include(maintainer) + expect(group.hierarchy_members_with_inactive).to include(maintainer_blocked) end it 'returns descendant members' do - expect(group.direct_and_indirect_members_with_inactive).to include(other_developer) + expect(group.hierarchy_members_with_inactive).to include(other_developer) + end + end + + describe '#descendant_project_members_with_inactive' do + let_it_be(:ancestor_group_project) { create(:project, group: group) } + let_it_be(:ancestor_group_project_member) { ancestor_group_project.add_maintainer(create(:user)) } + + let_it_be(:project) { create(:project, group: sub_group) } + let_it_be(:project_member) { project.add_maintainer(create(:user)) } + let_it_be(:blocked_project_member) { project.add_maintainer(create(:user, :blocked)) } + + it 'returns members of descendant projects' do + expect(sub_group.descendant_project_members_with_inactive).to contain_exactly(project_member, blocked_project_member) end end end @@ -1857,76 +1878,6 @@ RSpec.describe Group, feature_category: :groups_and_projects do end end - context 'user-related methods' do - let_it_be(:user_a) { create(:user) } - let_it_be(:user_b) { create(:user) } - let_it_be(:user_c) { create(:user) } - let_it_be(:user_d) { create(:user) } - - let_it_be(:group) { create(:group) } - let_it_be(:nested_group) { create(:group, parent: group) } - let_it_be(:deep_nested_group) { create(:group, parent: nested_group) } - let_it_be(:project) { create(:project, namespace: group) } - - let_it_be(:another_group) { create(:group) } - let_it_be(:another_user) { create(:user) } - - before_all do - group.add_developer(user_a) - group.add_developer(user_c) - nested_group.add_developer(user_b) - deep_nested_group.add_developer(user_a) - project.add_developer(user_d) - - another_group.add_developer(another_user) - - create(:group_group_link, shared_group: group, shared_with_group: another_group) - end - - describe '#direct_and_indirect_users' do - it 'returns member users on every nest level without duplication' do - expect(group.direct_and_indirect_users).to contain_exactly(user_a, user_b, user_c, user_d) - expect(nested_group.direct_and_indirect_users).to contain_exactly(user_a, user_b, user_c) - expect(deep_nested_group.direct_and_indirect_users).to contain_exactly(user_a, user_b, user_c) - end - - it 'does not return members of projects belonging to ancestor groups' do - expect(nested_group.direct_and_indirect_users).not_to include(user_d) - end - - context 'when share_with_groups is true' do - it 'also returns members of groups invited to this group' do - expect(group.direct_and_indirect_users(share_with_groups: true)) - .to contain_exactly(user_a, user_b, user_c, user_d, another_user) - end - end - end - - describe '#direct_and_indirect_users_with_inactive' do - let(:user_blocked_1) { create(:user, :blocked) } - let(:user_blocked_2) { create(:user, :blocked) } - let(:user_blocked_3) { create(:user, :blocked) } - let(:project_in_group) { create(:project, namespace: nested_group) } - - before do - group.add_developer(user_blocked_1) - nested_group.add_developer(user_blocked_1) - deep_nested_group.add_developer(user_blocked_2) - project_in_group.add_developer(user_blocked_3) - end - - it 'returns member users on every nest level without duplication' do - expect(group.direct_and_indirect_users_with_inactive).to contain_exactly(user_a, user_b, user_c, user_d, user_blocked_1, user_blocked_2, user_blocked_3) - expect(nested_group.direct_and_indirect_users_with_inactive).to contain_exactly(user_a, user_b, user_c, user_blocked_1, user_blocked_2, user_blocked_3) - expect(deep_nested_group.direct_and_indirect_users_with_inactive).to contain_exactly(user_a, user_b, user_c, user_blocked_1, user_blocked_2) - end - - it 'returns members of projects belonging to group' do - expect(nested_group.direct_and_indirect_users_with_inactive).to include(user_blocked_3) - end - end - end - describe '#project_users_with_descendants' do let(:user_a) { create(:user) } let(:user_b) { create(:user) } |