summaryrefslogtreecommitdiff
path: root/spec/finders
diff options
context:
space:
mode:
Diffstat (limited to 'spec/finders')
-rw-r--r--spec/finders/clusters_finder_spec.rb1
-rw-r--r--spec/finders/deployments_finder_spec.rb97
-rw-r--r--spec/finders/group_descendants_finder_spec.rb1
-rw-r--r--spec/finders/group_members_finder_spec.rb38
-rw-r--r--spec/finders/group_projects_finder_spec.rb18
-rw-r--r--spec/finders/groups_finder_spec.rb2
-rw-r--r--spec/finders/issues_finder_spec.rb1
-rw-r--r--spec/finders/jobs_finder_spec.rb89
-rw-r--r--spec/finders/keys_finder_spec.rb148
-rw-r--r--spec/finders/members_finder_spec.rb50
-rw-r--r--spec/finders/merge_request_target_project_finder_spec.rb17
-rw-r--r--spec/finders/personal_access_tokens_finder_spec.rb10
-rw-r--r--spec/finders/pipelines_finder_spec.rb73
-rw-r--r--spec/finders/projects_finder_spec.rb2
-rw-r--r--spec/finders/snippets_finder_spec.rb87
-rw-r--r--spec/finders/tags_finder_spec.rb1
-rw-r--r--spec/finders/user_finder_spec.rb22
17 files changed, 583 insertions, 74 deletions
diff --git a/spec/finders/clusters_finder_spec.rb b/spec/finders/clusters_finder_spec.rb
index f6ea8347f67..5dde616f679 100644
--- a/spec/finders/clusters_finder_spec.rb
+++ b/spec/finders/clusters_finder_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
describe ClustersFinder do
let(:project) { create(:project) }
+
set(:user) { create(:user) }
describe '#execute' do
diff --git a/spec/finders/deployments_finder_spec.rb b/spec/finders/deployments_finder_spec.rb
new file mode 100644
index 00000000000..be35a705b0d
--- /dev/null
+++ b/spec/finders/deployments_finder_spec.rb
@@ -0,0 +1,97 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe DeploymentsFinder do
+ subject { described_class.new(project, params).execute }
+
+ let(:project) { create(:project, :public, :repository) }
+ let(:params) { {} }
+
+ describe "#execute" do
+ it 'returns all deployments by default' do
+ deployments = create_list(:deployment, 2, :success, project: project)
+ is_expected.to match_array(deployments)
+ end
+
+ describe 'filtering' do
+ context 'when updated_at filters are specified' do
+ let(:params) { { updated_before: 1.day.ago, updated_after: 3.days.ago } }
+ let!(:deployment_1) { create(:deployment, :success, project: project, updated_at: 2.days.ago) }
+ let!(:deployment_2) { create(:deployment, :success, project: project, updated_at: 4.days.ago) }
+ let!(:deployment_3) { create(:deployment, :success, project: project, updated_at: 1.hour.ago) }
+
+ it 'returns deployments with matched updated_at' do
+ is_expected.to match_array([deployment_1])
+ end
+ end
+ end
+
+ describe 'ordering' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:params) { { order_by: order_by, sort: sort } }
+
+ let!(:deployment_1) { create(:deployment, :success, project: project, iid: 11, ref: 'master', created_at: 2.days.ago, updated_at: Time.now) }
+ let!(:deployment_2) { create(:deployment, :success, project: project, iid: 12, ref: 'feature', created_at: 1.day.ago, updated_at: 2.hours.ago) }
+ let!(:deployment_3) { create(:deployment, :success, project: project, iid: 8, ref: 'patch', created_at: Time.now, updated_at: 1.hour.ago) }
+
+ 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_3, :deployment_1, :deployment_2]
+ 'iid' | 'desc' | [:deployment_2, :deployment_1, :deployment_3]
+ 'ref' | 'asc' | [:deployment_2, :deployment_1, :deployment_3]
+ 'ref' | 'desc' | [:deployment_3, :deployment_1, :deployment_2]
+ 'updated_at' | 'asc' | [:deployment_2, :deployment_3, :deployment_1]
+ 'updated_at' | 'desc' | [:deployment_1, :deployment_3, :deployment_2]
+ 'invalid' | 'asc' | [:deployment_1, :deployment_2, :deployment_3]
+ 'iid' | 'err' | [:deployment_3, :deployment_1, :deployment_2]
+ end
+
+ with_them do
+ it 'returns the deployments ordered' do
+ expect(subject).to eq(ordered_deployments.map { |name| public_send(name) })
+ end
+ end
+ end
+
+ describe 'transform `created_at` sorting to `id` sorting' do
+ let(:params) { { order_by: 'created_at', sort: 'asc' } }
+
+ it 'sorts by only one column' do
+ expect(subject.order_values.size).to eq(1)
+ end
+
+ it 'sorts by `id`' do
+ expect(subject.order_values.first.to_sql).to eq(Deployment.arel_table[:id].asc.to_sql)
+ end
+ end
+
+ describe 'tie-breaker for `updated_at` sorting' do
+ let(:params) { { order_by: 'updated_at', sort: 'asc' } }
+
+ it 'sorts by two columns' do
+ expect(subject.order_values.size).to eq(2)
+ end
+
+ it 'adds `id` sorting as the second order column' do
+ order_value = subject.order_values[1]
+
+ expect(order_value.to_sql).to eq(Deployment.arel_table[:id].desc.to_sql)
+ end
+
+ it 'uses the `id DESC` as tie-breaker when ordering' do
+ updated_at = Time.now
+
+ deployment_1 = create(:deployment, :success, project: project, updated_at: updated_at)
+ deployment_2 = create(:deployment, :success, project: project, updated_at: updated_at)
+ deployment_3 = create(:deployment, :success, project: project, updated_at: updated_at)
+
+ expect(subject).to eq([deployment_3, deployment_2, deployment_1])
+ end
+ end
+ end
+end
diff --git a/spec/finders/group_descendants_finder_spec.rb b/spec/finders/group_descendants_finder_spec.rb
index 17875a9b9ab..ee8606e474e 100644
--- a/spec/finders/group_descendants_finder_spec.rb
+++ b/spec/finders/group_descendants_finder_spec.rb
@@ -6,6 +6,7 @@ describe GroupDescendantsFinder do
let(:user) { create(:user) }
let(:group) { create(:group) }
let(:params) { {} }
+
subject(:finder) do
described_class.new(current_user: user, parent_group: group, params: params)
end
diff --git a/spec/finders/group_members_finder_spec.rb b/spec/finders/group_members_finder_spec.rb
index 08f3b4024b3..f161a1df9c3 100644
--- a/spec/finders/group_members_finder_spec.rb
+++ b/spec/finders/group_members_finder_spec.rb
@@ -3,12 +3,13 @@
require 'spec_helper'
describe GroupMembersFinder, '#execute' do
- let(:group) { create(:group) }
+ let(:group) { create(:group) }
let(:nested_group) { create(:group, parent: group) }
- let(:user1) { create(:user) }
- let(:user2) { create(:user) }
- let(:user3) { create(:user) }
- let(:user4) { create(:user) }
+ let(:deeper_nested_group) { create(:group, parent: nested_group) }
+ let(:user1) { create(:user) }
+ let(:user2) { create(:user) }
+ let(:user3) { create(:user) }
+ let(:user4) { create(:user) }
it 'returns members for top-level group' do
member1 = group.add_maintainer(user1)
@@ -20,7 +21,7 @@ describe GroupMembersFinder, '#execute' do
expect(result.to_a).to match_array([member3, member2, member1])
end
- it 'returns members for nested group' do
+ it 'returns members & inherited members for nested group by default' do
group.add_developer(user2)
nested_group.request_access(user4)
member1 = group.add_maintainer(user1)
@@ -32,6 +33,29 @@ describe GroupMembersFinder, '#execute' do
expect(result.to_a).to match_array([member1, member3, member4])
end
+ it 'does not return inherited members for nested group if requested' do
+ group.add_maintainer(user1)
+ group.add_developer(user2)
+ member2 = nested_group.add_maintainer(user2)
+ member3 = nested_group.add_maintainer(user3)
+
+ result = described_class.new(nested_group).execute(include_relations: [:direct])
+
+ expect(result.to_a).to match_array([member2, member3])
+ end
+
+ it 'returns only inherited members for nested group if requested' do
+ group.add_developer(user2)
+ nested_group.request_access(user4)
+ member1 = group.add_maintainer(user1)
+ nested_group.add_maintainer(user2)
+ nested_group.add_maintainer(user3)
+
+ result = described_class.new(nested_group).execute(include_relations: [:inherited])
+
+ expect(result.to_a).to match_array([member1])
+ end
+
it 'returns members for descendant groups if requested' do
member1 = group.add_maintainer(user2)
member2 = group.add_maintainer(user1)
@@ -39,7 +63,7 @@ describe GroupMembersFinder, '#execute' do
member3 = nested_group.add_maintainer(user3)
member4 = nested_group.add_maintainer(user4)
- result = described_class.new(group).execute(include_descendants: true)
+ result = described_class.new(group).execute(include_relations: [:direct, :descendants])
expect(result.to_a).to match_array([member1, member2, member3, member4])
end
diff --git a/spec/finders/group_projects_finder_spec.rb b/spec/finders/group_projects_finder_spec.rb
index b291b5d4b90..89fc1e380dc 100644
--- a/spec/finders/group_projects_finder_spec.rb
+++ b/spec/finders/group_projects_finder_spec.rb
@@ -132,11 +132,13 @@ describe GroupProjectsFinder do
context "only shared" do
let(:options) { { only_shared: true } }
+
it { is_expected.to eq([shared_project_3, shared_project_2, shared_project_1]) }
end
context "only owned" do
let(:options) { { only_owned: true } }
+
it { is_expected.to eq([private_project, public_project]) }
end
@@ -168,4 +170,20 @@ describe GroupProjectsFinder do
end
end
end
+
+ describe 'limiting' do
+ context 'without limiting' do
+ it 'returns all projects' do
+ expect(subject.count).to eq(3)
+ end
+ end
+
+ context 'with limiting' do
+ let(:options) { { limit: 1 } }
+
+ it 'returns only the number of projects specified by the limit' do
+ expect(subject.count).to eq(1)
+ end
+ end
+ end
end
diff --git a/spec/finders/groups_finder_spec.rb b/spec/finders/groups_finder_spec.rb
index 741a89a270b..939b818f165 100644
--- a/spec/finders/groups_finder_spec.rb
+++ b/spec/finders/groups_finder_spec.rb
@@ -111,6 +111,7 @@ describe GroupsFinder do
context 'authorized to private project' do
context 'project one level deep' do
let!(:subproject) { create(:project, :private, namespace: private_subgroup) }
+
before do
subproject.add_guest(user)
end
@@ -129,6 +130,7 @@ describe GroupsFinder do
context 'project two levels deep' do
let!(:private_subsubgroup) { create(:group, :private, parent: private_subgroup) }
let!(:subsubproject) { create(:project, :private, namespace: private_subsubgroup) }
+
before do
subsubproject.add_guest(user)
end
diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb
index 6c10a617279..c52ee89006b 100644
--- a/spec/finders/issues_finder_spec.rb
+++ b/spec/finders/issues_finder_spec.rb
@@ -786,6 +786,7 @@ describe IssuesFinder do
describe '#with_confidentiality_access_check' do
let(:guest) { create(:user) }
+
set(:authorized_user) { create(:user) }
set(:project) { create(:project, namespace: authorized_user.namespace) }
set(:public_issue) { create(:issue, project: project) }
diff --git a/spec/finders/jobs_finder_spec.rb b/spec/finders/jobs_finder_spec.rb
new file mode 100644
index 00000000000..675d170b90e
--- /dev/null
+++ b/spec/finders/jobs_finder_spec.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe JobsFinder, '#execute' do
+ set(:user) { create(:user) }
+ set(:admin) { create(:user, :admin) }
+ set(:project) { create(:project, :private, public_builds: false) }
+ set(:pipeline) { create(:ci_pipeline, project: project) }
+ set(:job_1) { create(:ci_build) }
+ set(:job_2) { create(:ci_build, :running) }
+ set(:job_3) { create(:ci_build, :success, pipeline: pipeline) }
+
+ let(:params) { {} }
+
+ context 'no project' do
+ subject { described_class.new(current_user: admin, params: params).execute }
+
+ it 'returns all jobs' do
+ expect(subject).to match_array([job_1, job_2, job_3])
+ end
+
+ context 'non admin user' do
+ let(:admin) { user }
+
+ it 'returns no jobs' do
+ expect(subject).to be_empty
+ end
+ end
+
+ context 'without user' do
+ let(:admin) { nil }
+
+ it 'returns no jobs' do
+ expect(subject).to be_empty
+ end
+ end
+
+ context 'scope is present' do
+ let(:jobs) { [job_1, job_2, job_3] }
+
+ where(:scope, :index) do
+ [
+ ['pending', 0],
+ ['running', 1],
+ ['finished', 2]
+ ]
+ end
+
+ with_them do
+ let(:params) { { scope: scope } }
+
+ it { expect(subject).to match_array([jobs[index]]) }
+ end
+ end
+ end
+
+ context 'a project is present' do
+ subject { described_class.new(current_user: user, project: project, params: params).execute }
+
+ context 'user has access to the project' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'returns jobs for the specified project' do
+ expect(subject).to match_array([job_3])
+ end
+ end
+
+ context 'user has no access to project builds' do
+ before do
+ project.add_guest(user)
+ end
+
+ it 'returns no jobs' do
+ expect(subject).to be_empty
+ end
+ end
+
+ context 'without user' do
+ let(:user) { nil }
+
+ it 'returns no jobs' do
+ expect(subject).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/finders/keys_finder_spec.rb b/spec/finders/keys_finder_spec.rb
new file mode 100644
index 00000000000..f80abdcdb38
--- /dev/null
+++ b/spec/finders/keys_finder_spec.rb
@@ -0,0 +1,148 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe KeysFinder do
+ subject { described_class.new(user, params).execute }
+
+ let(:user) { create(:user) }
+ let(:params) { {} }
+
+ let!(:key_1) do
+ create(:personal_key,
+ last_used_at: 7.days.ago,
+ user: user,
+ key: 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt1016k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=',
+ fingerprint: 'ba:81:59:68:d7:6c:cd:02:02:bf:6a:9b:55:4e:af:d1',
+ fingerprint_sha256: 'nUhzNyftwADy8AH3wFY31tAKs7HufskYTte2aXo/lCg')
+ end
+
+ let!(:key_2) { create(:personal_key, last_used_at: nil, user: user) }
+ let!(:key_3) { create(:personal_key, last_used_at: 2.days.ago) }
+
+ context 'with a regular user' do
+ it 'raises GitLabAccessDeniedError' do
+ expect { subject }.to raise_error(KeysFinder::GitLabAccessDeniedError)
+ end
+ end
+
+ context 'with an admin user' do
+ let(:user) {create(:admin)}
+
+ context 'key_type' do
+ let!(:deploy_key) { create(:deploy_key) }
+
+ context 'when `key_type` is `ssh`' do
+ before do
+ params[:key_type] = 'ssh'
+ end
+
+ it 'returns only SSH keys' do
+ expect(subject).to contain_exactly(key_1, key_2, key_3)
+ end
+ end
+
+ context 'when `key_type` is not specified' do
+ it 'returns all types of keys' do
+ expect(subject).to contain_exactly(key_1, key_2, key_3, deploy_key)
+ end
+ end
+ end
+
+ context 'fingerprint' do
+ context 'with invalid fingerprint' do
+ context 'with invalid MD5 fingerprint' do
+ before do
+ params[:fingerprint] = '11:11:11:11'
+ end
+
+ it 'raises InvalidFingerprint' do
+ expect { subject }.to raise_error(KeysFinder::InvalidFingerprint)
+ end
+ end
+
+ context 'with invalid SHA fingerprint' do
+ before do
+ params[:fingerprint] = 'nUhzNyftwAAKs7HufskYTte2g'
+ end
+
+ it 'raises InvalidFingerprint' do
+ expect { subject }.to raise_error(KeysFinder::InvalidFingerprint)
+ end
+ end
+ end
+
+ context 'with valid fingerprints' do
+ context 'with valid MD5 params' do
+ context 'with an existent fingerprint' do
+ before do
+ params[:fingerprint] = 'ba:81:59:68:d7:6c:cd:02:02:bf:6a:9b:55:4e:af:d1'
+ end
+
+ it 'returns the key' do
+ expect(subject).to eq(key_1)
+ expect(subject.user).to eq(user)
+ end
+ end
+
+ context 'with a non-existent fingerprint' do
+ before do
+ params[:fingerprint] = 'bb:81:59:68:d7:6c:cd:02:02:bf:6a:9b:55:4e:af:d2'
+ end
+
+ it 'returns nil' do
+ expect(subject).to be_nil
+ end
+ end
+ end
+
+ context 'with valid SHA256 params' do
+ context 'with an existent fingerprint' do
+ before do
+ params[:fingerprint] = 'SHA256:nUhzNyftwADy8AH3wFY31tAKs7HufskYTte2aXo/lCg'
+ end
+
+ it 'returns key' do
+ expect(subject).to eq(key_1)
+ expect(subject.user).to eq(user)
+ end
+ end
+
+ context 'with a non-existent fingerprint' do
+ before do
+ params[:fingerprint] = 'SHA256:xTjuFqftwADy8AH3wFY31tAKs7HufskYTte2aXi/mNp'
+ end
+
+ it 'returns nil' do
+ expect(subject).to be_nil
+ end
+ end
+ end
+ end
+ end
+
+ context 'user' do
+ context 'without user' do
+ it 'contains ssh_keys of all users in the system' do
+ expect(subject).to contain_exactly(key_1, key_2, key_3)
+ end
+ end
+
+ context 'with user' do
+ before do
+ params[:user] = user
+ end
+
+ it 'contains ssh_keys of only the specified users' do
+ expect(subject).to contain_exactly(key_1, key_2)
+ end
+ end
+ end
+
+ context 'sort order' do
+ it 'sorts in last_used_at_desc order' do
+ expect(subject).to eq([key_3, key_1, key_2])
+ end
+ end
+ end
+end
diff --git a/spec/finders/members_finder_spec.rb b/spec/finders/members_finder_spec.rb
index f9b8fee6f2d..2bc37606a25 100644
--- a/spec/finders/members_finder_spec.rb
+++ b/spec/finders/members_finder_spec.rb
@@ -22,22 +22,64 @@ describe MembersFinder, '#execute' do
expect(result).to contain_exactly(member1, member2, member3)
end
+ it 'includes only non-invite members if user do not have amdin permissions on project' do
+ create(:project_member, :invited, project: project, invite_email: create(:user).email)
+ member1 = project.add_maintainer(user1)
+ member2 = project.add_developer(user2)
+
+ result = described_class.new(project, user2).execute(include_relations: [:direct])
+
+ expect(result).to contain_exactly(member1, member2)
+ end
+
+ it 'includes invited members if user have admin permissions on project' do
+ member_invite = create(:project_member, :invited, project: project, invite_email: create(:user).email)
+ member1 = project.add_maintainer(user1)
+ member2 = project.add_maintainer(user2)
+
+ result = described_class.new(project, user2).execute(include_relations: [:direct])
+
+ expect(result).to contain_exactly(member1, member2, member_invite)
+ end
+
it 'includes nested group members if asked', :nested_groups do
nested_group.request_access(user1)
member1 = group.add_maintainer(user2)
member2 = nested_group.add_maintainer(user3)
member3 = project.add_maintainer(user4)
- result = described_class.new(project, user2).execute(include_descendants: true)
+ result = described_class.new(project, user2).execute(include_relations: [:direct, :descendants])
expect(result).to contain_exactly(member1, member2, member3)
end
+ it 'returns only members of project if asked' do
+ nested_group.request_access(user1)
+ group.add_maintainer(user2)
+ nested_group.add_maintainer(user3)
+ member4 = project.add_maintainer(user4)
+
+ result = described_class.new(project, user2).execute(include_relations: [:direct])
+
+ expect(result).to contain_exactly(member4)
+ end
+
+ it 'returns only inherited members of project if asked' do
+ nested_group.request_access(user1)
+ member2 = group.add_maintainer(user2)
+ member3 = nested_group.add_maintainer(user3)
+ project.add_maintainer(user4)
+
+ result = described_class.new(project, user2).execute(include_relations: [:inherited])
+
+ expect(result).to contain_exactly(member2, member3)
+ end
+
it 'returns the members.access_level when the user is invited', :nested_groups do
member_invite = create(:project_member, :invited, project: project, invite_email: create(:user).email)
member1 = group.add_maintainer(user2)
- result = described_class.new(project, user2).execute(include_descendants: true)
+ result = described_class.new(project, user2).execute(include_relations: [:direct, :descendants])
expect(result).to contain_exactly(member1, member_invite)
expect(result.last.access_level).to eq(member_invite.access_level)
@@ -48,14 +90,14 @@ describe MembersFinder, '#execute' do
group.add_developer(user1)
nested_group.add_reporter(user1)
- result = described_class.new(project, user1).execute(include_descendants: true)
+ result = described_class.new(project, user1).execute(include_relations: [:direct, :descendants])
expect(result).to contain_exactly(member1)
expect(result.first.access_level).to eq(Gitlab::Access::DEVELOPER)
end
context 'when include_invited_groups_members == true' do
- subject { described_class.new(project, user2).execute(include_invited_groups_members: true) }
+ subject { described_class.new(project, user2).execute(include_relations: [:inherited, :direct, :invited_groups_members]) }
set(:linked_group) { create(:group, :public) }
set(:nested_linked_group) { create(:group, parent: linked_group) }
diff --git a/spec/finders/merge_request_target_project_finder_spec.rb b/spec/finders/merge_request_target_project_finder_spec.rb
index 1d78b7ba4e3..4d2e4c5318c 100644
--- a/spec/finders/merge_request_target_project_finder_spec.rb
+++ b/spec/finders/merge_request_target_project_finder_spec.rb
@@ -6,6 +6,7 @@ describe MergeRequestTargetProjectFinder do
include ProjectForksHelper
let(:user) { create(:user) }
+
subject(:finder) { described_class.new(current_user: user, source_project: forked_project) }
shared_examples 'finding related projects' do
@@ -27,6 +28,22 @@ describe MergeRequestTargetProjectFinder do
expect(finder.execute).to contain_exactly(other_fork, forked_project)
end
+
+ it 'does not include routes by default' do
+ row = finder.execute.first
+
+ expect(row.association(:route).loaded?).to be_falsey
+ expect(row.association(:namespace).loaded?).to be_falsey
+ expect(row.namespace.association(:route).loaded?).to be_falsey
+ end
+
+ it 'includes routes when requested' do
+ row = finder.execute(include_routes: true).first
+
+ expect(row.association(:route).loaded?).to be_truthy
+ expect(row.association(:namespace).loaded?).to be_truthy
+ expect(row.namespace.association(:route).loaded?).to be_truthy
+ end
end
context 'public projects' do
diff --git a/spec/finders/personal_access_tokens_finder_spec.rb b/spec/finders/personal_access_tokens_finder_spec.rb
index a44daf585ba..ce8ef80bb99 100644
--- a/spec/finders/personal_access_tokens_finder_spec.rb
+++ b/spec/finders/personal_access_tokens_finder_spec.rb
@@ -26,6 +26,16 @@ describe PersonalAccessTokensFinder do
revoked_impersonation_token, expired_impersonation_token)
end
+ describe 'with sort order' do
+ before do
+ params[:sort] = 'id_asc'
+ end
+
+ it 'sorts records as per the specified sort order' do
+ expect(subject).to match_array(PersonalAccessToken.all.order(id: :asc))
+ end
+ end
+
describe 'without impersonation' do
before do
params[:impersonation] = false
diff --git a/spec/finders/pipelines_finder_spec.rb b/spec/finders/pipelines_finder_spec.rb
index 05d13a76e0e..c8a4ea799c3 100644
--- a/spec/finders/pipelines_finder_spec.rb
+++ b/spec/finders/pipelines_finder_spec.rb
@@ -6,6 +6,7 @@ describe PipelinesFinder do
let(:project) { create(:project, :public, :repository) }
let(:current_user) { nil }
let(:params) { {} }
+
subject { described_class.new(project, current_user, params).execute }
describe "#execute" do
@@ -170,41 +171,14 @@ describe PipelinesFinder do
end
end
- context 'when order_by and sort are specified' do
- context 'when order_by user_id' do
- let(:params) { { order_by: 'user_id', sort: 'asc' } }
- let(:users) { Array.new(2) { create(:user, developer_projects: [project]) } }
- let!(:pipelines) { users.map { |user| create(:ci_pipeline, project: project, user: user) } }
-
- it 'sorts as user_id: :asc' do
- is_expected.to match_array(pipelines)
- end
-
- context 'when sort is invalid' do
- let(:params) { { order_by: 'user_id', sort: 'invalid_sort' } }
-
- it 'sorts as user_id: :desc' do
- is_expected.to eq(pipelines.sort_by { |p| -p.user.id })
- end
- end
- end
-
- context 'when order_by is invalid' do
- let(:params) { { order_by: 'invalid_column', sort: 'asc' } }
- let!(:pipelines) { create_list(:ci_pipeline, 2, project: project) }
+ context 'when updated_at filters are specified' do
+ let(:params) { { updated_before: 1.day.ago, updated_after: 3.days.ago } }
+ let!(:pipeline1) { create(:ci_pipeline, project: project, updated_at: 2.days.ago) }
+ let!(:pipeline2) { create(:ci_pipeline, project: project, updated_at: 4.days.ago) }
+ let!(:pipeline3) { create(:ci_pipeline, project: project, updated_at: 1.hour.ago) }
- it 'sorts as id: :asc' do
- is_expected.to eq(pipelines.sort_by { |p| p.id })
- end
- end
-
- context 'when both are nil' do
- let(:params) { { order_by: nil, sort: nil } }
- let!(:pipelines) { create_list(:ci_pipeline, 2, project: project) }
-
- it 'sorts as id: :desc' do
- is_expected.to eq(pipelines.sort_by { |p| -p.id })
- end
+ it 'returns deployments with matched updated_at' do
+ is_expected.to match_array([pipeline1])
end
end
@@ -249,5 +223,36 @@ describe PipelinesFinder do
end
end
end
+
+ describe 'ordering' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:params) { { order_by: order_by, sort: sort } }
+
+ let!(:pipeline_1) { create(:ci_pipeline, :scheduled, project: project, iid: 11, ref: 'master', created_at: Time.now, updated_at: Time.now, user: create(:user)) }
+ let!(:pipeline_2) { create(:ci_pipeline, :created, project: project, iid: 12, ref: 'feature', created_at: 1.day.ago, updated_at: 2.hours.ago, user: create(:user)) }
+ let!(:pipeline_3) { create(:ci_pipeline, :success, project: project, iid: 8, ref: 'patch', created_at: 2.days.ago, updated_at: 1.hour.ago, user: create(:user)) }
+
+ where(:order_by, :sort, :ordered_pipelines) do
+ 'id' | 'asc' | [:pipeline_1, :pipeline_2, :pipeline_3]
+ 'id' | 'desc' | [:pipeline_3, :pipeline_2, :pipeline_1]
+ 'ref' | 'asc' | [:pipeline_2, :pipeline_1, :pipeline_3]
+ 'ref' | 'desc' | [:pipeline_3, :pipeline_1, :pipeline_2]
+ 'status' | 'asc' | [:pipeline_2, :pipeline_1, :pipeline_3]
+ 'status' | 'desc' | [:pipeline_3, :pipeline_1, :pipeline_2]
+ 'updated_at' | 'asc' | [:pipeline_2, :pipeline_3, :pipeline_1]
+ 'updated_at' | 'desc' | [:pipeline_1, :pipeline_3, :pipeline_2]
+ 'user_id' | 'asc' | [:pipeline_1, :pipeline_2, :pipeline_3]
+ 'user_id' | 'desc' | [:pipeline_3, :pipeline_2, :pipeline_1]
+ 'invalid' | 'asc' | [:pipeline_1, :pipeline_2, :pipeline_3]
+ 'id' | 'err' | [:pipeline_3, :pipeline_2, :pipeline_1]
+ end
+
+ with_them do
+ it 'returns the pipelines ordered' do
+ expect(subject).to eq(ordered_pipelines.map { |name| public_send(name) })
+ end
+ end
+ end
end
end
diff --git a/spec/finders/projects_finder_spec.rb b/spec/finders/projects_finder_spec.rb
index a9344cd593a..bf97e3cf7db 100644
--- a/spec/finders/projects_finder_spec.rb
+++ b/spec/finders/projects_finder_spec.rb
@@ -181,6 +181,7 @@ describe ProjectsFinder, :do_not_mock_admin_mode do
describe 'filter by non_public' do
let(:params) { { non_public: true } }
+
before do
private_project.add_developer(current_user)
end
@@ -190,6 +191,7 @@ describe ProjectsFinder, :do_not_mock_admin_mode do
describe 'filter by starred' do
let(:params) { { starred: true } }
+
before do
current_user.toggle_star(public_project)
end
diff --git a/spec/finders/snippets_finder_spec.rb b/spec/finders/snippets_finder_spec.rb
index bcb762664f7..8f83cb77709 100644
--- a/spec/finders/snippets_finder_spec.rb
+++ b/spec/finders/snippets_finder_spec.rb
@@ -60,10 +60,20 @@ describe SnippetsFinder do
end
context 'filter by author' do
- it 'returns all public and internal snippets' do
- snippets = described_class.new(create(:user), author: user).execute
+ context 'when the author is a User object' do
+ it 'returns all public and internal snippets' do
+ snippets = described_class.new(create(:user), author: user).execute
- expect(snippets).to contain_exactly(internal_personal_snippet, public_personal_snippet)
+ expect(snippets).to contain_exactly(internal_personal_snippet, public_personal_snippet)
+ end
+ end
+
+ context 'when the author is the User id' do
+ it 'returns all public and internal snippets' do
+ snippets = described_class.new(create(:user), author: user.id).execute
+
+ expect(snippets).to contain_exactly(internal_personal_snippet, public_personal_snippet)
+ end
end
it 'returns internal snippets' do
@@ -101,13 +111,33 @@ describe SnippetsFinder do
expect(snippets).to contain_exactly(private_personal_snippet, internal_personal_snippet, public_personal_snippet)
end
+
+ context 'when author is not valid' do
+ it 'returns quickly' do
+ finder = described_class.new(admin, author: 1234)
+
+ expect(finder).not_to receive(:init_collection)
+ expect(Snippet).to receive(:none).and_call_original
+ expect(finder.execute).to be_empty
+ end
+ end
end
- context 'project snippets' do
- it 'returns public personal and project snippets for unauthorized user' do
- snippets = described_class.new(nil, project: project).execute
+ context 'filter by project' do
+ context 'when project is a Project object' do
+ it 'returns public personal and project snippets for unauthorized user' do
+ snippets = described_class.new(nil, project: project).execute
- expect(snippets).to contain_exactly(public_project_snippet)
+ expect(snippets).to contain_exactly(public_project_snippet)
+ end
+ end
+
+ context 'when project is a Project id' do
+ it 'returns public personal and project snippets for unauthorized user' do
+ snippets = described_class.new(nil, project: project.id).execute
+
+ expect(snippets).to contain_exactly(public_project_snippet)
+ end
end
it 'returns public and internal snippets for non project members' do
@@ -175,6 +205,49 @@ describe SnippetsFinder do
)
end
end
+
+ context 'when project is not valid' do
+ it 'returns quickly' do
+ finder = described_class.new(admin, project: 1234)
+
+ expect(finder).not_to receive(:init_collection)
+ expect(Snippet).to receive(:none).and_call_original
+ expect(finder.execute).to be_empty
+ end
+ end
+ end
+
+ context 'filter by snippet type' do
+ context 'when filtering by only_personal snippet' do
+ it 'returns only personal snippet' do
+ snippets = described_class.new(admin, only_personal: true).execute
+
+ expect(snippets).to contain_exactly(private_personal_snippet,
+ internal_personal_snippet,
+ public_personal_snippet)
+ end
+ end
+
+ context 'when filtering by only_project snippet' do
+ it 'returns only project snippet' do
+ snippets = described_class.new(admin, only_project: true).execute
+
+ expect(snippets).to contain_exactly(private_project_snippet,
+ internal_project_snippet,
+ public_project_snippet)
+ end
+ end
+ end
+
+ context 'filtering by ids' do
+ it 'returns only personal snippet' do
+ snippets = described_class.new(
+ admin, ids: [private_personal_snippet.id,
+ internal_personal_snippet.id]
+ ).execute
+
+ expect(snippets).to contain_exactly(private_personal_snippet, internal_personal_snippet)
+ end
end
context 'explore snippets' do
diff --git a/spec/finders/tags_finder_spec.rb b/spec/finders/tags_finder_spec.rb
index 582d82bbf79..b9de2d29895 100644
--- a/spec/finders/tags_finder_spec.rb
+++ b/spec/finders/tags_finder_spec.rb
@@ -96,6 +96,7 @@ 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) } }
context 'when sort by updated_desc' do
diff --git a/spec/finders/user_finder_spec.rb b/spec/finders/user_finder_spec.rb
index c20d7850d68..b89b422aa2c 100644
--- a/spec/finders/user_finder_spec.rb
+++ b/spec/finders/user_finder_spec.rb
@@ -176,26 +176,4 @@ describe UserFinder do
end
end
end
-
- describe '#find_by_ssh_key_id' do
- let_it_be(:ssh_key) { create(:key, user: user) }
-
- it 'returns the user when passing the ssh key id' do
- found = described_class.new(ssh_key.id).find_by_ssh_key_id
-
- expect(found).to eq(user)
- end
-
- it 'returns the user when passing the ssh key id (string)' do
- found = described_class.new(ssh_key.id.to_s).find_by_ssh_key_id
-
- expect(found).to eq(user)
- end
-
- it 'returns nil when the id does not exist' do
- found = described_class.new(-1).find_by_ssh_key_id
-
- expect(found).to be_nil
- end
- end
end