diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-07-19 17:16:28 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-07-19 17:16:28 +0300 |
commit | e4384360a16dd9a19d4d2d25d0ef1f2b862ed2a6 (patch) | |
tree | 2fcdfa7dcdb9db8f5208b2562f4b4e803d671243 /spec/finders | |
parent | ffda4e7bcac36987f936b4ba515995a6698698f0 (diff) |
Add latest changes from gitlab-org/gitlab@16-2-stable-eev16.2.0-rc42
Diffstat (limited to 'spec/finders')
-rw-r--r-- | spec/finders/award_emojis_finder_spec.rb | 4 | ||||
-rw-r--r-- | spec/finders/ci/group_variables_finder_spec.rb | 73 | ||||
-rw-r--r-- | spec/finders/ci/runners_finder_spec.rb | 4 | ||||
-rw-r--r-- | spec/finders/clusters/agent_tokens_finder_spec.rb | 5 | ||||
-rw-r--r-- | spec/finders/deployments_finder_spec.rb | 39 | ||||
-rw-r--r-- | spec/finders/group_descendants_finder_spec.rb | 8 | ||||
-rw-r--r-- | spec/finders/group_projects_finder_spec.rb | 10 | ||||
-rw-r--r-- | spec/finders/packages/ml_model/package_finder_spec.rb | 57 | ||||
-rw-r--r-- | spec/finders/packages/npm/package_finder_spec.rb | 67 | ||||
-rw-r--r-- | spec/finders/projects/ml/model_finder_spec.rb | 40 | ||||
-rw-r--r-- | spec/finders/projects_finder_spec.rb | 30 | ||||
-rw-r--r-- | spec/finders/users_finder_spec.rb | 13 |
12 files changed, 254 insertions, 96 deletions
diff --git a/spec/finders/award_emojis_finder_spec.rb b/spec/finders/award_emojis_finder_spec.rb index 7a75ad716d0..5c016d9e177 100644 --- a/spec/finders/award_emojis_finder_spec.rb +++ b/spec/finders/award_emojis_finder_spec.rb @@ -12,6 +12,10 @@ RSpec.describe AwardEmojisFinder do let_it_be(:issue_2_thumbsup) { create(:award_emoji, name: 'thumbsup', awardable: issue_2) } let_it_be(:issue_2_thumbsdown) { create(:award_emoji, name: 'thumbsdown', awardable: issue_2) } + before do + stub_feature_flags(custom_emoji: false) + end + describe 'param validation' do it 'raises an error if `name` is invalid' do expect { described_class.new(issue_1, { name: 'invalid' }).execute }.to raise_error( diff --git a/spec/finders/ci/group_variables_finder_spec.rb b/spec/finders/ci/group_variables_finder_spec.rb new file mode 100644 index 00000000000..9c5d83d7262 --- /dev/null +++ b/spec/finders/ci/group_variables_finder_spec.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Ci::GroupVariablesFinder, feature_category: :secrets_management do + subject(:finder) { described_class.new(project, sort_key).execute } + + let_it_be(:user) { create(:user) } + let_it_be(:group) { create(:group) } + let_it_be(:subgroup) { create(:group, parent: group) } + let_it_be(:project_with_subgroup) { create(:project, group: subgroup) } + let_it_be(:project_without_group) { create(:project) } + let_it_be(:variable1) { create(:ci_group_variable, group: group, key: 'GROUP_VAR_A', created_at: 1.day.ago) } + let_it_be(:variable2) { create(:ci_group_variable, group: subgroup, key: 'SUBGROUP_VAR_B') } + + let_it_be(:inherited_ci_variables) do + [variable1, variable2] + end + + let(:sort_key) { nil } + + context 'when project does not have a group' do + let_it_be(:project) { project_without_group } + + it 'returns an empty array' do + expect(finder.to_a).to match_array([]) + end + end + + context 'when project belongs to a group' do + let_it_be(:project) { project_with_subgroup } + + it 'returns variable from parent group and ancestors' do + expect(finder.to_a).to match_array([variable1, variable2]) + end + end + + describe 'sorting behaviour' do + let_it_be(:project) { project_with_subgroup } + + context 'with sort by created_at descending' do + let(:sort_key) { :created_desc } + + it 'returns variables ordered by created_at in descending order' do + expect(finder.to_a).to eq([variable2, variable1]) + end + end + + context 'with sort by created_at ascending' do + let(:sort_key) { :created_asc } + + it 'returns variables ordered by created_at in ascending order' do + expect(finder.to_a).to eq([variable1, variable2]) + end + end + + context 'with sort by key descending' do + let(:sort_key) { :key_desc } + + it 'returns variables ordered by key in descending order' do + expect(finder.to_a).to eq([variable2, variable1]) + end + end + + context 'with sort by key ascending' do + let(:sort_key) { :key_asc } + + it 'returns variables ordered by key in ascending order' do + expect(finder.to_a).to eq([variable1, variable2]) + end + end + end +end diff --git a/spec/finders/ci/runners_finder_spec.rb b/spec/finders/ci/runners_finder_spec.rb index 77260bb4c5c..e57ad5bc76d 100644 --- a/spec/finders/ci/runners_finder_spec.rb +++ b/spec/finders/ci/runners_finder_spec.rb @@ -302,7 +302,7 @@ RSpec.describe Ci::RunnersFinder, feature_category: :runner_fleet do end describe '#execute' do - subject { described_class.new(current_user: user, params: params).execute } + subject(:execute) { described_class.new(current_user: user, params: params).execute } shared_examples 'membership equal to :descendants' do it 'returns all descendant runners' do @@ -321,7 +321,7 @@ RSpec.describe Ci::RunnersFinder, feature_category: :runner_fleet do context 'with :group as target group' do let(:target_group) { group } - context 'passing no params' do + context 'passing no membership params' do it_behaves_like 'membership equal to :descendants' end diff --git a/spec/finders/clusters/agent_tokens_finder_spec.rb b/spec/finders/clusters/agent_tokens_finder_spec.rb index 1f5bfd58e85..16fdbc1b669 100644 --- a/spec/finders/clusters/agent_tokens_finder_spec.rb +++ b/spec/finders/clusters/agent_tokens_finder_spec.rb @@ -47,10 +47,7 @@ RSpec.describe Clusters::AgentTokensFinder do context 'when filtering by an unrecognised status' do subject(:execute) { described_class.new(agent, user, status: 'dummy').execute } - it 'raises an error' do - # 'dummy' is not a valid status as defined in the AgentToken status enum - expect { execute.count }.to raise_error(ActiveRecord::StatementInvalid) - end + it { is_expected.to be_empty } end context 'when user does not have permission' do diff --git a/spec/finders/deployments_finder_spec.rb b/spec/finders/deployments_finder_spec.rb index 517fa0e2c7a..65003ea97ef 100644 --- a/spec/finders/deployments_finder_spec.rb +++ b/spec/finders/deployments_finder_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe DeploymentsFinder do +RSpec.describe DeploymentsFinder, feature_category: :deployment_management do subject { described_class.new(params).execute } describe "validation" do @@ -166,8 +166,8 @@ RSpec.describe DeploymentsFinder do 'id' | 'desc' | [:deployment_3, :deployment_2, :deployment_1] 'iid' | 'asc' | [:deployment_1, :deployment_2, :deployment_3] 'iid' | 'desc' | [:deployment_3, :deployment_2, :deployment_1] - 'ref' | 'asc' | [:deployment_2, :deployment_1, :deployment_3] - 'ref' | 'desc' | [:deployment_3, :deployment_1, :deployment_2] + 'ref' | 'asc' | [:deployment_1, :deployment_2, :deployment_3] # ref acts like id because of remove_deployments_api_ref_sort feature flag + 'ref' | 'desc' | [:deployment_3, :deployment_2, :deployment_1] # ref acts like id because of remove_deployments_api_ref_sort feature flag 'updated_at' | 'asc' | [:deployment_2, :deployment_3, :deployment_1] 'updated_at' | 'desc' | [:deployment_1, :deployment_3, :deployment_2] 'finished_at' | 'asc' | described_class::InefficientQueryError @@ -185,6 +185,39 @@ RSpec.describe DeploymentsFinder do end end end + + context 'when remove_deployments_api_ref_sort is disabled' do + before do + stub_feature_flags(remove_deployments_api_ref_sort: false) + end + + where(:order_by, :sort, :ordered_deployments) do + 'created_at' | 'asc' | [:deployment_1, :deployment_2, :deployment_3] + 'created_at' | 'desc' | [:deployment_3, :deployment_2, :deployment_1] + 'id' | 'asc' | [:deployment_1, :deployment_2, :deployment_3] + 'id' | 'desc' | [:deployment_3, :deployment_2, :deployment_1] + 'iid' | 'asc' | [:deployment_1, :deployment_2, :deployment_3] + 'iid' | 'desc' | [:deployment_3, :deployment_2, :deployment_1] + 'ref' | 'asc' | [:deployment_2, :deployment_1, :deployment_3] # ref sorts when remove_deployments_api_ref_sort feature flag is disabled + 'ref' | 'desc' | [:deployment_3, :deployment_1, :deployment_2] # ref sorts when remove_deployments_api_ref_sort feature flag is disabled + 'updated_at' | 'asc' | [:deployment_2, :deployment_3, :deployment_1] + 'updated_at' | 'desc' | [:deployment_1, :deployment_3, :deployment_2] + 'finished_at' | 'asc' | described_class::InefficientQueryError + 'finished_at' | 'desc' | described_class::InefficientQueryError + 'invalid' | 'asc' | [:deployment_1, :deployment_2, :deployment_3] + 'iid' | 'err' | [:deployment_1, :deployment_2, :deployment_3] + end + + with_them do + it 'returns the deployments ordered' do + if ordered_deployments == described_class::InefficientQueryError + expect { subject }.to raise_error(described_class::InefficientQueryError) + else + expect(subject).to eq(ordered_deployments.map { |name| public_send(name) }) + end + end + end + end end describe 'transform `created_at` sorting to `id` sorting' do diff --git a/spec/finders/group_descendants_finder_spec.rb b/spec/finders/group_descendants_finder_spec.rb index 9d528355f54..14cbb6a427c 100644 --- a/spec/finders/group_descendants_finder_spec.rb +++ b/spec/finders/group_descendants_finder_spec.rb @@ -276,14 +276,6 @@ RSpec.describe GroupDescendantsFinder do end it_behaves_like 'filter examples' - - context 'when feature flag :linear_group_descendants_finder_upto is disabled' do - before do - stub_feature_flags(linear_group_descendants_finder_upto: false) - end - - it_behaves_like 'filter examples' - end end end end diff --git a/spec/finders/group_projects_finder_spec.rb b/spec/finders/group_projects_finder_spec.rb index 4189be94cc1..87e579dbeec 100644 --- a/spec/finders/group_projects_finder_spec.rb +++ b/spec/finders/group_projects_finder_spec.rb @@ -87,6 +87,16 @@ RSpec.describe GroupProjectsFinder do end end + context "owned" do + before do + root_group.add_owner(current_user) + end + + let(:params) { { owned: true } } + + it { is_expected.to match_array([private_project, public_project]) } + end + context "all" do context 'with subgroups projects' do before do diff --git a/spec/finders/packages/ml_model/package_finder_spec.rb b/spec/finders/packages/ml_model/package_finder_spec.rb new file mode 100644 index 00000000000..535360d13c5 --- /dev/null +++ b/spec/finders/packages/ml_model/package_finder_spec.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe ::Packages::MlModel::PackageFinder, feature_category: :mlops do + let_it_be(:project) { create(:project) } + let_it_be(:package) { create(:ml_model_package, project: project) } + + let(:package_name) { package.name } + let(:package_version) { package.version } + + describe '#execute!' do + subject(:find_package) { described_class.new(project).execute!(package_name, package_version) } + + it 'finds package by name and version' do + expect(find_package).to eq(package) + end + + it 'ignores packages with same name but different version' do + create(:ml_model_package, project: project, name: package.name, version: '3.1.4') + + expect(find_package).to eq(package) + end + + context 'when package name+version does not exist' do + let(:package_name) { 'a_package_that_does_not_exist' } + + it 'raises ActiveRecord::RecordNotFound' do + expect { find_package }.to raise_error(ActiveRecord::RecordNotFound) + end + end + + context 'when package exists but is marked for destruction' do + let_it_be(:invalid_package) do + create(:ml_model_package, project: project, status: :pending_destruction) + end + + let(:package_name) { invalid_package.name } + let(:package_version) { invalid_package.version } + + it 'raises ActiveRecord::RecordNotFound' do + expect { find_package }.to raise_error(ActiveRecord::RecordNotFound) + end + end + + context 'when package name+version does not exist but it is not ml_model' do + let_it_be(:another_package) { create(:generic_package, project: project) } + + let(:package_name) { another_package.name } + let(:package_version) { another_package.version } + + it 'raises ActiveRecord::RecordNotFound' do + expect { find_package }.to raise_error(ActiveRecord::RecordNotFound) + end + end + end +end diff --git a/spec/finders/packages/npm/package_finder_spec.rb b/spec/finders/packages/npm/package_finder_spec.rb index e11b33f71e9..45cc2a07027 100644 --- a/spec/finders/packages/npm/package_finder_spec.rb +++ b/spec/finders/packages/npm/package_finder_spec.rb @@ -7,7 +7,6 @@ RSpec.describe ::Packages::Npm::PackageFinder do let(:project) { package.project } let(:package_name) { package.name } - let(:last_of_each_version) { true } shared_examples 'accepting a namespace for' do |example_name| before do @@ -59,35 +58,11 @@ RSpec.describe ::Packages::Npm::PackageFinder do end end - shared_examples 'handling last_of_each_version' do - include_context 'last_of_each_version setup context' - - context 'disabled' do - let(:last_of_each_version) { false } - - it { is_expected.to contain_exactly(package1, package2) } - end - - context 'enabled' do - it { is_expected.to contain_exactly(package2) } - end - - context 'with npm_allow_packages_in_multiple_projects disabled' do - before do - stub_feature_flags(npm_allow_packages_in_multiple_projects: false) - end - - it { is_expected.to contain_exactly(package2) } - end - end - context 'with a project' do - let(:finder) { described_class.new(package_name, project: project, last_of_each_version: last_of_each_version) } + let(:finder) { described_class.new(package_name, project: project) } it_behaves_like 'finding packages by name' - it_behaves_like 'handling last_of_each_version' - context 'set to nil' do let(:project) { nil } @@ -96,12 +71,10 @@ RSpec.describe ::Packages::Npm::PackageFinder do end context 'with a namespace' do - let(:finder) { described_class.new(package_name, namespace: namespace, last_of_each_version: last_of_each_version) } + let(:finder) { described_class.new(package_name, namespace: namespace) } it_behaves_like 'accepting a namespace for', 'finding packages by name' - it_behaves_like 'accepting a namespace for', 'handling last_of_each_version' - context 'set to nil' do let_it_be(:namespace) { nil } @@ -125,28 +98,16 @@ RSpec.describe ::Packages::Npm::PackageFinder do end end - shared_examples 'handling last_of_each_version' do - include_context 'last_of_each_version setup context' - - context 'enabled' do - it { is_expected.to eq(package2) } - end - end - context 'with a project' do - let(:finder) { described_class.new(package_name, project: project, last_of_each_version: last_of_each_version) } + let(:finder) { described_class.new(package_name, project: project) } it_behaves_like 'finding packages by version' - - it_behaves_like 'handling last_of_each_version' end context 'with a namespace' do - let(:finder) { described_class.new(package_name, namespace: namespace, last_of_each_version: last_of_each_version) } + let(:finder) { described_class.new(package_name, namespace: namespace) } it_behaves_like 'accepting a namespace for', 'finding packages by version' - - it_behaves_like 'accepting a namespace for', 'handling last_of_each_version' end end @@ -157,26 +118,10 @@ RSpec.describe ::Packages::Npm::PackageFinder do it { is_expected.to eq(package) } end - shared_examples 'handling last_of_each_version' do - include_context 'last_of_each_version setup context' - - context 'disabled' do - let(:last_of_each_version) { false } - - it { is_expected.to eq(package2) } - end - - context 'enabled' do - it { is_expected.to eq(package2) } - end - end - context 'with a project' do - let(:finder) { described_class.new(package_name, project: project, last_of_each_version: last_of_each_version) } + let(:finder) { described_class.new(package_name, project: project) } it_behaves_like 'finding package by last' - - it_behaves_like 'handling last_of_each_version' end context 'with a namespace' do @@ -184,8 +129,6 @@ RSpec.describe ::Packages::Npm::PackageFinder do it_behaves_like 'accepting a namespace for', 'finding package by last' - it_behaves_like 'accepting a namespace for', 'handling last_of_each_version' - context 'with duplicate packages' do let_it_be(:namespace) { create(:group) } let_it_be(:subgroup1) { create(:group, parent: namespace) } diff --git a/spec/finders/projects/ml/model_finder_spec.rb b/spec/finders/projects/ml/model_finder_spec.rb new file mode 100644 index 00000000000..386d690a8d2 --- /dev/null +++ b/spec/finders/projects/ml/model_finder_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Projects::Ml::ModelFinder, feature_category: :mlops do + let_it_be(:model1_a) { create(:ml_model_package) } + let_it_be(:project) { model1_a.project } + let_it_be(:model1_b) do + create(:ml_model_package, name: model1_a.name, project: project) + end + + let_it_be(:model2) do + create(:ml_model_package, status: :pending_destruction, project: project) + end + + let_it_be(:model3) { create(:ml_model_package) } + let_it_be(:model4) { create(:generic_package, project: project) } + + subject { described_class.new(project).execute.to_a } + + it 'returns the most recent version of a model' do + is_expected.to include(model1_b) + end + + it 'does not return older versions of a model' do + is_expected.not_to include(model1_a) + end + + it 'does not return models pending destruction' do + is_expected.not_to include(model2) + end + + it 'does not return models belonging to a different project' do + is_expected.not_to include(model3) + end + + it 'does not return packages that are not ml_model' do + is_expected.not_to include(model4) + end +end diff --git a/spec/finders/projects_finder_spec.rb b/spec/finders/projects_finder_spec.rb index 3d108951c64..a795df4dec6 100644 --- a/spec/finders/projects_finder_spec.rb +++ b/spec/finders/projects_finder_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ProjectsFinder do +RSpec.describe ProjectsFinder, feature_category: :groups_and_projects do include AdminModeHelper describe '#execute' do @@ -25,6 +25,12 @@ RSpec.describe ProjectsFinder do create(:project, :private, name: 'D', path: 'D') end + let_it_be(:banned_user_project) do + create(:project, :public, name: 'Project created by a banned user', creator: create(:user, :banned)).tap do |p| + create(:project_authorization, :owner, user: p.creator, project: p) + end + end + let(:params) { {} } let(:current_user) { user } let(:project_ids_relation) { nil } @@ -488,16 +494,32 @@ RSpec.describe ProjectsFinder do describe 'with admin user' do let(:user) { create(:admin) } - context 'admin mode enabled' do + context 'with admin mode enabled' do before do enable_admin_mode!(current_user) end - it { is_expected.to match_array([public_project, internal_project, private_project, shared_project]) } + it do + is_expected.to match_array([ + public_project, + internal_project, + private_project, + shared_project, + banned_user_project + ]) + end end - context 'admin mode disabled' do + context 'with admin mode disabled' do it { is_expected.to match_array([public_project, internal_project]) } + + context 'when hide_projects_of_banned_users FF is disabled' do + before do + stub_feature_flags(hide_projects_of_banned_users: false) + end + + it { is_expected.to match_array([public_project, internal_project, banned_user_project]) } + end end end end diff --git a/spec/finders/users_finder_spec.rb b/spec/finders/users_finder_spec.rb index e0a9237a79b..c931de92d1c 100644 --- a/spec/finders/users_finder_spec.rb +++ b/spec/finders/users_finder_spec.rb @@ -70,19 +70,6 @@ RSpec.describe UsersFinder do expect(users).to be_empty end - - context 'when autocomplete_users_use_search_service feature flag is disabled' do - before do - stub_feature_flags(autocomplete_users_use_search_service: false) - end - - it 'does not pass use_minimum_char_limit from params' do - search_term = normal_user.username[..1] - expect(User).to receive(:search).with(search_term, with_private_emails: anything).once.and_call_original - - described_class.new(user, { search: search_term, use_minimum_char_limit: false }).execute - end - end end it 'filters by external users' do |