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.rb135
1 files changed, 112 insertions, 23 deletions
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index b6c7d61a291..45a2c134077 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -385,23 +385,25 @@ RSpec.describe Group do
end
end
- before do
- subject
- reload_models(old_parent, new_parent, group)
- end
-
context 'within the same hierarchy' do
let!(:root) { create(:group).reload }
let!(:old_parent) { create(:group, parent: root) }
let!(:new_parent) { create(:group, parent: root) }
- it 'updates traversal_ids' do
- expect(group.traversal_ids).to eq [root.id, new_parent.id, group.id]
- end
+ context 'with FOR NO KEY UPDATE lock' do
+ before do
+ subject
+ reload_models(old_parent, new_parent, group)
+ end
- it_behaves_like 'hierarchy with traversal_ids'
- it_behaves_like 'locked row' do
- let(:row) { root }
+ it 'updates traversal_ids' do
+ expect(group.traversal_ids).to eq [root.id, new_parent.id, group.id]
+ end
+
+ it_behaves_like 'hierarchy with traversal_ids'
+ it_behaves_like 'locked row' do
+ let(:row) { root }
+ end
end
end
@@ -410,6 +412,11 @@ RSpec.describe Group do
let!(:new_parent) { create(:group) }
let!(:group) { create(:group, parent: old_parent) }
+ before do
+ subject
+ reload_models(old_parent, new_parent, group)
+ end
+
it 'updates traversal_ids' do
expect(group.traversal_ids).to eq [new_parent.id, group.id]
end
@@ -435,6 +442,11 @@ RSpec.describe Group do
let!(:old_parent) { nil }
let!(:new_parent) { create(:group) }
+ before do
+ subject
+ reload_models(old_parent, new_parent, group)
+ end
+
it 'updates traversal_ids' do
expect(group.traversal_ids).to eq [new_parent.id, group.id]
end
@@ -452,6 +464,11 @@ RSpec.describe Group do
let!(:old_parent) { create(:group) }
let!(:new_parent) { nil }
+ before do
+ subject
+ reload_models(old_parent, new_parent, group)
+ end
+
it 'updates traversal_ids' do
expect(group.traversal_ids).to eq [group.id]
end
@@ -1327,10 +1344,14 @@ RSpec.describe Group do
let!(:group) { create(:group, :nested) }
let!(:maintainer) { group.parent.add_user(create(:user), GroupMember::MAINTAINER) }
let!(:developer) { group.add_user(create(:user), GroupMember::DEVELOPER) }
+ let!(:pending_maintainer) { create(:group_member, :awaiting, :maintainer, group: group.parent) }
+ let!(:pending_developer) { create(:group_member, :awaiting, :developer, group: group) }
- it 'returns parents members' do
+ it 'returns parents active members' do
expect(group.members_with_parents).to include(developer)
expect(group.members_with_parents).to include(maintainer)
+ expect(group.members_with_parents).not_to include(pending_developer)
+ expect(group.members_with_parents).not_to include(pending_maintainer)
end
context 'group sharing' do
@@ -1340,9 +1361,11 @@ RSpec.describe Group do
create(:group_group_link, shared_group: shared_group, shared_with_group: group)
end
- it 'returns shared with group members' do
+ it 'returns shared with group active members' do
expect(shared_group.members_with_parents).to(
include(developer))
+ expect(shared_group.members_with_parents).not_to(
+ include(pending_developer))
end
end
end
@@ -2168,7 +2191,7 @@ RSpec.describe Group do
let(:group) { create(:group) }
- subject { group.first_auto_devops_config }
+ subject(:fetch_config) { group.first_auto_devops_config }
where(:instance_value, :group_value, :config) do
# Instance level enabled
@@ -2193,6 +2216,8 @@ RSpec.describe Group do
end
context 'with parent groups' do
+ let(:parent) { create(:group) }
+
where(:instance_value, :parent_value, :group_value, :config) do
# Instance level enabled
true | nil | nil | { status: true, scope: :instance }
@@ -2222,17 +2247,82 @@ RSpec.describe Group do
end
with_them do
+ def define_cache_expectations(cache_key)
+ if group_value.nil?
+ expect(Rails.cache).to receive(:fetch).with(start_with(cache_key), expires_in: 1.day)
+ else
+ expect(Rails.cache).not_to receive(:fetch).with(start_with(cache_key), expires_in: 1.day)
+ end
+ end
+
before do
stub_application_setting(auto_devops_enabled: instance_value)
- parent = create(:group, auto_devops_enabled: parent_value)
group.update!(
auto_devops_enabled: group_value,
parent: parent
)
+ parent.update!(auto_devops_enabled: parent_value)
+
+ group.reload # Reload so we get the populated traversal IDs
end
it { is_expected.to eq(config) }
+
+ it 'caches the parent config when group auto_devops_enabled is nil' do
+ cache_key = "namespaces:{#{group.traversal_ids.first}}:first_auto_devops_config:#{group.id}"
+ define_cache_expectations(cache_key)
+
+ fetch_config
+ end
+
+ context 'when traversal ID feature flags are disabled' do
+ before do
+ stub_feature_flags(sync_traversal_ids: false)
+ end
+
+ it 'caches the parent config when group auto_devops_enabled is nil' do
+ cache_key = "namespaces:{first_auto_devops_config}:#{group.id}"
+ define_cache_expectations(cache_key)
+
+ fetch_config
+ end
+ end
+ end
+
+ context 'cache expiration' do
+ before do
+ group.update!(parent: parent)
+
+ reload_models(parent)
+ end
+
+ it 'clears both self and descendant cache when the parent value is updated' do
+ expect(Rails.cache).to receive(:delete_multi)
+ .with(
+ match_array([
+ start_with("namespaces:{#{parent.traversal_ids.first}}:first_auto_devops_config:#{parent.id}"),
+ start_with("namespaces:{#{parent.traversal_ids.first}}:first_auto_devops_config:#{group.id}")
+ ])
+ )
+
+ parent.update!(auto_devops_enabled: true)
+ end
+
+ it 'only clears self cache when there are no dependents' do
+ expect(Rails.cache).to receive(:delete_multi)
+ .with([start_with("namespaces:{#{group.traversal_ids.first}}:first_auto_devops_config:#{group.id}")])
+
+ group.update!(auto_devops_enabled: true)
+ end
+
+ it 'does not clear cache when the feature is disabled' do
+ stub_feature_flags(namespaces_cache_first_auto_devops_config: false)
+
+ expect(Rails.cache).not_to receive(:delete_multi)
+
+ parent.update!(auto_devops_enabled: true)
+ end
end
end
end
@@ -2860,7 +2950,14 @@ RSpec.describe Group do
expect(group.crm_enabled?).to be_truthy
end
+
+ it 'returns true where crm_settings.state is enabled for subgroup' do
+ subgroup = create(:group, :crm_enabled, parent: group)
+
+ expect(subgroup.crm_enabled?).to be_truthy
+ end
end
+
describe '.get_ids_by_ids_or_paths' do
let(:group_path) { 'group_path' }
let!(:group) { create(:group, path: group_path) }
@@ -3149,12 +3246,4 @@ RSpec.describe Group do
it_behaves_like 'no effective expiration interval'
end
end
-
- describe '#runners_token' do
- let_it_be(:group) { create(:group) }
-
- subject { group }
-
- it_behaves_like 'it has a prefixable runners_token'
- end
end