diff options
Diffstat (limited to 'spec/finders')
-rw-r--r-- | spec/finders/ci/commit_statuses_finder_spec.rb | 6 | ||||
-rw-r--r-- | spec/finders/ci/pipelines_for_merge_request_finder_spec.rb | 176 | ||||
-rw-r--r-- | spec/finders/clusters/agents_finder_spec.rb | 41 | ||||
-rw-r--r-- | spec/finders/error_tracking/errors_finder_spec.rb | 15 | ||||
-rw-r--r-- | spec/finders/issues_finder_spec.rb | 26 | ||||
-rw-r--r-- | spec/finders/members_finder_spec.rb | 62 | ||||
-rw-r--r-- | spec/finders/packages/group_packages_finder_spec.rb | 13 | ||||
-rw-r--r-- | spec/finders/projects/members/effective_access_level_finder_spec.rb | 20 | ||||
-rw-r--r-- | spec/finders/projects/topics_finder_spec.rb | 45 | ||||
-rw-r--r-- | spec/finders/tags_finder_spec.rb | 79 |
10 files changed, 328 insertions, 155 deletions
diff --git a/spec/finders/ci/commit_statuses_finder_spec.rb b/spec/finders/ci/commit_statuses_finder_spec.rb index 2e26e38f4b4..9f66b53dd1f 100644 --- a/spec/finders/ci/commit_statuses_finder_spec.rb +++ b/spec/finders/ci/commit_statuses_finder_spec.rb @@ -8,7 +8,7 @@ RSpec.describe Ci::CommitStatusesFinder, '#execute' do let_it_be(:user) { create(:user) } context 'tag refs' do - let_it_be(:tags) { TagsFinder.new(project.repository, {}).execute } + let_it_be(:tags) { project.repository.tags } let(:subject) { described_class.new(project, project.repository, user, tags).execute } @@ -131,7 +131,7 @@ RSpec.describe Ci::CommitStatusesFinder, '#execute' do end context 'CI pipelines visible to' do - let_it_be(:tags) { TagsFinder.new(project.repository, {}).execute } + let_it_be(:tags) { project.repository.tags } let(:subject) { described_class.new(project, project.repository, user, tags).execute } @@ -161,7 +161,7 @@ RSpec.describe Ci::CommitStatusesFinder, '#execute' do context 'when not a member of a private project' do let(:private_project) { create(:project, :private, :repository) } - let(:private_tags) { TagsFinder.new(private_tags.repository, {}).execute } + let(:private_tags) { private_tags.repository.tags } let(:private_subject) { described_class.new(private_project, private_project.repository, user, tags).execute } before do 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 65f6dc0ba74..8a802e9660b 100644 --- a/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb +++ b/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb @@ -44,7 +44,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do let(:actor) { developer_in_both } it 'returns all pipelines' do - is_expected.to eq([pipeline_in_fork, pipeline_in_parent]) + is_expected.to match_array([pipeline_in_fork, pipeline_in_parent]) end end @@ -52,7 +52,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do let(:actor) { reporter_in_parent_and_developer_in_fork } it 'returns all pipelines' do - is_expected.to eq([pipeline_in_fork, pipeline_in_parent]) + is_expected.to match_array([pipeline_in_fork, pipeline_in_parent]) end end @@ -60,7 +60,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do let(:actor) { developer_in_parent } it 'returns pipelines in parent' do - is_expected.to eq([pipeline_in_parent]) + is_expected.to match_array([pipeline_in_parent]) end end @@ -68,7 +68,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do let(:actor) { developer_in_fork } it 'returns pipelines in fork' do - is_expected.to eq([pipeline_in_fork]) + is_expected.to match_array([pipeline_in_fork]) end end @@ -97,7 +97,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do shared_examples 'returning pipelines with proper ordering' do let!(:all_pipelines) do - merge_request.all_commit_shas.map do |sha| + merge_request.recent_diff_head_shas.map do |sha| create(:ci_empty_pipeline, project: project, sha: sha, ref: merge_request.source_branch) end @@ -135,12 +135,92 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do end context 'when pipelines exist for the branch and merge request' do + shared_examples 'returns all pipelines for merge request' do + it 'returns merge request pipeline first' do + expect(subject.all).to eq([detached_merge_request_pipeline, branch_pipeline]) + end + + 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) + 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) + end + + it 'returns merge request pipelines first' do + expect(subject.all) + .to eq([detached_merge_request_pipeline_2, + detached_merge_request_pipeline, + branch_pipeline_2, + branch_pipeline]) + end + end + + 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) + end + + let!(:branch_pipeline_with_sha_not_belonging_to_merge_request) do + create(:ci_pipeline, source: :push, project: project, ref: source_ref) + 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_2) + end + + let(:merge_request_2) do + create(:merge_request, source_project: project, source_branch: source_ref, + target_project: project, target_branch: 'stable') + end + + before do + shas.each.with_index do |sha, index| + create(:merge_request_diff_commit, + merge_request_diff: merge_request_2.merge_request_diff, + sha: sha, relative_order: index) + end + end + + it 'returns only related merge request pipelines' do + expect(subject.all) + .to eq([detached_merge_request_pipeline, + branch_pipeline_2, + branch_pipeline]) + + expect(described_class.new(merge_request_2, nil).all) + .to match_array([detached_merge_request_pipeline_2, branch_pipeline_2, branch_pipeline]) + end + end + + 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) + end + + it 'sets the head ref of the merge request to the pipeline ref' do + expect(detached_merge_request_pipeline.ref).to match(%r{refs/merge-requests/\d+/head}) + end + + it 'includes the detached merge request pipeline even though the ref is custom path' do + expect(merge_request.all_pipelines).to include(detached_merge_request_pipeline) + end + end + end + let(:source_ref) { 'feature' } let(:target_ref) { 'master' } let!(:branch_pipeline) do create(:ci_pipeline, source: :push, project: project, - ref: source_ref, sha: shas.second) + ref: source_ref, sha: merge_request.merge_request_diff.head_commit_sha) end let!(:tag_pipeline) do @@ -149,97 +229,31 @@ 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) } let(:shas) { project.repository.commits(source_ref, limit: 2).map(&:id) } - before do - create(:merge_request_diff_commit, - merge_request_diff: merge_request.merge_request_diff, - sha: shas.second, relative_order: 1) - end - - it 'returns merge request pipeline first' do - expect(subject.all).to eq([detached_merge_request_pipeline, branch_pipeline]) - end - - 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) - 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) - end - - it 'returns merge request pipelines first' do - expect(subject.all) - .to eq([detached_merge_request_pipeline_2, - detached_merge_request_pipeline, - branch_pipeline_2, - branch_pipeline]) - end - end - - 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) - 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_2) - end - - let(:merge_request_2) do - create(:merge_request, source_project: project, source_branch: source_ref, - target_project: project, target_branch: 'stable') - end - + context 'when `decomposed_ci_query_in_pipelines_for_merge_request_finder` feature flag enabled' do before do - shas.each.with_index do |sha, index| - create(:merge_request_diff_commit, - merge_request_diff: merge_request_2.merge_request_diff, - sha: sha, relative_order: index) - end + stub_feature_flags(decomposed_ci_query_in_pipelines_for_merge_request_finder: merge_request.target_project) end - it 'returns only related merge request pipelines' do - expect(subject.all) - .to eq([detached_merge_request_pipeline, - branch_pipeline_2, - branch_pipeline]) - - expect(described_class.new(merge_request_2, nil).all) - .to eq([detached_merge_request_pipeline_2, - branch_pipeline_2, - branch_pipeline]) - end + it_behaves_like 'returns all pipelines for merge request' end - 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) - end - - it 'sets the head ref of the merge request to the pipeline ref' do - expect(detached_merge_request_pipeline.ref).to match(%r{refs/merge-requests/\d+/head}) + context 'when `decomposed_ci_query_in_pipelines_for_merge_request_finder` feature flag disabled' do + before do + stub_feature_flags(decomposed_ci_query_in_pipelines_for_merge_request_finder: false) end - it 'includes the detached merge request pipeline even though the ref is custom path' do - expect(merge_request.all_pipelines).to include(detached_merge_request_pipeline) - end + it_behaves_like 'returns all pipelines for merge request' end end end diff --git a/spec/finders/clusters/agents_finder_spec.rb b/spec/finders/clusters/agents_finder_spec.rb new file mode 100644 index 00000000000..0996d76b723 --- /dev/null +++ b/spec/finders/clusters/agents_finder_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Clusters::AgentsFinder do + describe '#execute' do + let(:project) { create(:project) } + let(:user) { create(:user, maintainer_projects: [project]) } + + let!(:matching_agent) { create(:cluster_agent, project: project) } + let!(:wrong_project) { create(:cluster_agent) } + + subject { described_class.new(project, user).execute } + + it { is_expected.to contain_exactly(matching_agent) } + + context 'user does not have permission' do + let(:user) { create(:user, developer_projects: [project]) } + + it { is_expected.to be_empty } + end + + context 'filtering by name' do + let(:params) { Hash(name: name_param) } + + subject { described_class.new(project, user, params: params).execute } + + context 'name does not match' do + let(:name_param) { 'other-name' } + + it { is_expected.to be_empty } + end + + context 'name does match' do + let(:name_param) { matching_agent.name } + + it { is_expected.to contain_exactly(matching_agent) } + end + end + end +end diff --git a/spec/finders/error_tracking/errors_finder_spec.rb b/spec/finders/error_tracking/errors_finder_spec.rb index 29053054f9d..66eb7769a4c 100644 --- a/spec/finders/error_tracking/errors_finder_spec.rb +++ b/spec/finders/error_tracking/errors_finder_spec.rb @@ -29,14 +29,25 @@ RSpec.describe ErrorTracking::ErrorsFinder do context 'with sort parameter' do let(:params) { { status: 'unresolved', sort: 'first_seen' } } - it { is_expected.to eq([error, error_yesterday]) } + it { expect(subject.to_a).to eq([error, error_yesterday]) } end - context 'with limit parameter' do + context 'pagination' do let(:params) { { limit: '1', sort: 'first_seen' } } # Sort by first_seen is DESC by default, so the most recent error is `error` it { is_expected.to contain_exactly(error) } + + it { expect(subject.has_next_page?).to be_truthy } + + it 'returns next page by cursor' do + params_with_cursor = params.merge(cursor: subject.cursor_for_next_page) + errors = described_class.new(user, project, params_with_cursor).execute + + expect(errors).to contain_exactly(error_resolved) + expect(errors.has_next_page?).to be_truthy + expect(errors.has_previous_page?).to be_truthy + end end end end diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb index ed35d75720c..9f12308013e 100644 --- a/spec/finders/issues_finder_spec.rb +++ b/spec/finders/issues_finder_spec.rb @@ -1199,6 +1199,14 @@ RSpec.describe IssuesFinder do end end + context 'when a non-simple sort is given' do + let(:params) { { search: 'foo', attempt_project_search_optimizations: true, sort: 'popularity' } } + + it 'returns false' do + expect(finder.use_cte_for_search?).to be_falsey + end + end + context 'when all conditions are met' do context "uses group search optimization" do let(:params) { { search: 'foo', attempt_group_search_optimizations: true } } @@ -1217,6 +1225,24 @@ RSpec.describe IssuesFinder do expect(finder.execute.to_sql).to match(/^WITH "issues" AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported}/) end end + + context 'with simple sort' do + let(:params) { { search: 'foo', attempt_project_search_optimizations: true, sort: 'updated_desc' } } + + it 'returns true' do + expect(finder.use_cte_for_search?).to be_truthy + expect(finder.execute.to_sql).to match(/^WITH "issues" AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported}/) + end + end + + context 'with simple sort as a symbol' do + let(:params) { { search: 'foo', attempt_project_search_optimizations: true, sort: :updated_desc } } + + it 'returns true' do + expect(finder.use_cte_for_search?).to be_truthy + expect(finder.execute.to_sql).to match(/^WITH "issues" AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported}/) + end + end end end diff --git a/spec/finders/members_finder_spec.rb b/spec/finders/members_finder_spec.rb index d25e1b9ca4b..749e319f9c7 100644 --- a/spec/finders/members_finder_spec.rb +++ b/spec/finders/members_finder_spec.rb @@ -161,42 +161,54 @@ RSpec.describe MembersFinder, '#execute' do end context 'when :invited_groups is passed' do - subject { described_class.new(project, user2).execute(include_relations: [:inherited, :direct, :invited_groups]) } + shared_examples 'with invited_groups param' do + subject { described_class.new(project, user2).execute(include_relations: [:inherited, :direct, :invited_groups]) } - let_it_be(:linked_group) { create(:group, :public) } - let_it_be(:nested_linked_group) { create(:group, parent: linked_group) } - let_it_be(:linked_group_member) { linked_group.add_guest(user1) } - let_it_be(:nested_linked_group_member) { nested_linked_group.add_guest(user2) } + let_it_be(:linked_group) { create(:group, :public) } + let_it_be(:nested_linked_group) { create(:group, parent: linked_group) } + let_it_be(:linked_group_member) { linked_group.add_guest(user1) } + let_it_be(:nested_linked_group_member) { nested_linked_group.add_guest(user2) } - it 'includes all the invited_groups members including members inherited from ancestor groups' do - create(:project_group_link, project: project, group: nested_linked_group) + it 'includes all the invited_groups members including members inherited from ancestor groups' do + create(:project_group_link, project: project, group: nested_linked_group) - expect(subject).to contain_exactly(linked_group_member, nested_linked_group_member) - end + expect(subject).to contain_exactly(linked_group_member, nested_linked_group_member) + end - it 'includes all the invited_groups members' do - create(:project_group_link, project: project, group: linked_group) + it 'includes all the invited_groups members' do + create(:project_group_link, project: project, group: linked_group) - expect(subject).to contain_exactly(linked_group_member) - end + expect(subject).to contain_exactly(linked_group_member) + end - it 'excludes group_members not visible to the user' do - create(:project_group_link, project: project, group: linked_group) - private_linked_group = create(:group, :private) - private_linked_group.add_developer(user3) - create(:project_group_link, project: project, group: private_linked_group) + it 'excludes group_members not visible to the user' do + create(:project_group_link, project: project, group: linked_group) + private_linked_group = create(:group, :private) + private_linked_group.add_developer(user3) + create(:project_group_link, project: project, group: private_linked_group) - expect(subject).to contain_exactly(linked_group_member) + expect(subject).to contain_exactly(linked_group_member) + end + + context 'when the user is a member of invited group and ancestor groups' do + it 'returns the highest access_level for the user limited by project_group_link.group_access', :nested_groups do + create(:project_group_link, project: project, group: nested_linked_group, group_access: Gitlab::Access::REPORTER) + nested_linked_group.add_developer(user1) + + expect(subject.map(&:user)).to contain_exactly(user1, user2) + expect(subject.max_by(&:access_level).access_level).to eq(Gitlab::Access::REPORTER) + end + end end - context 'when the user is a member of invited group and ancestor groups' do - it 'returns the highest access_level for the user limited by project_group_link.group_access', :nested_groups do - create(:project_group_link, project: project, group: nested_linked_group, group_access: Gitlab::Access::REPORTER) - nested_linked_group.add_developer(user1) + it_behaves_like 'with invited_groups param' - expect(subject.map(&:user)).to contain_exactly(user1, user2) - expect(subject.max_by(&:access_level).access_level).to eq(Gitlab::Access::REPORTER) + context 'when feature flag :linear_members_finder_ancestor_scopes is disabled' do + before do + stub_feature_flags(linear_members_finder_ancestor_scopes: false) end + + it_behaves_like 'with invited_groups param' end end end diff --git a/spec/finders/packages/group_packages_finder_spec.rb b/spec/finders/packages/group_packages_finder_spec.rb index d7f62bdfbb4..3254c436674 100644 --- a/spec/finders/packages/group_packages_finder_spec.rb +++ b/spec/finders/packages/group_packages_finder_spec.rb @@ -147,6 +147,19 @@ RSpec.describe Packages::GroupPackagesFinder do end end + context 'with exact package_name' do + let_it_be(:named_package) { create(:maven_package, project: project, name: 'maven') } + let_it_be(:other_package) { create(:maven_package, project: project, name: 'maventoo') } + + let(:params) { { exact_name: true, package_name: package_name } } + + context 'as complete name' do + let(:package_name) { 'maven' } + + it { is_expected.to match_array([named_package]) } + end + end + it_behaves_like 'concerning versionless param' it_behaves_like 'concerning package statuses' end diff --git a/spec/finders/projects/members/effective_access_level_finder_spec.rb b/spec/finders/projects/members/effective_access_level_finder_spec.rb index 1112dbd0d6e..33fbb5aca30 100644 --- a/spec/finders/projects/members/effective_access_level_finder_spec.rb +++ b/spec/finders/projects/members/effective_access_level_finder_spec.rb @@ -194,6 +194,7 @@ RSpec.describe Projects::Members::EffectiveAccessLevelFinder, '#execute' do context 'for a project that is shared with other group(s)' do let_it_be(:shared_with_group) { create(:group) } let_it_be(:user_from_shared_with_group) { create(:user) } + let_it_be(:project) { create(:project, group: create(:group)) } before do create(:project_group_link, :developer, project: project, group: shared_with_group) @@ -211,9 +212,24 @@ RSpec.describe Projects::Members::EffectiveAccessLevelFinder, '#execute' do ) end - context 'when the group containing the project has forbidden group shares for any of its projects' do - let_it_be(:project) { create(:project, group: create(:group)) } + context 'even when the `lock_memberships_to_ldap` setting has been turned ON' do + before do + stub_application_setting(lock_memberships_to_ldap: true) + end + it 'includes the least among the specified access levels' do + expect(subject).to( + include( + hash_including( + 'user_id' => user_from_shared_with_group.id, + 'access_level' => Gitlab::Access::DEVELOPER + ) + ) + ) + end + end + + context 'when the group containing the project has forbidden group shares for any of its projects' do before do project.namespace.update!(share_with_group_lock: true) end diff --git a/spec/finders/projects/topics_finder_spec.rb b/spec/finders/projects/topics_finder_spec.rb new file mode 100644 index 00000000000..28802c5d49e --- /dev/null +++ b/spec/finders/projects/topics_finder_spec.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Projects::TopicsFinder do + let_it_be(:user) { create(:user) } + + let!(:topic1) { create(:topic, name: 'topicB') } + let!(:topic2) { create(:topic, name: 'topicC') } + let!(:topic3) { create(:topic, name: 'topicA') } + + let!(:project1) { create(:project, namespace: user.namespace, topic_list: 'topicC, topicA, topicB') } + let!(:project2) { create(:project, namespace: user.namespace, topic_list: 'topicC, topicA') } + let!(:project3) { create(:project, namespace: user.namespace, topic_list: 'topicC') } + + describe '#execute' do + it 'returns topics' do + topics = described_class.new.execute + + expect(topics).to eq([topic2, topic3, topic1]) + end + + context 'filter by name' do + using RSpec::Parameterized::TableSyntax + + where(:search, :result) do + 'topic' | %w[topicC topicA topicB] + 'pic' | %w[topicC topicA topicB] + 'B' | %w[] + 'cB' | %w[] + 'icB' | %w[topicB] + 'topicA' | %w[topicA] + 'topica' | %w[topicA] + end + + with_them do + it 'returns filtered topics' do + topics = described_class.new(params: { search: search }).execute + + expect(topics.map(&:name)).to eq(result) + end + end + end + end +end diff --git a/spec/finders/tags_finder_spec.rb b/spec/finders/tags_finder_spec.rb index 08978a32e50..fe015d53ac9 100644 --- a/spec/finders/tags_finder_spec.rb +++ b/spec/finders/tags_finder_spec.rb @@ -3,93 +3,76 @@ require 'spec_helper' RSpec.describe TagsFinder do - let(:user) { create(:user) } - let(:project) { create(:project, :repository) } - let(:repository) { project.repository } + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project, :repository) } + let_it_be(:repository) { project.repository } + + def load_tags(params) + tags_finder = described_class.new(repository, params) + tags, error = tags_finder.execute + + expect(error).to eq(nil) + + tags + end describe '#execute' do context 'sort only' do it 'sorts by name' do - tags_finder = described_class.new(repository, {}) - - result = tags_finder.execute - - expect(result.first.name).to eq("v1.0.0") + expect(load_tags({}).first.name).to eq("v1.0.0") end it 'sorts by recently_updated' do - tags_finder = described_class.new(repository, { sort: 'updated_desc' }) - - result = tags_finder.execute recently_updated_tag = repository.tags.max do |a, b| repository.commit(a.dereferenced_target).committed_date <=> repository.commit(b.dereferenced_target).committed_date end - expect(result.first.name).to eq(recently_updated_tag.name) + params = { sort: 'updated_desc' } + + expect(load_tags(params).first.name).to eq(recently_updated_tag.name) end it 'sorts by last_updated' do - tags_finder = described_class.new(repository, { sort: 'updated_asc' }) - - result = tags_finder.execute + params = { sort: 'updated_asc' } - expect(result.first.name).to eq('v1.0.0') + expect(load_tags(params).first.name).to eq('v1.0.0') end end context 'filter only' do it 'filters tags by name' do - tags_finder = described_class.new(repository, { search: '1.0.0' }) - - result = tags_finder.execute + result = load_tags({ search: '1.0.0' }) expect(result.first.name).to eq('v1.0.0') expect(result.count).to eq(1) end it 'does not find any tags with that name' do - tags_finder = described_class.new(repository, { search: 'hey' }) - - result = tags_finder.execute - - expect(result.count).to eq(0) + expect(load_tags({ search: 'hey' }).count).to eq(0) end it 'filters tags by name that begins with' do - params = { search: '^v1.0' } - tags_finder = described_class.new(repository, params) - - result = tags_finder.execute + result = load_tags({ search: '^v1.0' }) expect(result.first.name).to eq('v1.0.0') expect(result.count).to eq(1) end it 'filters tags by name that ends with' do - params = { search: '0.0$' } - tags_finder = described_class.new(repository, params) - - result = tags_finder.execute + result = load_tags({ search: '0.0$' }) expect(result.first.name).to eq('v1.0.0') expect(result.count).to eq(1) end it 'filters tags by nonexistent name that begins with' do - params = { search: '^nope' } - tags_finder = described_class.new(repository, params) - - result = tags_finder.execute + result = load_tags({ search: '^nope' }) expect(result.count).to eq(0) end it 'filters tags by nonexistent name that ends with' do - params = { search: 'nope$' } - tags_finder = described_class.new(repository, params) - - result = tags_finder.execute - + result = load_tags({ search: 'nope$' }) expect(result.count).to eq(0) end end @@ -97,7 +80,7 @@ RSpec.describe TagsFinder do context 'filter and sort' do let(:tags_to_compare) { %w[v1.0.0 v1.1.0] } - subject { described_class.new(repository, params).execute.select { |tag| tags_to_compare.include?(tag.name) } } + subject { load_tags(params).select { |tag| tags_to_compare.include?(tag.name) } } context 'when sort by updated_desc' do let(:params) { { sort: 'updated_desc', search: 'v1' } } @@ -117,5 +100,17 @@ RSpec.describe TagsFinder do end end end + + context 'when Gitaly is unavailable' do + it 'returns empty list of tags' do + expect(Gitlab::GitalyClient).to receive(:call).and_raise(GRPC::Unavailable) + + tags_finder = described_class.new(repository, {}) + tags, error = tags_finder.execute + + expect(error).to be_a(Gitlab::Git::CommandError) + expect(tags).to eq([]) + end + end end end |