diff options
Diffstat (limited to 'spec/models/preloaders/user_max_access_level_in_groups_preloader_spec.rb')
-rw-r--r-- | spec/models/preloaders/user_max_access_level_in_groups_preloader_spec.rb | 49 |
1 files changed, 32 insertions, 17 deletions
diff --git a/spec/models/preloaders/user_max_access_level_in_groups_preloader_spec.rb b/spec/models/preloaders/user_max_access_level_in_groups_preloader_spec.rb index 8144e1ad233..5fc7bfb1f62 100644 --- a/spec/models/preloaders/user_max_access_level_in_groups_preloader_spec.rb +++ b/spec/models/preloaders/user_max_access_level_in_groups_preloader_spec.rb @@ -13,32 +13,47 @@ RSpec.describe Preloaders::UserMaxAccessLevelInGroupsPreloader do shared_examples 'executes N max member permission queries to the DB' do it 'executes the specified max membership queries' do - queries = ActiveRecord::QueryRecorder.new do - groups.each { |group| user.can?(:read_group, group) } - end + expect { groups.each { |group| user.can?(:read_group, group) } }.to make_queries_matching(max_query_regex, expected_query_count) + end - max_queries = queries.log.grep(max_query_regex) + it 'caches the correct access_level for each group' do + groups.each do |group| + access_level_from_db = group.members_with_parents.where(user_id: user.id).group(:user_id).maximum(:access_level)[user.id] || Gitlab::Access::NO_ACCESS + cached_access_level = group.max_member_access_for_user(user) - expect(max_queries.count).to eq(expected_query_count) + expect(cached_access_level).to eq(access_level_from_db) + end end end context 'when the preloader is used', :request_store do - before do - described_class.new(groups, user).execute - end + context 'when user has indirect access to groups' do + let_it_be(:child_maintainer) { create(:group, :private, parent: group1).tap {|g| g.add_maintainer(user)} } + let_it_be(:child_indirect_access) { create(:group, :private, parent: group1) } - it_behaves_like 'executes N max member permission queries to the DB' do - # Will query all groups where the user is not already a member - let(:expected_query_count) { 1 } - end + let(:groups) { [group1, group2, group3, child_maintainer, child_indirect_access] } + + context 'when traversal_ids feature flag is disabled' do + it_behaves_like 'executes N max member permission queries to the DB' do + before do + stub_feature_flags(use_traversal_ids: false) + described_class.new(groups, user).execute + end + + # One query for group with no access and another one per group where the user is not a direct member + let(:expected_query_count) { 2 } + end + end - context 'when user has access but is not a direct member of the group' do - let(:groups) { [group1, group2, group3, create(:group, :private, parent: group1)] } + context 'when traversal_ids feature flag is enabled' do + it_behaves_like 'executes N max member permission queries to the DB' do + before do + stub_feature_flags(use_traversal_ids: true) + described_class.new(groups, user).execute + end - it_behaves_like 'executes N max member permission queries to the DB' do - # One query for group with no access and another one where the user is not a direct member - let(:expected_query_count) { 2 } + let(:expected_query_count) { 0 } + end end end end |