Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/group_spec.rb')
-rw-r--r--spec/models/group_spec.rb121
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) }