diff options
Diffstat (limited to 'spec/finders')
27 files changed, 574 insertions, 169 deletions
diff --git a/spec/finders/bulk_imports/entities_finder_spec.rb b/spec/finders/bulk_imports/entities_finder_spec.rb index 54c792cb4d8..9e8d04400eb 100644 --- a/spec/finders/bulk_imports/entities_finder_spec.rb +++ b/spec/finders/bulk_imports/entities_finder_spec.rb @@ -88,10 +88,11 @@ RSpec.describe BulkImports::EntitiesFinder do let(:order) { :asc } it 'returns entities sorted ascending' do - expect(subject.execute).to eq([ - started_entity_1, finished_entity_1, failed_entity_1, - started_entity_2, finished_entity_2, failed_entity_2 - ]) + expect(subject.execute).to eq( + [ + started_entity_1, finished_entity_1, failed_entity_1, + started_entity_2, finished_entity_2, failed_entity_2 + ]) end end @@ -99,10 +100,11 @@ RSpec.describe BulkImports::EntitiesFinder do let(:order) { :desc } it 'returns entities sorted descending' do - expect(subject.execute).to eq([ - failed_entity_2, finished_entity_2, started_entity_2, - failed_entity_1, finished_entity_1, started_entity_1 - ]) + expect(subject.execute).to eq( + [ + failed_entity_2, finished_entity_2, started_entity_2, + failed_entity_1, finished_entity_1, started_entity_1 + ]) end end end diff --git a/spec/finders/ci/daily_build_group_report_results_finder_spec.rb b/spec/finders/ci/daily_build_group_report_results_finder_spec.rb index 5352cfe5238..add941089b0 100644 --- a/spec/finders/ci/daily_build_group_report_results_finder_spec.rb +++ b/spec/finders/ci/daily_build_group_report_results_finder_spec.rb @@ -50,12 +50,13 @@ RSpec.describe Ci::DailyBuildGroupReportResultsFinder do let(:current_user) { user_with_permission } it 'returns matching coverages within the given date range' do - expect(coverages).to match_array([ - karma_coverage_2, - rspec_coverage_2, - karma_coverage_1, - rspec_coverage_1 - ]) + expect(coverages).to match_array( + [ + karma_coverage_2, + rspec_coverage_2, + karma_coverage_1, + rspec_coverage_1 + ]) end context 'when ref_path is nil' do @@ -73,10 +74,11 @@ RSpec.describe Ci::DailyBuildGroupReportResultsFinder do let(:limit) { 2 } it 'returns limited number of matching coverages within the given date range' do - expect(coverages).to match_array([ - karma_coverage_2, - rspec_coverage_2 - ]) + expect(coverages).to match_array( + [ + karma_coverage_2, + rspec_coverage_2 + ]) end end diff --git a/spec/finders/ci/jobs_finder_spec.rb b/spec/finders/ci/jobs_finder_spec.rb index 45e8cf5a582..dd3ba9721e4 100644 --- a/spec/finders/ci/jobs_finder_spec.rb +++ b/spec/finders/ci/jobs_finder_spec.rb @@ -56,7 +56,7 @@ RSpec.describe Ci::JobsFinder, '#execute' do context 'scope is an array' do let(:jobs) { [pending_job, running_job, successful_job, canceled_job] } - let(:params) {{ scope: %w'running success' }} + let(:params) { { scope: %w'running success' } } it 'filters by the job statuses in the scope' do expect(subject).to contain_exactly(running_job, successful_job) diff --git a/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb b/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb index a7cf041f553..6e218db1254 100644 --- a/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb +++ b/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb @@ -126,7 +126,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do let!(:pipeline) do create(:ci_empty_pipeline, project: project, - sha: merge_request.diff_head_sha, ref: merge_request.source_branch) + sha: merge_request.diff_head_sha, ref: merge_request.source_branch) end it 'returns pipelines from diff_head_sha' do @@ -140,7 +140,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do let!(:branch_pipeline) do create(:ci_pipeline, source: :push, project: project, - ref: source_ref, sha: merge_request.merge_request_diff.head_commit_sha) + ref: source_ref, sha: merge_request.merge_request_diff.head_commit_sha) end let!(:tag_pipeline) do @@ -149,12 +149,12 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do let!(:detached_merge_request_pipeline) do create(:ci_pipeline, source: :merge_request_event, project: project, - ref: source_ref, sha: shas.second, merge_request: merge_request) + ref: source_ref, sha: shas.second, merge_request: merge_request) end let(:merge_request) do create(:merge_request, source_project: project, source_branch: source_ref, - target_project: project, target_branch: target_ref) + target_project: project, target_branch: target_ref) end let(:project) { create(:project, :repository) } @@ -167,12 +167,12 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do context 'when there are a branch pipeline and a merge request pipeline' do let!(:branch_pipeline_2) do create(:ci_pipeline, source: :push, project: project, - ref: source_ref, sha: shas.first) + ref: source_ref, sha: shas.first) end let!(:detached_merge_request_pipeline_2) do create(:ci_pipeline, source: :merge_request_event, project: project, - ref: source_ref, sha: shas.first, merge_request: merge_request) + ref: source_ref, sha: shas.first, merge_request: merge_request) end it 'returns merge request pipelines first' do @@ -184,7 +184,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do context 'when there are multiple merge request pipelines from the same branch' do let!(:branch_pipeline_2) do create(:ci_pipeline, source: :push, project: project, - ref: source_ref, sha: shas.first) + ref: source_ref, sha: shas.first) end let!(:branch_pipeline_with_sha_not_belonging_to_merge_request) do @@ -193,12 +193,12 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do let!(:detached_merge_request_pipeline_2) do create(:ci_pipeline, source: :merge_request_event, project: project, - ref: source_ref, sha: shas.first, merge_request: merge_request_2) + ref: source_ref, sha: shas.first, merge_request: merge_request_2) end let(:merge_request_2) do create(:merge_request, source_project: project, source_branch: source_ref, - target_project: project, target_branch: 'stable') + target_project: project, target_branch: 'stable') end before do @@ -220,7 +220,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do context 'when detached merge request pipeline is run on head ref of the merge request' do let!(:detached_merge_request_pipeline) do create(:ci_pipeline, source: :merge_request_event, project: project, - ref: merge_request.ref_path, sha: shas.second, merge_request: merge_request) + ref: merge_request.ref_path, sha: shas.second, merge_request: merge_request) end it 'sets the head ref of the merge request to the pipeline ref' do diff --git a/spec/finders/ci/runners_finder_spec.rb b/spec/finders/ci/runners_finder_spec.rb index 96412c1e371..8d3c375385a 100644 --- a/spec/finders/ci/runners_finder_spec.rb +++ b/spec/finders/ci/runners_finder_spec.rb @@ -260,13 +260,13 @@ RSpec.describe Ci::RunnersFinder do let_it_be(:runner_sub_group_2) { create(:ci_runner, :group, contacted_at: 10.minutes.ago) } let_it_be(:runner_sub_group_3) { create(:ci_runner, :group, contacted_at: 9.minutes.ago) } let_it_be(:runner_sub_group_4) { create(:ci_runner, :group, contacted_at: 8.minutes.ago) } - let_it_be(:runner_project_1) { create(:ci_runner, :project, contacted_at: 7.minutes.ago, projects: [project])} - let_it_be(:runner_project_2) { create(:ci_runner, :project, contacted_at: 6.minutes.ago, projects: [project_2])} - let_it_be(:runner_project_3) { create(:ci_runner, :project, contacted_at: 5.minutes.ago, description: 'runner_project_search', projects: [project, project_2])} - let_it_be(:runner_project_4) { create(:ci_runner, :project, contacted_at: 4.minutes.ago, projects: [project_3])} - let_it_be(:runner_project_5) { create(:ci_runner, :project, contacted_at: 3.minutes.ago, tag_list: %w[runner_tag], projects: [project_4])} - let_it_be(:runner_project_6) { create(:ci_runner, :project, contacted_at: 2.minutes.ago, projects: [project_5])} - let_it_be(:runner_project_7) { create(:ci_runner, :project, contacted_at: 1.minute.ago, projects: [project_6])} + let_it_be(:runner_project_1) { create(:ci_runner, :project, contacted_at: 7.minutes.ago, projects: [project]) } + let_it_be(:runner_project_2) { create(:ci_runner, :project, contacted_at: 6.minutes.ago, projects: [project_2]) } + let_it_be(:runner_project_3) { create(:ci_runner, :project, contacted_at: 5.minutes.ago, description: 'runner_project_search', projects: [project, project_2]) } + let_it_be(:runner_project_4) { create(:ci_runner, :project, contacted_at: 4.minutes.ago, projects: [project_3]) } + let_it_be(:runner_project_5) { create(:ci_runner, :project, contacted_at: 3.minutes.ago, tag_list: %w[runner_tag], projects: [project_4]) } + let_it_be(:runner_project_6) { create(:ci_runner, :project, contacted_at: 2.minutes.ago, projects: [project_5]) } + let_it_be(:runner_project_7) { create(:ci_runner, :project, contacted_at: 1.minute.ago, projects: [project_6]) } let(:target_group) { nil } let(:membership) { nil } diff --git a/spec/finders/concerns/packages/finder_helper_spec.rb b/spec/finders/concerns/packages/finder_helper_spec.rb index e8648d131ff..94bcec6163e 100644 --- a/spec/finders/concerns/packages/finder_helper_spec.rb +++ b/spec/finders/concerns/packages/finder_helper_spec.rb @@ -24,7 +24,7 @@ RSpec.describe ::Packages::FinderHelper do subject { finder.execute(project1) } - it { is_expected.to eq [package1]} + it { is_expected.to eq [package1] } end describe '#packages_visible_to_user' do @@ -61,7 +61,7 @@ RSpec.describe ::Packages::FinderHelper do end shared_examples 'returning package1' do - it { is_expected.to eq [package1]} + it { is_expected.to eq [package1] } end shared_examples 'returning no packages' do @@ -165,7 +165,7 @@ RSpec.describe ::Packages::FinderHelper do end shared_examples 'returning project1' do - it { is_expected.to eq [project1]} + it { is_expected.to eq [project1] } end shared_examples 'returning no project' do diff --git a/spec/finders/container_repositories_finder_spec.rb b/spec/finders/container_repositories_finder_spec.rb index 5d449d1b811..472c39d1f23 100644 --- a/spec/finders/container_repositories_finder_spec.rb +++ b/spec/finders/container_repositories_finder_spec.rb @@ -28,9 +28,9 @@ RSpec.describe ContainerRepositoriesFinder do context "with name set to #{name}" do let(:params) { { name: name } } - it { is_expected.to contain_exactly(project_repository)} + it { is_expected.to contain_exactly(project_repository) } - it { is_expected.not_to include(not_searched_repository)} + it { is_expected.not_to include(not_searched_repository) } end end end @@ -50,7 +50,7 @@ RSpec.describe ContainerRepositoriesFinder do context "with sort set to #{order}" do let(:params) { { sort: order } } - it { is_expected.to eq([sort_repository2, sort_repository])} + it { is_expected.to eq([sort_repository2, sort_repository]) } end end @@ -58,7 +58,7 @@ RSpec.describe ContainerRepositoriesFinder do context "with sort set to #{order}" do let(:params) { { sort: order } } - it { is_expected.to eq([sort_repository, sort_repository2])} + it { is_expected.to eq([sort_repository, sort_repository2]) } end end end diff --git a/spec/finders/context_commits_finder_spec.rb b/spec/finders/context_commits_finder_spec.rb index 95c685aea24..c22675bc67d 100644 --- a/spec/finders/context_commits_finder_spec.rb +++ b/spec/finders/context_commits_finder_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe ContextCommitsFinder do describe "#execute" do let(:project) { create(:project, :repository) } - let(:merge_request) { create(:merge_request) } + let(:merge_request) { create(:merge_request, source_branch: 'feature', target_branch: 'master') } let(:commit) { create(:commit, id: '6d394385cf567f80a8fd85055db1ab4c5295806f') } it 'filters commits by valid sha/commit message' do @@ -24,5 +24,29 @@ RSpec.describe ContextCommitsFinder do expect(commits).to be_empty end + + it 'returns commits based in author filter' do + params = { search: 'test text', author: 'Job van der Voort' } + commits = described_class.new(project, merge_request, params).execute + + expect(commits.length).to eq(1) + expect(commits[0].id).to eq('b83d6e391c22777fca1ed3012fce84f633d7fed0') + end + + it 'returns commits based in before filter' do + params = { search: 'test text', committed_before: 1474828200 } + commits = described_class.new(project, merge_request, params).execute + + expect(commits.length).to eq(1) + expect(commits[0].id).to eq('498214de67004b1da3d820901307bed2a68a8ef6') + end + + it 'returns commits based in after filter' do + params = { search: 'test text', committed_after: 1474828200 } + commits = described_class.new(project, merge_request, params).execute + + expect(commits.length).to eq(1) + expect(commits[0].id).to eq('b83d6e391c22777fca1ed3012fce84f633d7fed0') + end end end diff --git a/spec/finders/crm/organizations_finder_spec.rb b/spec/finders/crm/organizations_finder_spec.rb index f227fcd3748..c89ac3b1cb5 100644 --- a/spec/finders/crm/organizations_finder_spec.rb +++ b/spec/finders/crm/organizations_finder_spec.rb @@ -128,5 +128,76 @@ RSpec.describe Crm::OrganizationsFinder do end end end + + context 'when sorting' do + let_it_be(:group) { create(:group, :crm_enabled) } + + let_it_be(:sort_test_a) do + create( + :organization, + group: group, + name: "ABC", + description: "1" + ) + end + + let_it_be(:sort_test_b) do + create( + :organization, + group: group, + name: "DEF", + description: "2", + default_rate: 10 + ) + end + + let_it_be(:sort_test_c) do + create( + :organization, + group: group, + name: "GHI", + default_rate: 20 + ) + end + + before do + group.add_developer(user) + end + + it 'returns the organiztions sorted by name in ascending order' do + finder = described_class.new(user, group: group, sort: { field: 'name', direction: :asc }) + + expect(finder.execute).to eq([sort_test_a, sort_test_b, sort_test_c]) + end + + it 'returns the organizations sorted by description in descending order' do + finder = described_class.new(user, group: group, sort: { field: 'description', direction: :desc }) + + expect(finder.execute).to eq([sort_test_b, sort_test_a, sort_test_c]) + end + + it 'returns the contacts sorted by default_rate in ascending order' do + finder = described_class.new(user, group: group, sort: { field: 'default_rate', direction: :asc }) + + expect(finder.execute).to eq([sort_test_b, sort_test_c, sort_test_a]) + end + end + end + + describe '.counts_by_state' do + let_it_be(:group) { create(:group, :crm_enabled) } + let_it_be(:active_organizations) { create_list(:organization, 3, group: group, state: :active) } + let_it_be(:inactive_organizations) { create_list(:organization, 2, group: group, state: :inactive) } + + before do + group.add_developer(user) + end + + it 'returns correct counts' do + counts = described_class.counts_by_state(user, group: group) + + expect(counts["active"]).to eq(3) + expect(counts["inactive"]).to eq(2) + end end end diff --git a/spec/finders/database/batched_background_migrations_finder_spec.rb b/spec/finders/database/batched_background_migrations_finder_spec.rb new file mode 100644 index 00000000000..bd88be72fa5 --- /dev/null +++ b/spec/finders/database/batched_background_migrations_finder_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Database::BatchedBackgroundMigrationsFinder do + let!(:migration_1) { create(:batched_background_migration, created_at: Time.now - 2) } + let!(:migration_2) { create(:batched_background_migration, created_at: Time.now - 1) } + let!(:migration_3) { create(:batched_background_migration, created_at: Time.now - 3) } + + let(:finder) { described_class.new(connection: connection) } + + describe '#execute' do + let(:connection) { ApplicationRecord.connection } + + subject { finder.execute } + + it 'returns migrations order by created_at (DESC)' do + is_expected.to eq([migration_2, migration_1, migration_3]) + end + + it 'limits the number of returned migrations' do + stub_const('Database::BatchedBackgroundMigrationsFinder::RETURNED_MIGRATIONS', 2) + + is_expected.to eq([migration_2, migration_1]) + end + end +end diff --git a/spec/finders/deploy_tokens/tokens_finder_spec.rb b/spec/finders/deploy_tokens/tokens_finder_spec.rb index 7f19c5bf11b..4c72a2ced7c 100644 --- a/spec/finders/deploy_tokens/tokens_finder_spec.rb +++ b/spec/finders/deploy_tokens/tokens_finder_spec.rb @@ -30,24 +30,26 @@ RSpec.describe DeployTokens::TokensFinder do it 'returns all deploy tokens' do expect(subject.size).to eq(6) - is_expected.to match_array([ - project_deploy_token, - revoked_project_deploy_token, - expired_project_deploy_token, - group_deploy_token, - revoked_group_deploy_token, - expired_group_deploy_token - ]) + is_expected.to match_array( + [ + project_deploy_token, + revoked_project_deploy_token, + expired_project_deploy_token, + group_deploy_token, + revoked_group_deploy_token, + expired_group_deploy_token + ]) end context 'and active filter is applied' do let(:params) { { active: true } } it 'returns only active tokens' do - is_expected.to match_array([ - project_deploy_token, - group_deploy_token - ]) + is_expected.to match_array( + [ + project_deploy_token, + group_deploy_token + ]) end end @@ -68,11 +70,12 @@ RSpec.describe DeployTokens::TokensFinder do end it 'returns all deploy tokens for the project' do - is_expected.to match_array([ - project_deploy_token, - revoked_project_deploy_token, - expired_project_deploy_token - ]) + is_expected.to match_array( + [ + project_deploy_token, + revoked_project_deploy_token, + expired_project_deploy_token + ]) end context 'and active filter is applied' do @@ -100,11 +103,12 @@ RSpec.describe DeployTokens::TokensFinder do end it 'returns all deploy tokens for the group' do - is_expected.to match_array([ - group_deploy_token, - revoked_group_deploy_token, - expired_group_deploy_token - ]) + is_expected.to match_array( + [ + group_deploy_token, + revoked_group_deploy_token, + expired_group_deploy_token + ]) end context 'and active filter is applied' do diff --git a/spec/finders/deployments_finder_spec.rb b/spec/finders/deployments_finder_spec.rb index 51c293bcfd1..efb739c3d2f 100644 --- a/spec/finders/deployments_finder_spec.rb +++ b/spec/finders/deployments_finder_spec.rb @@ -32,7 +32,17 @@ RSpec.describe DeploymentsFinder do it 'raises an error' do expect { subject }.to raise_error( described_class::InefficientQueryError, - '`finished_at` filter and `finished_at` sorting must be paired') + '`finished_at` filter requires `finished_at` sort.') + end + end + + context 'when running status filter and finished_at sorting' do + let(:params) { { status: :running, order_by: :finished_at } } + + it 'raises an error' do + expect { subject }.to raise_error( + described_class::InefficientQueryError, + '`finished_at` sort requires `finished_at` filter or a filter with at least one of the finished statuses.') end end @@ -52,7 +62,17 @@ RSpec.describe DeploymentsFinder do it 'raises an error' do expect { subject }.to raise_error( described_class::InefficientQueryError, - '`environment` filter must be combined with `project` scope.') + '`environment` name filter must be combined with `project` scope.') + end + end + + context 'when status filter with mixed finished and upcoming statuses' do + let(:params) { { status: [:success, :running] } } + + it 'raises an error' do + expect { subject }.to raise_error( + described_class::InefficientQueryError, + 'finished statuses and upcoming statuses must be separately queried.') end end end @@ -103,6 +123,24 @@ RSpec.describe DeploymentsFinder do end end + context 'when the environment ID is specified' do + let!(:environment1) { create(:environment, project: project) } + let!(:environment2) { create(:environment, project: project) } + let!(:deployment1) do + create(:deployment, project: project, environment: environment1) + end + + let!(:deployment2) do + create(:deployment, project: project, environment: environment2) + end + + let(:params) { { environment: environment1.id } } + + it 'returns deployments for the given environment' do + is_expected.to match_array([deployment1]) + end + end + context 'when the deployment status is specified' do let!(:deployment1) { create(:deployment, :success, project: project) } let!(:deployment2) { create(:deployment, :failed, project: project) } diff --git a/spec/finders/design_management/versions_finder_spec.rb b/spec/finders/design_management/versions_finder_spec.rb index 0d606ef46f1..7dafdcfda97 100644 --- a/spec/finders/design_management/versions_finder_spec.rb +++ b/spec/finders/design_management/versions_finder_spec.rb @@ -71,13 +71,13 @@ RSpec.describe DesignManagement::VersionsFinder do describe 'returning versions earlier or equal to a version' do context 'when argument is the first version' do - let(:params) { { earlier_or_equal_to: version_1 }} + let(:params) { { earlier_or_equal_to: version_1 } } it { is_expected.to eq([version_1]) } end context 'when argument is the second version' do - let(:params) { { earlier_or_equal_to: version_2 }} + let(:params) { { earlier_or_equal_to: version_2 } } it { is_expected.to contain_exactly(version_1, version_2) } end diff --git a/spec/finders/environments/environments_finder_spec.rb b/spec/finders/environments/environments_finder_spec.rb index 71d10ceb5d3..04fbd4067b4 100644 --- a/spec/finders/environments/environments_finder_spec.rb +++ b/spec/finders/environments/environments_finder_spec.rb @@ -6,8 +6,8 @@ RSpec.describe Environments::EnvironmentsFinder do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { project.creator } let_it_be(:environment) { create(:environment, :available, project: project) } - let_it_be(:environment_stopped) { create(:environment, :stopped, name: 'test2', project: project) } - let_it_be(:environment_available) { create(:environment, :available, name: 'test3', project: project) } + let_it_be(:environment_stopped) { create(:environment, :stopped, name: 'test/test2', project: project) } + let_it_be(:environment_available) { create(:environment, :available, name: 'test/test3', project: project) } before do project.add_maintainer(user) @@ -65,5 +65,11 @@ RSpec.describe Environments::EnvironmentsFinder do expect(result).to contain_exactly(environment_available) end end + + it 'filters environments by type' do + result = described_class.new(project, user, type: 'test').execute + + expect(result).to contain_exactly(environment_stopped, environment_available) + end end end diff --git a/spec/finders/group_descendants_finder_spec.rb b/spec/finders/group_descendants_finder_spec.rb index 5c5db874e85..2a9e887450c 100644 --- a/spec/finders/group_descendants_finder_spec.rb +++ b/spec/finders/group_descendants_finder_spec.rb @@ -131,7 +131,7 @@ RSpec.describe GroupDescendantsFinder do project = create(:project, namespace: group) other_project = create(:project) other_project.project_group_links.create!(group: group, - group_access: Gitlab::Access::MAINTAINER) + group_access: Gitlab::Access::MAINTAINER) expect(finder.execute).to contain_exactly(project) end @@ -231,8 +231,8 @@ RSpec.describe GroupDescendantsFinder do other_subgroup.add_developer(other_user) finder = described_class.new(current_user: other_user, - parent_group: group, - params: params) + parent_group: group, + params: params) expect(finder.execute).to contain_exactly(other_subgroup, public_subgroup, other_subsubgroup) end diff --git a/spec/finders/group_members_finder_spec.rb b/spec/finders/group_members_finder_spec.rb index 00aa14209a2..0d1b58e2636 100644 --- a/spec/finders/group_members_finder_spec.rb +++ b/spec/finders/group_members_finder_spec.rb @@ -21,10 +21,10 @@ RSpec.describe GroupMembersFinder, '#execute' do let(:groups) do { - group: group, - sub_group: sub_group, - sub_sub_group: sub_sub_group, - public_shared_group: public_shared_group, + group: group, + sub_group: sub_group, + sub_sub_group: sub_sub_group, + public_shared_group: public_shared_group, private_shared_group: private_shared_group } end @@ -32,26 +32,27 @@ RSpec.describe GroupMembersFinder, '#execute' do context 'relations' do let!(:members) do { - user1_sub_sub_group: create(:group_member, :maintainer, group: sub_sub_group, user: user1), - user1_sub_group: create(:group_member, :developer, group: sub_group, user: user1), - user1_group: create(:group_member, :reporter, group: group, user: user1), - user1_public_shared_group: create(:group_member, :maintainer, group: public_shared_group, user: user1), + user1_sub_sub_group: create(:group_member, :maintainer, group: sub_sub_group, user: user1), + user1_sub_group: create(:group_member, :developer, group: sub_group, user: user1), + user1_group: create(:group_member, :reporter, group: group, user: user1), + user1_public_shared_group: create(:group_member, :maintainer, group: public_shared_group, user: user1), user1_private_shared_group: create(:group_member, :maintainer, group: private_shared_group, user: user1), - user2_sub_sub_group: create(:group_member, :reporter, group: sub_sub_group, user: user2), - user2_sub_group: create(:group_member, :developer, group: sub_group, user: user2), - user2_group: create(:group_member, :maintainer, group: group, user: user2), - user2_public_shared_group: create(:group_member, :developer, group: public_shared_group, user: user2), - user2_private_shared_group: create(:group_member, :developer, group: private_shared_group, user: user2), - user3_sub_sub_group: create(:group_member, :developer, group: sub_sub_group, user: user3, expires_at: 1.day.from_now), - user3_sub_group: create(:group_member, :developer, group: sub_group, user: user3, expires_at: 2.days.from_now), - user3_group: create(:group_member, :reporter, group: group, user: user3), - user3_public_shared_group: create(:group_member, :reporter, group: public_shared_group, user: user3), - user3_private_shared_group: create(:group_member, :reporter, group: private_shared_group, user: user3), - user4_sub_sub_group: create(:group_member, :reporter, group: sub_sub_group, user: user4), - user4_sub_group: create(:group_member, :developer, group: sub_group, user: user4, expires_at: 1.day.from_now), - user4_group: create(:group_member, :developer, group: group, user: user4, expires_at: 2.days.from_now), - user4_public_shared_group: create(:group_member, :developer, group: public_shared_group, user: user4), - user4_private_shared_group: create(:group_member, :developer, group: private_shared_group, user: user4) + user2_sub_sub_group: create(:group_member, :reporter, group: sub_sub_group, user: user2), + user2_sub_group: create(:group_member, :developer, group: sub_group, user: user2), + user2_group: create(:group_member, :maintainer, group: group, user: user2), + user2_public_shared_group: create(:group_member, :developer, group: public_shared_group, user: user2), + user2_private_shared_group: create(:group_member, :developer, group: private_shared_group, user: user2), + user3_sub_sub_group: create(:group_member, :developer, group: sub_sub_group, user: user3, expires_at: 1.day.from_now), + user3_sub_group: create(:group_member, :developer, group: sub_group, user: user3, expires_at: 2.days.from_now), + user3_group: create(:group_member, :reporter, group: group, user: user3), + user3_public_shared_group: create(:group_member, :reporter, group: public_shared_group, user: user3), + user3_private_shared_group: create(:group_member, :reporter, group: private_shared_group, user: user3), + user4_sub_sub_group: create(:group_member, :reporter, group: sub_sub_group, user: user4), + user4_sub_group: create(:group_member, :developer, group: sub_group, user: user4, expires_at: 1.day.from_now), + user4_group: create(:group_member, :developer, group: group, user: user4, expires_at: 2.days.from_now), + user4_public_shared_group: create(:group_member, :developer, group: public_shared_group, user: user4), + user4_private_shared_group: create(:group_member, :developer, group: private_shared_group, user: user4), + user5_private_shared_group: create(:group_member, :developer, group: private_shared_group, user: user5) } end @@ -76,15 +77,15 @@ RSpec.describe GroupMembersFinder, '#execute' do [:direct] | :sub_group | [:user1_sub_group, :user2_sub_group, :user3_sub_group, :user4_sub_group] [:inherited] | :sub_group | [:user1_group, :user2_group, :user3_group, :user4_group] [:descendants] | :sub_group | [:user1_sub_sub_group, :user2_sub_sub_group, :user3_sub_sub_group, :user4_sub_sub_group] - [:shared_from_groups] | :sub_group | [] - [:direct, :inherited, :descendants, :shared_from_groups] | :sub_group | [:user1_sub_sub_group, :user2_group, :user3_sub_group, :user4_group] + [:shared_from_groups] | :sub_group | [:user1_public_shared_group, :user2_public_shared_group, :user3_public_shared_group, :user4_public_shared_group] + [:direct, :inherited, :descendants, :shared_from_groups] | :sub_group | [:user1_sub_sub_group, :user2_group, :user3_sub_group, :user4_public_shared_group] [] | :sub_sub_group | [] GroupMembersFinder::DEFAULT_RELATIONS | :sub_sub_group | [:user1_sub_sub_group, :user2_group, :user3_sub_group, :user4_group] [:direct] | :sub_sub_group | [:user1_sub_sub_group, :user2_sub_sub_group, :user3_sub_sub_group, :user4_sub_sub_group] [:inherited] | :sub_sub_group | [:user1_sub_group, :user2_group, :user3_sub_group, :user4_group] [:descendants] | :sub_sub_group | [] - [:shared_from_groups] | :sub_sub_group | [] - [:direct, :inherited, :descendants, :shared_from_groups] | :sub_sub_group | [:user1_sub_sub_group, :user2_group, :user3_sub_group, :user4_group] + [:shared_from_groups] | :sub_sub_group | [:user1_public_shared_group, :user2_public_shared_group, :user3_public_shared_group, :user4_public_shared_group] + [:direct, :inherited, :descendants, :shared_from_groups] | :sub_sub_group | [:user1_sub_sub_group, :user2_group, :user3_sub_group, :user4_public_shared_group] end with_them do diff --git a/spec/finders/groups/accepting_group_transfers_finder_spec.rb b/spec/finders/groups/accepting_group_transfers_finder_spec.rb new file mode 100644 index 00000000000..1a6c6f9243b --- /dev/null +++ b/spec/finders/groups/accepting_group_transfers_finder_spec.rb @@ -0,0 +1,135 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Groups::AcceptingGroupTransfersFinder do + let_it_be(:current_user) { create(:user) } + + let_it_be(:great_grandparent_group) do + create(:group, name: 'great grandparent group', path: 'great-grandparent-group') + end + + let_it_be(:grandparent_group) { create(:group, parent: great_grandparent_group) } + let_it_be(:parent_group) { create(:group, parent: grandparent_group) } + let_it_be(:child_group) { create(:group, parent: parent_group) } + let_it_be(:grandchild_group) { create(:group, parent: child_group) } + let_it_be(:group_where_user_has_owner_access) do + create(:group, name: 'owner access group', path: 'owner-access-group').tap do |group| + group.add_owner(current_user) + end + end + + let_it_be(:subgroup_of_group_where_user_has_owner_access) do + create(:group, parent: group_where_user_has_owner_access) + end + + let_it_be(:group_where_user_has_developer_access) do + create(:group).tap do |group| + group.add_developer(current_user) + end + end + + let_it_be(:shared_with_group_where_direct_owner_as_guest) { create(:group) } + let_it_be(:shared_with_group_where_direct_owner_as_owner) { create(:group) } + let_it_be(:subgroup_of_shared_with_group_where_direct_owner_as_owner) do + create(:group, parent: shared_with_group_where_direct_owner_as_owner) + end + + let(:params) { {} } + + describe '#execute' do + before_all do + create(:group_group_link, :owner, + shared_with_group: group_where_user_has_owner_access, + shared_group: shared_with_group_where_direct_owner_as_owner + ) + + create(:group_group_link, :guest, + shared_with_group: group_where_user_has_owner_access, + shared_group: shared_with_group_where_direct_owner_as_guest + ) + end + + let(:group_to_be_transferred) { parent_group } + + subject(:result) do + described_class.new(current_user, group_to_be_transferred, params).execute + end + + context 'when the user does not have the rights to transfer the group' do + before do + group_to_be_transferred.root_ancestor.add_developer(current_user) + end + + it 'returns empty result' do + expect(result).to be_empty + end + end + + context 'when the user has the rights to transfer the group' do + before do + group_to_be_transferred.root_ancestor.add_owner(current_user) + end + + it 'does not return empty result' do + expect(result).not_to be_empty + end + + it 'excludes the descendants of the group to be transferred' do + expect(result).not_to include(child_group, grandchild_group) + end + + it 'excludes the immediate parent of the group to be transferred' do + expect(result).not_to include(grandparent_group) + end + + it 'excludes the groups where the user does not have OWNER access' do + expect(result).not_to include(group_where_user_has_developer_access) + end + + it 'excludes the groups arising from group shares where the user does not have OWNER access' do + expect(result).not_to include(shared_with_group_where_direct_owner_as_guest) + end + + it 'includes ancestors, except immediate parent of the group to be transferred' do + expect(result).to include(great_grandparent_group) + end + + it 'includes the other groups where the user has OWNER access' do + expect(result).to include(group_where_user_has_owner_access) + end + + it 'includes the other groups where the user has OWNER access through inherited membership' do + expect(result).to include(subgroup_of_group_where_user_has_owner_access) + end + + it 'includes the groups where the user has OWNER access through group shares' do + expect(result).to include( + shared_with_group_where_direct_owner_as_owner, + subgroup_of_shared_with_group_where_direct_owner_as_owner + ) + end + + context 'on searching with a specific term' do + let(:params) { { search: 'great grandparent group' } } + + it 'includes only the groups where the term matches the group name or path' do + expect(result).to contain_exactly(great_grandparent_group) + end + end + + context 'when the feature flag `include_groups_from_group_shares_in_group_transfer_locations` is turned off' do + before do + stub_feature_flags(include_groups_from_group_shares_in_group_transfer_locations: false) + end + + it 'excludes the groups where the user has OWNER access through group shares' do + expect(result).not_to include( + shared_with_group_where_direct_owner_as_owner, + subgroup_of_shared_with_group_where_direct_owner_as_owner + ) + end + end + end + end +end diff --git a/spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb b/spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb index 8cdfa13ba3a..985b132ee8b 100644 --- a/spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb +++ b/spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb @@ -54,14 +54,14 @@ RSpec.describe Groups::ProjectsRequiringAuthorizationsRefresh::OnDirectMembershi it 'includes only the expected projects' do expected_projects = Project.id_in( [ - project_b_subgroup_1, # direct member of Group B gets access to this project due to group hierarchy - project_b_subgroup_2, # direct member of Group B gets access to this project due to group hierarchy - project_c, # direct member of Group B gets access to this project via project-group share - project_a_subgroup_1, # direct member of Group B gets access to this project via group share - project_a_subgroup_2, # direct member of Group B gets access to this project via group share + project_b_subgroup_1, # direct member of Group B gets access to this project due to group hierarchy + project_b_subgroup_2, # direct member of Group B gets access to this project due to group hierarchy + project_c, # direct member of Group B gets access to this project via project-group share + project_a_subgroup_1, # direct member of Group B gets access to this project via group share + project_a_subgroup_2, # direct member of Group B gets access to this project via group share - # direct member of Group B gets access to any projects shared with groups within its shared groups. - project_x_subgroup_1 + # direct member of Group B gets access to any projects shared with groups within its shared groups. + project_x_subgroup_1 ] ) # project_c_subgroup_1 is not included in the list because only 'direct' members of diff --git a/spec/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder_spec.rb b/spec/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder_spec.rb index 103cef44c94..1a0e8c5b9e6 100644 --- a/spec/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder_spec.rb +++ b/spec/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder_spec.rb @@ -46,9 +46,9 @@ RSpec.describe Groups::ProjectsRequiringAuthorizationsRefresh::OnTransferFinder it 'includes only the expected projects' do expected_projects = Project.id_in( [ - project_b_subgroup_1, - project_b_subgroup_2, - project_c + project_b_subgroup_1, + project_b_subgroup_2, + project_c ] ) diff --git a/spec/finders/groups_finder_spec.rb b/spec/finders/groups_finder_spec.rb index a4cbee6a124..123df418f8d 100644 --- a/spec/finders/groups_finder_spec.rb +++ b/spec/finders/groups_finder_spec.rb @@ -261,6 +261,108 @@ RSpec.describe GroupsFinder do end end end + + context 'with include_ancestors' do + let_it_be(:user) { create(:user) } + + let_it_be(:parent_group) { create(:group, :public) } + let_it_be(:public_subgroup) { create(:group, :public, parent: parent_group) } + let_it_be(:public_subgroup2) { create(:group, :public, parent: parent_group) } + let_it_be(:private_subgroup1) { create(:group, :private, parent: parent_group) } + let_it_be(:internal_sub_subgroup) { create(:group, :internal, parent: public_subgroup) } + let_it_be(:public_sub_subgroup) { create(:group, :public, parent: public_subgroup) } + let_it_be(:private_subgroup2) { create(:group, :private, parent: parent_group) } + let_it_be(:private_sub_subgroup) { create(:group, :private, parent: private_subgroup2) } + let_it_be(:private_sub_sub_subgroup) { create(:group, :private, parent: private_sub_subgroup) } + + context 'if include_ancestors is true' do + let(:params) { { include_ancestors: true } } + + it 'returns ancestors of user groups' do + private_sub_subgroup.add_developer(user) + + expect(described_class.new(user, params).execute).to contain_exactly( + parent_group, + public_subgroup, + public_subgroup2, + internal_sub_subgroup, + public_sub_subgroup, + private_subgroup2, + private_sub_subgroup, + private_sub_sub_subgroup + ) + end + + it 'returns subgroup if user is member of project of subgroup' do + project = create(:project, :private, namespace: private_sub_subgroup) + project.add_developer(user) + + expect(described_class.new(user, params).execute).to contain_exactly( + parent_group, + public_subgroup, + public_subgroup2, + internal_sub_subgroup, + public_sub_subgroup, + private_subgroup2, + private_sub_subgroup + ) + end + + it 'returns only groups related to user groups if all_available is false' do + params[:all_available] = false + private_sub_subgroup.add_developer(user) + + expect(described_class.new(user, params).execute).to contain_exactly( + parent_group, + private_subgroup2, + private_sub_subgroup, + private_sub_sub_subgroup + ) + end + end + + context 'if include_ancestors is false' do + let(:params) { { include_ancestors: false } } + + it 'does not return private ancestors of user groups' do + private_sub_subgroup.add_developer(user) + + expect(described_class.new(user, params).execute).to contain_exactly( + parent_group, + public_subgroup, + public_subgroup2, + internal_sub_subgroup, + public_sub_subgroup, + private_sub_subgroup, + private_sub_sub_subgroup + ) + end + + it "returns project's parent group if user is member of project" do + project = create(:project, :private, namespace: private_sub_subgroup) + project.add_developer(user) + + expect(described_class.new(user, params).execute).to contain_exactly( + parent_group, + public_subgroup, + public_subgroup2, + internal_sub_subgroup, + public_sub_subgroup, + private_sub_subgroup + ) + end + + it 'returns only user groups and their descendants if all_available is false' do + params[:all_available] = false + private_sub_subgroup.add_developer(user) + + expect(described_class.new(user, params).execute).to contain_exactly( + private_sub_subgroup, + private_sub_sub_subgroup + ) + end + end + end end describe '#execute' do diff --git a/spec/finders/merge_requests_finder/params_spec.rb b/spec/finders/merge_requests_finder/params_spec.rb deleted file mode 100644 index 8c285972f48..00000000000 --- a/spec/finders/merge_requests_finder/params_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe MergeRequestsFinder::Params do - let(:user) { create(:user) } - - subject { described_class.new(params, user, MergeRequest) } - - describe 'attention' do - context 'attention param exists' do - let(:params) { { attention: user.username } } - - it { expect(subject.attention).to eq(user) } - end - - context 'attention param does not exist' do - let(:params) { { attention: nil } } - - it { expect(subject.attention).to eq(nil) } - end - end -end diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb index 96466e99105..deeca6132e0 100644 --- a/spec/finders/merge_requests_finder_spec.rb +++ b/spec/finders/merge_requests_finder_spec.rb @@ -408,25 +408,6 @@ RSpec.describe MergeRequestsFinder do end end - context 'attention' do - subject { described_class.new(user, params).execute } - - before do - reviewer = merge_request1.find_reviewer(user2) - reviewer.update!(state: :reviewed) - - merge_request2.find_reviewer(user2).update!(state: :attention_requested) - merge_request3.find_assignee(user2).update!(state: :attention_requested) - end - - context 'by username' do - let(:params) { { attention: user2.username } } - let(:expected_mr) { [merge_request2, merge_request3] } - - it { is_expected.to contain_exactly(*expected_mr) } - end - end - context 'reviewer filtering' do subject { described_class.new(user, params).execute } @@ -512,7 +493,7 @@ RSpec.describe MergeRequestsFinder do end end - context 'filtering by approved by' do + context 'filtering by approved by username' do let(:params) { { approved_by_usernames: user2.username } } before do @@ -525,6 +506,16 @@ RSpec.describe MergeRequestsFinder do expect(merge_requests).to contain_exactly(merge_request3) end + context 'with sorting by milestone' do + let(:params) { { approved_by_usernames: user2.username, sort: 'milestone' } } + + it 'returns merge requests approved by that user' do + merge_requests = described_class.new(user, params).execute + + expect(merge_requests).to contain_exactly(merge_request3) + end + end + context 'not filter' do let(:params) { { not: { approved_by_usernames: user2.username } } } @@ -550,6 +541,30 @@ RSpec.describe MergeRequestsFinder do end end + context 'filtering by approved by user ID' do + let(:params) { { approved_by_ids: user2.id } } + + before do + create(:approval, merge_request: merge_request3, user: user2) + end + + it 'returns merge requests approved by that user' do + merge_requests = described_class.new(user, params).execute + + expect(merge_requests).to contain_exactly(merge_request3) + end + + context 'with sorting by milestone' do + let(:params) { { approved_by_usernames: user2.username, sort: 'milestone' } } + + it 'returns merge requests approved by that user' do + merge_requests = described_class.new(user, params).execute + + expect(merge_requests).to contain_exactly(merge_request3) + end + end + end + context 'filtering by created_at/updated_at' do let(:new_project) { create(:project, forked_from_project: project1) } @@ -751,7 +766,8 @@ RSpec.describe MergeRequestsFinder do release_tag: 'none', label_names: 'none', my_reaction_emoji: 'none', - draft: 'no' + draft: 'no', + sort: 'milestone' } merge_requests = described_class.new(user, params).execute diff --git a/spec/finders/milestones_finder_spec.rb b/spec/finders/milestones_finder_spec.rb index 8b26599cbfa..8dd83df3a28 100644 --- a/spec/finders/milestones_finder_spec.rb +++ b/spec/finders/milestones_finder_spec.rb @@ -28,7 +28,7 @@ RSpec.describe MilestonesFinder do end context 'milestones for groups and project' do - let(:extra_params) {{}} + let(:extra_params) { {} } let(:result) do described_class.new({ project_ids: [project_1.id, project_2.id], group_ids: group.id, state: 'all' }.merge(extra_params)).execute end diff --git a/spec/finders/packages/group_packages_finder_spec.rb b/spec/finders/packages/group_packages_finder_spec.rb index 90a8cd3c57f..f78a356b13d 100644 --- a/spec/finders/packages/group_packages_finder_spec.rb +++ b/spec/finders/packages/group_packages_finder_spec.rb @@ -217,7 +217,7 @@ RSpec.describe Packages::GroupPackagesFinder do context 'group is nil' do subject { described_class.new(user, nil).execute } - it { is_expected.to be_empty} + it { is_expected.to be_empty } end context 'package type is nil' do @@ -225,7 +225,7 @@ RSpec.describe Packages::GroupPackagesFinder do subject { described_class.new(user, group, package_type: nil).execute } - it { is_expected.to match_array([package1])} + it { is_expected.to match_array([package1]) } end context 'with invalid package_type' do diff --git a/spec/finders/packages/npm/package_finder_spec.rb b/spec/finders/packages/npm/package_finder_spec.rb index 7fabb3eed86..8c9149a5a2d 100644 --- a/spec/finders/packages/npm/package_finder_spec.rb +++ b/spec/finders/packages/npm/package_finder_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' RSpec.describe ::Packages::Npm::PackageFinder do - let_it_be_with_reload(:project) { create(:project)} + let_it_be_with_reload(:project) { create(:project) } let_it_be_with_refind(:package) { create(:npm_package, project: project) } let(:project) { package.project } diff --git a/spec/finders/projects_finder_spec.rb b/spec/finders/projects_finder_spec.rb index 3bef4d85b33..1fa2a975ec3 100644 --- a/spec/finders/projects_finder_spec.rb +++ b/spec/finders/projects_finder_spec.rb @@ -62,7 +62,7 @@ RSpec.describe ProjectsFinder do describe 'with id_after' do context 'only returns projects with a project id greater than given' do - let(:params) { { id_after: internal_project.id }} + let(:params) { { id_after: internal_project.id } } it { is_expected.to eq([public_project]) } end @@ -70,7 +70,7 @@ RSpec.describe ProjectsFinder do describe 'with id_before' do context 'only returns projects with a project id less than given' do - let(:params) { { id_before: public_project.id }} + let(:params) { { id_before: public_project.id } } it { is_expected.to eq([internal_project]) } end @@ -79,7 +79,7 @@ RSpec.describe ProjectsFinder do describe 'with both id_before and id_after' do context 'only returns projects with a project id less than given' do let!(:projects) { create_list(:project, 5, :public) } - let(:params) { { id_after: projects.first.id, id_before: projects.last.id }} + let(:params) { { id_after: projects.first.id, id_before: projects.last.id } } it { is_expected.to contain_exactly(*projects[1..-2]) } end @@ -89,7 +89,7 @@ RSpec.describe ProjectsFinder do context 'only returns projects with a project id less than given and matching search' do subject { finder.execute.joins(:route) } - let(:params) { { id_before: public_project.id }} + let(:params) { { id_before: public_project.id } } it { is_expected.to eq([internal_project]) } end @@ -97,7 +97,7 @@ RSpec.describe ProjectsFinder do context 'only returns projects with a project id greater than given and matching search' do subject { finder.execute.joins(:route) } - let(:params) { { id_after: internal_project.id }} + let(:params) { { id_after: internal_project.id } } it { is_expected.to eq([public_project]) } end diff --git a/spec/finders/template_finder_spec.rb b/spec/finders/template_finder_spec.rb index 8e2426e697b..21fea7863ff 100644 --- a/spec/finders/template_finder_spec.rb +++ b/spec/finders/template_finder_spec.rb @@ -7,10 +7,10 @@ RSpec.describe TemplateFinder do let_it_be(:template_files) do { - "Dockerfile/project_dockerfiles_template.dockerfile" => "project_dockerfiles_template content", - "gitignore/project_gitignores_template.gitignore" => "project_gitignores_template content", - "gitlab-ci/project_gitlab_ci_ymls_template.yml" => "project_gitlab_ci_ymls_template content", - ".gitlab/issue_templates/project_issues_template.md" => "project_issues_template content", + "Dockerfile/project_dockerfiles_template.dockerfile" => "project_dockerfiles_template content", + "gitignore/project_gitignores_template.gitignore" => "project_gitignores_template content", + "gitlab-ci/project_gitlab_ci_ymls_template.yml" => "project_gitlab_ci_ymls_template content", + ".gitlab/issue_templates/project_issues_template.md" => "project_issues_template content", ".gitlab/merge_request_templates/project_merge_requests_template.md" => "project_merge_requests_template content" } end |