diff options
Diffstat (limited to 'spec/finders')
-rw-r--r-- | spec/finders/clusters_finder_spec.rb | 1 | ||||
-rw-r--r-- | spec/finders/deployments_finder_spec.rb | 97 | ||||
-rw-r--r-- | spec/finders/group_descendants_finder_spec.rb | 1 | ||||
-rw-r--r-- | spec/finders/group_members_finder_spec.rb | 38 | ||||
-rw-r--r-- | spec/finders/group_projects_finder_spec.rb | 18 | ||||
-rw-r--r-- | spec/finders/groups_finder_spec.rb | 2 | ||||
-rw-r--r-- | spec/finders/issues_finder_spec.rb | 1 | ||||
-rw-r--r-- | spec/finders/jobs_finder_spec.rb | 89 | ||||
-rw-r--r-- | spec/finders/keys_finder_spec.rb | 148 | ||||
-rw-r--r-- | spec/finders/members_finder_spec.rb | 50 | ||||
-rw-r--r-- | spec/finders/merge_request_target_project_finder_spec.rb | 17 | ||||
-rw-r--r-- | spec/finders/personal_access_tokens_finder_spec.rb | 10 | ||||
-rw-r--r-- | spec/finders/pipelines_finder_spec.rb | 73 | ||||
-rw-r--r-- | spec/finders/projects_finder_spec.rb | 2 | ||||
-rw-r--r-- | spec/finders/snippets_finder_spec.rb | 87 | ||||
-rw-r--r-- | spec/finders/tags_finder_spec.rb | 1 | ||||
-rw-r--r-- | spec/finders/user_finder_spec.rb | 22 |
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 |