Merge branch 'ce-8333-add-related-epics-support' into 'master'

CE port: Rename GroupHierarchy into ObjectHierarchy

See merge request gitlab-org/gitlab-ce!23923
This commit is contained in:
Dmitriy Zaporozhets 2018-12-20 12:49:25 +00:00
commit 24c9e1e2a8
32 changed files with 96 additions and 84 deletions

View File

@ -403,7 +403,7 @@ class ApplicationController < ActionController::Base
end end
def manifest_import_enabled? def manifest_import_enabled?
Group.supports_nested_groups? && Gitlab::CurrentSettings.import_sources.include?('manifest') Group.supports_nested_objects? && Gitlab::CurrentSettings.import_sources.include?('manifest')
end end
# U2F (universal 2nd factor) devices need a unique identifier for the application # U2F (universal 2nd factor) devices need a unique identifier for the application

View File

@ -32,14 +32,14 @@ module GroupTree
def filtered_groups_with_ancestors(groups) def filtered_groups_with_ancestors(groups)
filtered_groups = groups.search(params[:filter]).page(params[:page]) filtered_groups = groups.search(params[:filter]).page(params[:page])
if Group.supports_nested_groups? if Group.supports_nested_objects?
# We find the ancestors by ID of the search results here. # We find the ancestors by ID of the search results here.
# Otherwise the ancestors would also have filters applied, # Otherwise the ancestors would also have filters applied,
# which would cause them not to be preloaded. # which would cause them not to be preloaded.
# #
# Pagination needs to be applied before loading the ancestors to # Pagination needs to be applied before loading the ancestors to
# make sure ancestors are not cut off by pagination. # make sure ancestors are not cut off by pagination.
Gitlab::GroupHierarchy.new(Group.where(id: filtered_groups.select(:id))) Gitlab::ObjectHierarchy.new(Group.where(id: filtered_groups.select(:id)))
.base_and_ancestors .base_and_ancestors
else else
filtered_groups filtered_groups

View File

@ -112,7 +112,7 @@ class GroupDescendantsFinder
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
def ancestors_of_groups(base_for_ancestors) def ancestors_of_groups(base_for_ancestors)
group_ids = base_for_ancestors.except(:select, :sort).select(:id) group_ids = base_for_ancestors.except(:select, :sort).select(:id)
Gitlab::GroupHierarchy.new(Group.where(id: group_ids)) Gitlab::ObjectHierarchy.new(Group.where(id: group_ids))
.base_and_ancestors(upto: parent_group.id) .base_and_ancestors(upto: parent_group.id)
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
@ -132,7 +132,7 @@ class GroupDescendantsFinder
end end
def subgroups def subgroups
return Group.none unless Group.supports_nested_groups? return Group.none unless Group.supports_nested_objects?
# When filtering subgroups, we want to find all matches withing the tree of # When filtering subgroups, we want to find all matches withing the tree of
# descendants to show to the user # descendants to show to the user
@ -183,7 +183,7 @@ class GroupDescendantsFinder
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
def hierarchy_for_parent def hierarchy_for_parent
@hierarchy ||= Gitlab::GroupHierarchy.new(Group.where(id: parent_group.id)) @hierarchy ||= Gitlab::ObjectHierarchy.new(Group.where(id: parent_group.id))
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
end end

View File

@ -46,7 +46,7 @@ class GroupsFinder < UnionFinder
return [Group.all] if current_user&.full_private_access? && all_available? return [Group.all] if current_user&.full_private_access? && all_available?
groups = [] groups = []
groups << Gitlab::GroupHierarchy.new(groups_for_ancestors, groups_for_descendants).all_groups if current_user groups << Gitlab::ObjectHierarchy.new(groups_for_ancestors, groups_for_descendants).all_objects if current_user
groups << Group.unscoped.public_to_user(current_user) if include_public_groups? groups << Group.unscoped.public_to_user(current_user) if include_public_groups?
groups << Group.none if groups.empty? groups << Group.none if groups.empty?
groups groups
@ -66,7 +66,7 @@ class GroupsFinder < UnionFinder
.groups .groups
.where('members.access_level >= ?', params[:min_access_level]) .where('members.access_level >= ?', params[:min_access_level])
Gitlab::GroupHierarchy Gitlab::ObjectHierarchy
.new(groups) .new(groups)
.base_and_descendants .base_and_descendants
end end

View File

@ -126,7 +126,7 @@ module GroupsHelper
end end
def supports_nested_groups? def supports_nested_groups?
Group.supports_nested_groups? Group.supports_nested_objects?
end end
private private

View File

@ -66,7 +66,7 @@ module Ci
scope :belonging_to_parent_group_of_project, -> (project_id) { scope :belonging_to_parent_group_of_project, -> (project_id) {
project_groups = ::Group.joins(:projects).where(projects: { id: project_id }) project_groups = ::Group.joins(:projects).where(projects: { id: project_id })
hierarchy_groups = Gitlab::GroupHierarchy.new(project_groups).base_and_ancestors hierarchy_groups = Gitlab::ObjectHierarchy.new(project_groups).base_and_ancestors
joins(:groups).where(namespaces: { id: hierarchy_groups }) joins(:groups).where(namespaces: { id: hierarchy_groups })
} }

View File

@ -0,0 +1,11 @@
# frozen_string_literal: true
module Descendant
extend ActiveSupport::Concern
class_methods do
def supports_nested_objects?
Gitlab::Database.postgresql?
end
end
end

View File

@ -10,6 +10,7 @@ class Group < Namespace
include Referable include Referable
include SelectForProjectAuthorization include SelectForProjectAuthorization
include LoadedInGroupList include LoadedInGroupList
include Descendant
include GroupDescendant include GroupDescendant
include TokenAuthenticatable include TokenAuthenticatable
include WithUploads include WithUploads
@ -63,10 +64,6 @@ class Group < Namespace
after_update :path_changed_hook, if: :path_changed? after_update :path_changed_hook, if: :path_changed?
class << self class << self
def supports_nested_groups?
Gitlab::Database.postgresql?
end
def sort_by_attribute(method) def sort_by_attribute(method)
if method == 'storage_size_desc' if method == 'storage_size_desc'
# storage_size is a virtual column so we need to # storage_size is a virtual column so we need to

View File

@ -175,16 +175,16 @@ class Namespace < ActiveRecord::Base
# Returns all ancestors, self, and descendants of the current namespace. # Returns all ancestors, self, and descendants of the current namespace.
def self_and_hierarchy def self_and_hierarchy
Gitlab::GroupHierarchy Gitlab::ObjectHierarchy
.new(self.class.where(id: id)) .new(self.class.where(id: id))
.all_groups .all_objects
end end
# Returns all the ancestors of the current namespaces. # Returns all the ancestors of the current namespaces.
def ancestors def ancestors
return self.class.none unless parent_id return self.class.none unless parent_id
Gitlab::GroupHierarchy Gitlab::ObjectHierarchy
.new(self.class.where(id: parent_id)) .new(self.class.where(id: parent_id))
.base_and_ancestors .base_and_ancestors
end end
@ -192,27 +192,27 @@ class Namespace < ActiveRecord::Base
# returns all ancestors upto but excluding the given namespace # returns all ancestors upto but excluding the given namespace
# when no namespace is given, all ancestors upto the top are returned # when no namespace is given, all ancestors upto the top are returned
def ancestors_upto(top = nil, hierarchy_order: nil) def ancestors_upto(top = nil, hierarchy_order: nil)
Gitlab::GroupHierarchy.new(self.class.where(id: id)) Gitlab::ObjectHierarchy.new(self.class.where(id: id))
.ancestors(upto: top, hierarchy_order: hierarchy_order) .ancestors(upto: top, hierarchy_order: hierarchy_order)
end end
def self_and_ancestors def self_and_ancestors
return self.class.where(id: id) unless parent_id return self.class.where(id: id) unless parent_id
Gitlab::GroupHierarchy Gitlab::ObjectHierarchy
.new(self.class.where(id: id)) .new(self.class.where(id: id))
.base_and_ancestors .base_and_ancestors
end end
# Returns all the descendants of the current namespace. # Returns all the descendants of the current namespace.
def descendants def descendants
Gitlab::GroupHierarchy Gitlab::ObjectHierarchy
.new(self.class.where(parent_id: id)) .new(self.class.where(parent_id: id))
.base_and_descendants .base_and_descendants
end end
def self_and_descendants def self_and_descendants
Gitlab::GroupHierarchy Gitlab::ObjectHierarchy
.new(self.class.where(id: id)) .new(self.class.where(id: id))
.base_and_descendants .base_and_descendants
end end
@ -293,7 +293,7 @@ class Namespace < ActiveRecord::Base
end end
def force_share_with_group_lock_on_descendants def force_share_with_group_lock_on_descendants
return unless Group.supports_nested_groups? return unless Group.supports_nested_objects?
# We can't use `descendants.update_all` since Rails will throw away the WITH # We can't use `descendants.update_all` since Rails will throw away the WITH
# RECURSIVE statement. We also can't use WHERE EXISTS since we can't use # RECURSIVE statement. We also can't use WHERE EXISTS since we can't use

View File

@ -570,7 +570,7 @@ class Project < ActiveRecord::Base
# returns all ancestor-groups upto but excluding the given namespace # returns all ancestor-groups upto but excluding the given namespace
# when no namespace is given, all ancestors upto the top are returned # when no namespace is given, all ancestors upto the top are returned
def ancestors_upto(top = nil, hierarchy_order: nil) def ancestors_upto(top = nil, hierarchy_order: nil)
Gitlab::GroupHierarchy.new(Group.where(id: namespace_id)) Gitlab::ObjectHierarchy.new(Group.where(id: namespace_id))
.base_and_ancestors(upto: top, hierarchy_order: hierarchy_order) .base_and_ancestors(upto: top, hierarchy_order: hierarchy_order)
end end

View File

@ -709,13 +709,13 @@ class User < ActiveRecord::Base
# Returns the groups a user is a member of, either directly or through a parent group # Returns the groups a user is a member of, either directly or through a parent group
def membership_groups def membership_groups
Gitlab::GroupHierarchy.new(groups).base_and_descendants Gitlab::ObjectHierarchy.new(groups).base_and_descendants
end end
# Returns a relation of groups the user has access to, including their parent # Returns a relation of groups the user has access to, including their parent
# and child groups (recursively). # and child groups (recursively).
def all_expanded_groups def all_expanded_groups
Gitlab::GroupHierarchy.new(groups).all_groups Gitlab::ObjectHierarchy.new(groups).all_objects
end end
def expanded_groups_requiring_two_factor_authentication def expanded_groups_requiring_two_factor_authentication
@ -1153,7 +1153,7 @@ class User < ActiveRecord::Base
end end
def manageable_groups def manageable_groups
Gitlab::GroupHierarchy.new(owned_or_maintainers_groups).base_and_descendants Gitlab::ObjectHierarchy.new(owned_or_maintainers_groups).base_and_descendants
end end
def namespaces def namespaces

View File

@ -16,7 +16,7 @@ class GroupPolicy < BasePolicy
condition(:maintainer) { access_level >= GroupMember::MAINTAINER } condition(:maintainer) { access_level >= GroupMember::MAINTAINER }
condition(:reporter) { access_level >= GroupMember::REPORTER } condition(:reporter) { access_level >= GroupMember::REPORTER }
condition(:nested_groups_supported, scope: :global) { Group.supports_nested_groups? } condition(:nested_groups_supported, scope: :global) { Group.supports_nested_objects? }
condition(:has_parent, scope: :subject) { @subject.has_parent? } condition(:has_parent, scope: :subject) { @subject.has_parent? }
condition(:share_with_group_locked, scope: :subject) { @subject.share_with_group_lock? } condition(:share_with_group_locked, scope: :subject) { @subject.share_with_group_lock? }

View File

@ -118,7 +118,7 @@ module Ci
# Workaround for weird Rails bug, that makes `runner.groups.to_sql` to return `runner_id = NULL` # Workaround for weird Rails bug, that makes `runner.groups.to_sql` to return `runner_id = NULL`
groups = ::Group.joins(:runner_namespaces).merge(runner.runner_namespaces) groups = ::Group.joins(:runner_namespaces).merge(runner.runner_namespaces)
hierarchy_groups = Gitlab::GroupHierarchy.new(groups).base_and_descendants hierarchy_groups = Gitlab::ObjectHierarchy.new(groups).base_and_descendants
projects = Project.where(namespace_id: hierarchy_groups) projects = Project.where(namespace_id: hierarchy_groups)
.with_group_runners_enabled .with_group_runners_enabled
.with_builds_enabled .with_builds_enabled

View File

@ -18,7 +18,7 @@ module Groups
return namespace return namespace
end end
if group_path.include?('/') && !Group.supports_nested_groups? if group_path.include?('/') && !Group.supports_nested_objects?
raise 'Nested groups are not supported on MySQL' raise 'Nested groups are not supported on MySQL'
end end

View File

@ -40,7 +40,7 @@ module Groups
def ensure_allowed_transfer def ensure_allowed_transfer
raise_transfer_error(:group_is_already_root) if group_is_already_root? raise_transfer_error(:group_is_already_root) if group_is_already_root?
raise_transfer_error(:database_not_supported) unless Group.supports_nested_groups? raise_transfer_error(:database_not_supported) unless Group.supports_nested_objects?
raise_transfer_error(:same_parent_as_current) if same_parent? raise_transfer_error(:same_parent_as_current) if same_parent?
raise_transfer_error(:invalid_policies) unless valid_policies? raise_transfer_error(:invalid_policies) unless valid_policies?
raise_transfer_error(:namespace_with_same_path) if namespace_with_same_path? raise_transfer_error(:namespace_with_same_path) if namespace_with_same_path?

View File

@ -102,7 +102,7 @@ module Users
end end
def fresh_authorizations def fresh_authorizations
klass = if Group.supports_nested_groups? klass = if Group.supports_nested_objects?
Gitlab::ProjectAuthorizations::WithNestedGroups Gitlab::ProjectAuthorizations::WithNestedGroups
else else
Gitlab::ProjectAuthorizations::WithoutNestedGroups Gitlab::ProjectAuthorizations::WithoutNestedGroups

View File

@ -323,7 +323,7 @@ module API
expose :request_access_enabled expose :request_access_enabled
expose :full_name, :full_path expose :full_name, :full_path
if ::Group.supports_nested_groups? if ::Group.supports_nested_objects?
expose :parent_id expose :parent_id
end end

View File

@ -113,7 +113,7 @@ module API
requires :name, type: String, desc: 'The name of the group' requires :name, type: String, desc: 'The name of the group'
requires :path, type: String, desc: 'The path of the group' requires :path, type: String, desc: 'The path of the group'
if ::Group.supports_nested_groups? if ::Group.supports_nested_objects?
optional :parent_id, type: Integer, desc: 'The parent group id for creating nested group' optional :parent_id, type: Integer, desc: 'The parent group id for creating nested group'
end end

View File

@ -1,16 +1,16 @@
# frozen_string_literal: true # frozen_string_literal: true
module Gitlab module Gitlab
# Retrieving of parent or child groups based on a base ActiveRecord relation. # Retrieving of parent or child objects based on a base ActiveRecord relation.
# #
# This class uses recursive CTEs and as a result will only work on PostgreSQL. # This class uses recursive CTEs and as a result will only work on PostgreSQL.
class GroupHierarchy class ObjectHierarchy
attr_reader :ancestors_base, :descendants_base, :model attr_reader :ancestors_base, :descendants_base, :model
# ancestors_base - An instance of ActiveRecord::Relation for which to # ancestors_base - An instance of ActiveRecord::Relation for which to
# get parent groups. # get parent objects.
# descendants_base - An instance of ActiveRecord::Relation for which to # descendants_base - An instance of ActiveRecord::Relation for which to
# get child groups. If omitted, ancestors_base is used. # get child objects. If omitted, ancestors_base is used.
def initialize(ancestors_base, descendants_base = ancestors_base) def initialize(ancestors_base, descendants_base = ancestors_base)
raise ArgumentError.new("Model of ancestors_base does not match model of descendants_base") if ancestors_base.model != descendants_base.model raise ArgumentError.new("Model of ancestors_base does not match model of descendants_base") if ancestors_base.model != descendants_base.model
@ -39,7 +39,7 @@ module Gitlab
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
# Returns a relation that includes the ancestors_base set of groups # Returns a relation that includes the ancestors_base set of objects
# and all their ancestors (recursively). # and all their ancestors (recursively).
# #
# Passing an `upto` will stop the recursion once the specified parent_id is # Passing an `upto` will stop the recursion once the specified parent_id is
@ -47,13 +47,13 @@ module Gitlab
# included. # included.
# #
# Passing a `hierarchy_order` with either `:asc` or `:desc` will cause the # Passing a `hierarchy_order` with either `:asc` or `:desc` will cause the
# recursive query order from most nested group to root or from the root # recursive query order from most nested object to root or from the root
# ancestor to most nested group respectively. This uses a `depth` column # ancestor to most nested object respectively. This uses a `depth` column
# where `1` is defined as the depth for the base and increment as we go up # where `1` is defined as the depth for the base and increment as we go up
# each parent. # each parent.
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
def base_and_ancestors(upto: nil, hierarchy_order: nil) def base_and_ancestors(upto: nil, hierarchy_order: nil)
return ancestors_base unless Group.supports_nested_groups? return ancestors_base unless hierarchy_supported?
recursive_query = base_and_ancestors_cte(upto, hierarchy_order).apply_to(model.all) recursive_query = base_and_ancestors_cte(upto, hierarchy_order).apply_to(model.all)
recursive_query = recursive_query.order(depth: hierarchy_order) if hierarchy_order recursive_query = recursive_query.order(depth: hierarchy_order) if hierarchy_order
@ -62,16 +62,16 @@ module Gitlab
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
# Returns a relation that includes the descendants_base set of groups # Returns a relation that includes the descendants_base set of objects
# and all their descendants (recursively). # and all their descendants (recursively).
def base_and_descendants def base_and_descendants
return descendants_base unless Group.supports_nested_groups? return descendants_base unless hierarchy_supported?
read_only(base_and_descendants_cte.apply_to(model.all)) read_only(base_and_descendants_cte.apply_to(model.all))
end end
# Returns a relation that includes the base groups, their ancestors, # Returns a relation that includes the base objects, their ancestors,
# and the descendants of the base groups. # and the descendants of the base objects.
# #
# The resulting query will roughly look like the following: # The resulting query will roughly look like the following:
# #
@ -91,16 +91,16 @@ module Gitlab
# Using this approach allows us to further add criteria to the relation with # Using this approach allows us to further add criteria to the relation with
# Rails thinking it's selecting data the usual way. # Rails thinking it's selecting data the usual way.
# #
# If nested groups are not supported, ancestors_base is returned. # If nested objects are not supported, ancestors_base is returned.
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
def all_groups def all_objects
return ancestors_base unless Group.supports_nested_groups? return ancestors_base unless hierarchy_supported?
ancestors = base_and_ancestors_cte ancestors = base_and_ancestors_cte
descendants = base_and_descendants_cte descendants = base_and_descendants_cte
ancestors_table = ancestors.alias_to(groups_table) ancestors_table = ancestors.alias_to(objects_table)
descendants_table = descendants.alias_to(groups_table) descendants_table = descendants.alias_to(objects_table)
relation = model relation = model
.unscoped .unscoped
@ -117,23 +117,27 @@ module Gitlab
private private
def hierarchy_supported?
Gitlab::Database.postgresql?
end
# rubocop: disable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord
def base_and_ancestors_cte(stop_id = nil, hierarchy_order = nil) def base_and_ancestors_cte(stop_id = nil, hierarchy_order = nil)
cte = SQL::RecursiveCTE.new(:base_and_ancestors) cte = SQL::RecursiveCTE.new(:base_and_ancestors)
depth_column = :depth depth_column = :depth
base_query = ancestors_base.except(:order) base_query = ancestors_base.except(:order)
base_query = base_query.select("1 as #{depth_column}", groups_table[Arel.star]) if hierarchy_order base_query = base_query.select("1 as #{depth_column}", objects_table[Arel.star]) if hierarchy_order
cte << base_query cte << base_query
# Recursively get all the ancestors of the base set. # Recursively get all the ancestors of the base set.
parent_query = model parent_query = model
.from([groups_table, cte.table]) .from([objects_table, cte.table])
.where(groups_table[:id].eq(cte.table[:parent_id])) .where(objects_table[:id].eq(cte.table[:parent_id]))
.except(:order) .except(:order)
parent_query = parent_query.select(cte.table[depth_column] + 1, groups_table[Arel.star]) if hierarchy_order parent_query = parent_query.select(cte.table[depth_column] + 1, objects_table[Arel.star]) if hierarchy_order
parent_query = parent_query.where(cte.table[:parent_id].not_eq(stop_id)) if stop_id parent_query = parent_query.where(cte.table[:parent_id].not_eq(stop_id)) if stop_id
cte << parent_query cte << parent_query
@ -149,15 +153,15 @@ module Gitlab
# Recursively get all the descendants of the base set. # Recursively get all the descendants of the base set.
cte << model cte << model
.from([groups_table, cte.table]) .from([objects_table, cte.table])
.where(groups_table[:parent_id].eq(cte.table[:id])) .where(objects_table[:parent_id].eq(cte.table[:id]))
.except(:order) .except(:order)
cte cte
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
def groups_table def objects_table
model.arel_table model.arel_table
end end

View File

@ -65,7 +65,7 @@ describe 'Group show page' do
context 'when subgroups are supported', :js, :nested_groups do context 'when subgroups are supported', :js, :nested_groups do
before do before do
allow(Group).to receive(:supports_nested_groups?) { true } allow(Group).to receive(:supports_nested_objects?) { true }
visit path visit path
end end
@ -76,7 +76,7 @@ describe 'Group show page' do
context 'when subgroups are not supported' do context 'when subgroups are not supported' do
before do before do
allow(Group).to receive(:supports_nested_groups?) { false } allow(Group).to receive(:supports_nested_objects?) { false }
visit path visit path
end end

View File

@ -192,7 +192,7 @@ describe Gitlab::BareRepositoryImport::Importer, :seed_helper do
let(:project_path) { 'a-group/a-sub-group/a-project' } let(:project_path) { 'a-group/a-sub-group/a-project' }
before do before do
expect(Group).to receive(:supports_nested_groups?) { false } expect(Group).to receive(:supports_nested_objects?) { false }
end end
describe '#create_project_if_needed' do describe '#create_project_if_needed' do

View File

@ -1,6 +1,6 @@
require 'spec_helper' require 'spec_helper'
describe Gitlab::GroupHierarchy, :postgresql do describe Gitlab::ObjectHierarchy, :postgresql do
let!(:parent) { create(:group) } let!(:parent) { create(:group) }
let!(:child1) { create(:group, parent: parent) } let!(:child1) { create(:group, parent: parent) }
let!(:child2) { create(:group, parent: child1) } let!(:child2) { create(:group, parent: child1) }
@ -105,9 +105,9 @@ describe Gitlab::GroupHierarchy, :postgresql do
end end
end end
describe '#all_groups' do describe '#all_objects' do
let(:relation) do let(:relation) do
described_class.new(Group.where(id: child1.id)).all_groups described_class.new(Group.where(id: child1.id)).all_objects
end end
it 'includes the base rows' do it 'includes the base rows' do
@ -123,13 +123,13 @@ describe Gitlab::GroupHierarchy, :postgresql do
end end
it 'uses ancestors_base #initialize argument for ancestors' do it 'uses ancestors_base #initialize argument for ancestors' do
relation = described_class.new(Group.where(id: child1.id), Group.where(id: Group.maximum(:id).succ)).all_groups relation = described_class.new(Group.where(id: child1.id), Group.where(id: Group.maximum(:id).succ)).all_objects
expect(relation).to include(parent) expect(relation).to include(parent)
end end
it 'uses descendants_base #initialize argument for descendants' do it 'uses descendants_base #initialize argument for descendants' do
relation = described_class.new(Group.where(id: Group.maximum(:id).succ), Group.where(id: child1.id)).all_groups relation = described_class.new(Group.where(id: Group.maximum(:id).succ), Group.where(id: child1.id)).all_objects
expect(relation).to include(child2) expect(relation).to include(child2)
end end

View File

@ -20,7 +20,7 @@ describe Gitlab::ProjectAuthorizations do
end end
let(:authorizations) do let(:authorizations) do
klass = if Group.supports_nested_groups? klass = if Group.supports_nested_objects?
Gitlab::ProjectAuthorizations::WithNestedGroups Gitlab::ProjectAuthorizations::WithNestedGroups
else else
Gitlab::ProjectAuthorizations::WithoutNestedGroups Gitlab::ProjectAuthorizations::WithoutNestedGroups
@ -46,7 +46,7 @@ describe Gitlab::ProjectAuthorizations do
expect(mapping[group_project.id]).to eq(Gitlab::Access::DEVELOPER) expect(mapping[group_project.id]).to eq(Gitlab::Access::DEVELOPER)
end end
if Group.supports_nested_groups? if Group.supports_nested_objects?
context 'with nested groups' do context 'with nested groups' do
let!(:nested_group) { create(:group, parent: group) } let!(:nested_group) { create(:group, parent: group) }
let!(:nested_project) { create(:project, namespace: nested_group) } let!(:nested_project) { create(:project, namespace: nested_group) }

View File

@ -3675,7 +3675,7 @@ describe Project do
expect(project.badges.count).to eq 3 expect(project.badges.count).to eq 3
end end
if Group.supports_nested_groups? if Group.supports_nested_objects?
context 'with nested_groups' do context 'with nested_groups' do
let(:parent_group) { create(:group) } let(:parent_group) { create(:group) }

View File

@ -1966,7 +1966,7 @@ describe User do
subject { user.membership_groups } subject { user.membership_groups }
if Group.supports_nested_groups? if Group.supports_nested_objects?
it { is_expected.to contain_exactly parent_group, child_group } it { is_expected.to contain_exactly parent_group, child_group }
else else
it { is_expected.to contain_exactly parent_group } it { is_expected.to contain_exactly parent_group }
@ -2347,7 +2347,7 @@ describe User do
group.add_owner(user) group.add_owner(user)
end end
if Group.supports_nested_groups? if Group.supports_nested_objects?
it 'returns all groups' do it 'returns all groups' do
is_expected.to match_array [ is_expected.to match_array [
group, group,

View File

@ -147,7 +147,7 @@ describe GroupPolicy do
let(:current_user) { owner } let(:current_user) { owner }
it do it do
allow(Group).to receive(:supports_nested_groups?).and_return(true) allow(Group).to receive(:supports_nested_objects?).and_return(true)
expect_allowed(*guest_permissions) expect_allowed(*guest_permissions)
expect_allowed(*reporter_permissions) expect_allowed(*reporter_permissions)
@ -161,7 +161,7 @@ describe GroupPolicy do
let(:current_user) { admin } let(:current_user) { admin }
it do it do
allow(Group).to receive(:supports_nested_groups?).and_return(true) allow(Group).to receive(:supports_nested_objects?).and_return(true)
expect_allowed(*guest_permissions) expect_allowed(*guest_permissions)
expect_allowed(*reporter_permissions) expect_allowed(*reporter_permissions)
@ -173,7 +173,7 @@ describe GroupPolicy do
describe 'when nested group support feature is disabled' do describe 'when nested group support feature is disabled' do
before do before do
allow(Group).to receive(:supports_nested_groups?).and_return(false) allow(Group).to receive(:supports_nested_objects?).and_return(false)
end end
context 'admin' do context 'admin' do
@ -282,7 +282,7 @@ describe GroupPolicy do
let(:current_user) { owner } let(:current_user) { owner }
it do it do
allow(Group).to receive(:supports_nested_groups?).and_return(true) allow(Group).to receive(:supports_nested_objects?).and_return(true)
expect_allowed(*guest_permissions) expect_allowed(*guest_permissions)
expect_allowed(*reporter_permissions) expect_allowed(*reporter_permissions)

View File

@ -104,7 +104,7 @@ describe 'OpenID Connect requests' do
expect(json_response).to match(id_token_claims.merge(user_info_claims)) expect(json_response).to match(id_token_claims.merge(user_info_claims))
expected_groups = [group1.full_path, group3.full_path] expected_groups = [group1.full_path, group3.full_path]
expected_groups << group4.full_path if Group.supports_nested_groups? expected_groups << group4.full_path if Group.supports_nested_objects?
expect(json_response['groups']).to match_array(expected_groups) expect(json_response['groups']).to match_array(expected_groups)
end end

View File

@ -55,7 +55,7 @@ describe Groups::CreateService, '#execute' do
context 'when nested groups feature is disabled' do context 'when nested groups feature is disabled' do
it 'does not save group and returns an error' do it 'does not save group and returns an error' do
allow(Group).to receive(:supports_nested_groups?).and_return(false) allow(Group).to receive(:supports_nested_objects?).and_return(false)
is_expected.not_to be_persisted is_expected.not_to be_persisted
expect(subject.errors[:parent_id]).to include('You dont have permission to create a subgroup in this group.') expect(subject.errors[:parent_id]).to include('You dont have permission to create a subgroup in this group.')
@ -66,7 +66,7 @@ describe Groups::CreateService, '#execute' do
context 'when nested groups feature is enabled' do context 'when nested groups feature is enabled' do
before do before do
allow(Group).to receive(:supports_nested_groups?).and_return(true) allow(Group).to receive(:supports_nested_objects?).and_return(true)
end end
context 'as guest' do context 'as guest' do

View File

@ -30,7 +30,7 @@ describe Groups::NestedCreateService do
let(:params) { { group_path: 'a-group' } } let(:params) { { group_path: 'a-group' } }
before do before do
allow(Group).to receive(:supports_nested_groups?) { false } allow(Group).to receive(:supports_nested_objects?) { false }
end end
it 'creates the group' do it 'creates the group' do

View File

@ -9,7 +9,7 @@ describe Groups::TransferService, :postgresql do
shared_examples 'ensuring allowed transfer for a group' do shared_examples 'ensuring allowed transfer for a group' do
context 'with other database than PostgreSQL' do context 'with other database than PostgreSQL' do
before do before do
allow(Group).to receive(:supports_nested_groups?).and_return(false) allow(Group).to receive(:supports_nested_objects?).and_return(false)
end end
it 'should return false' do it 'should return false' do

View File

@ -2250,7 +2250,7 @@ describe NotificationService, :mailer do
# Creates a nested group only if supported # Creates a nested group only if supported
# to avoid errors on MySQL # to avoid errors on MySQL
def create_nested_group def create_nested_group
if Group.supports_nested_groups? if Group.supports_nested_objects?
parent_group = create(:group, :public) parent_group = create(:group, :public)
child_group = create(:group, :public, parent: parent_group) child_group = create(:group, :public, parent: parent_group)
@ -2277,7 +2277,7 @@ describe NotificationService, :mailer do
end end
def add_member_for_parent_group(user, project) def add_member_for_parent_group(user, project)
return unless Group.supports_nested_groups? return unless Group.supports_nested_objects?
project.reload project.reload
@ -2285,13 +2285,13 @@ describe NotificationService, :mailer do
end end
def should_email_nested_group_user(user, times: 1, recipients: email_recipients) def should_email_nested_group_user(user, times: 1, recipients: email_recipients)
return unless Group.supports_nested_groups? return unless Group.supports_nested_objects?
should_email(user, times: 1, recipients: email_recipients) should_email(user, times: 1, recipients: email_recipients)
end end
def should_not_email_nested_group_user(user, recipients: email_recipients) def should_not_email_nested_group_user(user, recipients: email_recipients)
return unless Group.supports_nested_groups? return unless Group.supports_nested_objects?
should_not_email(user, recipients: email_recipients) should_not_email(user, recipients: email_recipients)
end end

View File

@ -224,7 +224,7 @@ RSpec.configure do |config|
end end
config.around(:each, :nested_groups) do |example| config.around(:each, :nested_groups) do |example|
example.run if Group.supports_nested_groups? example.run if Group.supports_nested_objects?
end end
config.around(:each, :postgresql) do |example| config.around(:each, :postgresql) do |example|