diff options
author | Kamil Trzciński <ayufan@ayufan.eu> | 2019-03-06 16:03:32 +0300 |
---|---|---|
committer | Kamil Trzciński <ayufan@ayufan.eu> | 2019-03-06 16:03:32 +0300 |
commit | 81a0cc251bb5dc6e66b03b8bb224f2779e15a851 (patch) | |
tree | ee8c5a968ef23c07e7dcc0271c999854061766c6 | |
parent | dbd245c8bdd753b0ebe20bea9aba2bb112c3e281 (diff) | |
parent | 50776d2d298c3b6c98e2531f116ca43ba10dcda4 (diff) |
Merge branch 'expose-merge-request-entity-for-pipelines' into 'master'
Expose merge request entity for pipelines
See merge request gitlab-org/gitlab-ce!25679
-rw-r--r-- | app/presenters/merge_request_presenter.rb | 6 | ||||
-rw-r--r-- | app/serializers/merge_request_for_pipeline_entity.rb | 17 | ||||
-rw-r--r-- | app/serializers/pipeline_entity.rb | 10 | ||||
-rw-r--r-- | app/serializers/pipeline_serializer.rb | 1 | ||||
-rw-r--r-- | changelogs/unreleased/expose-merge-request-entity-for-pipelines.yml | 5 | ||||
-rw-r--r-- | spec/presenters/merge_request_presenter_spec.rb | 23 | ||||
-rw-r--r-- | spec/serializers/merge_request_for_pipeline_entity_spec.rb | 29 | ||||
-rw-r--r-- | spec/serializers/pipeline_entity_spec.rb | 45 | ||||
-rw-r--r-- | spec/serializers/pipeline_serializer_spec.rb | 38 |
9 files changed, 174 insertions, 0 deletions
diff --git a/app/presenters/merge_request_presenter.rb b/app/presenters/merge_request_presenter.rb index c59e73f824c..af164858408 100644 --- a/app/presenters/merge_request_presenter.rb +++ b/app/presenters/merge_request_presenter.rb @@ -98,6 +98,12 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated end end + def target_branch_path + if target_branch_exists? + project_branch_path(project, target_branch) + end + end + def source_branch_path if source_branch_exists? project_branch_path(source_project, source_branch) diff --git a/app/serializers/merge_request_for_pipeline_entity.rb b/app/serializers/merge_request_for_pipeline_entity.rb new file mode 100644 index 00000000000..7779ddfd65a --- /dev/null +++ b/app/serializers/merge_request_for_pipeline_entity.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class MergeRequestForPipelineEntity < Grape::Entity + include RequestAwareEntity + + expose :iid + + expose :path do |merge_request| + project_merge_request_path(merge_request.project, merge_request) + end + + expose :title + expose :source_branch + expose :source_branch_path + expose :target_branch + expose :target_branch_path +end diff --git a/app/serializers/pipeline_entity.rb b/app/serializers/pipeline_entity.rb index c2990cb5159..5ac1e590d39 100644 --- a/app/serializers/pipeline_entity.rb +++ b/app/serializers/pipeline_entity.rb @@ -28,6 +28,7 @@ class PipelineEntity < Grape::Entity expose :can_retry?, as: :retryable expose :can_cancel?, as: :cancelable expose :failure_reason?, as: :failure_reason + expose :detached_merge_request_pipeline?, as: :detached end expose :details do @@ -36,6 +37,10 @@ class PipelineEntity < Grape::Entity expose :finished_at end + expose :merge_request, if: -> (*) { has_presentable_merge_request? }, with: MergeRequestForPipelineEntity do |pipeline| + pipeline.merge_request.present(current_user: request.current_user) + end + expose :ref do expose :name do |pipeline| pipeline.ref @@ -81,6 +86,11 @@ class PipelineEntity < Grape::Entity pipeline.cancelable? end + def has_presentable_merge_request? + pipeline.triggered_by_merge_request? && + can?(request.current_user, :read_merge_request, pipeline.merge_request) + end + def detailed_status pipeline.detailed_status(request.current_user) end diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb index 7451433a841..dbbeca9431d 100644 --- a/app/serializers/pipeline_serializer.rb +++ b/app/serializers/pipeline_serializer.rb @@ -15,6 +15,7 @@ class PipelineSerializer < BaseSerializer :manual_actions, :scheduled_actions, :artifacts, + :merge_request, { pending_builds: :project, project: [:route, { namespace: :route }], diff --git a/changelogs/unreleased/expose-merge-request-entity-for-pipelines.yml b/changelogs/unreleased/expose-merge-request-entity-for-pipelines.yml new file mode 100644 index 00000000000..e5cbc87ba24 --- /dev/null +++ b/changelogs/unreleased/expose-merge-request-entity-for-pipelines.yml @@ -0,0 +1,5 @@ +--- +title: Expose merge request entity for pipelines +merge_request: 25679 +author: +type: added diff --git a/spec/presenters/merge_request_presenter_spec.rb b/spec/presenters/merge_request_presenter_spec.rb index bafcddebbb7..02cefcbc916 100644 --- a/spec/presenters/merge_request_presenter_spec.rb +++ b/spec/presenters/merge_request_presenter_spec.rb @@ -392,6 +392,29 @@ describe MergeRequestPresenter do end end + describe '#target_branch_path' do + subject do + described_class.new(resource, current_user: user).target_branch_path + end + + context 'when target branch exists' do + it 'returns path' do + allow(resource).to receive(:target_branch_exists?) { true } + + is_expected + .to eq("/#{resource.source_project.full_path}/branches/#{resource.target_branch}") + end + end + + context 'when target branch does not exist' do + it 'returns nil' do + allow(resource).to receive(:target_branch_exists?) { false } + + is_expected.to be_nil + end + end + end + describe '#source_branch_with_namespace_link' do subject do described_class.new(resource, current_user: user).source_branch_with_namespace_link diff --git a/spec/serializers/merge_request_for_pipeline_entity_spec.rb b/spec/serializers/merge_request_for_pipeline_entity_spec.rb new file mode 100644 index 00000000000..e49b45bc7d7 --- /dev/null +++ b/spec/serializers/merge_request_for_pipeline_entity_spec.rb @@ -0,0 +1,29 @@ +require 'spec_helper' + +describe MergeRequestForPipelineEntity do + let(:project) { create(:project, :repository) } + let(:user) { create(:user) } + let(:request) { EntityRequest.new(project: project) } + let(:merge_request) { create(:merge_request, target_project: project, source_project: project) } + let(:presenter) { MergeRequestPresenter.new(merge_request, current_user: user) } + + let(:entity) do + described_class.new(presenter, request: request) + end + + before do + project.add_developer(user) + end + + context 'as json' do + subject { entity.as_json } + + it 'exposes needed attributes' do + expect(subject).to include( + :iid, :path, :title, + :source_branch, :source_branch_path, + :target_branch, :target_branch_path + ) + end + end +end diff --git a/spec/serializers/pipeline_entity_spec.rb b/spec/serializers/pipeline_entity_spec.rb index 774486dcb6d..11040862129 100644 --- a/spec/serializers/pipeline_entity_spec.rb +++ b/spec/serializers/pipeline_entity_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' describe PipelineEntity do + include Gitlab::Routing + set(:user) { create(:user) } let(:request) { double('request') } @@ -128,5 +130,48 @@ describe PipelineEntity do .to eq 'CI/CD YAML configuration error!' end end + + context 'when pipeline is detached merge request pipeline' do + let(:merge_request) { create(:merge_request, :with_merge_request_pipeline) } + let(:project) { merge_request.target_project } + let(:pipeline) { merge_request.merge_request_pipelines.first } + + it 'makes detached flag true' do + expect(subject[:flags][:detached]).to be_truthy + end + + context 'when user is a developer' do + before do + project.add_developer(user) + end + + it 'has merge request information' do + expect(subject[:merge_request][:iid]).to eq(merge_request.iid) + + expect(project_merge_request_path(project, merge_request)) + .to include(subject[:merge_request][:path]) + + expect(subject[:merge_request][:title]).to eq(merge_request.title) + + expect(subject[:merge_request][:source_branch]) + .to eq(merge_request.source_branch) + + expect(project_branch_path(project, merge_request.source_branch)) + .to include(subject[:merge_request][:source_branch_path]) + + expect(subject[:merge_request][:target_branch]) + .to eq(merge_request.target_branch) + + expect(project_branch_path(project, merge_request.target_branch)) + .to include(subject[:merge_request][:target_branch_path]) + end + end + + context 'when user is an external user' do + it 'has no merge request information' do + expect(subject[:merge_request]).to be_nil + end + end + end end end diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb index 2bdcb2a45f6..a21487938a0 100644 --- a/spec/serializers/pipeline_serializer_spec.rb +++ b/spec/serializers/pipeline_serializer_spec.rb @@ -97,6 +97,44 @@ describe PipelineSerializer do end end + context 'when there are pipelines for merge requests' do + let(:resource) { Ci::Pipeline.all } + + let!(:merge_request_1) do + create(:merge_request, + :with_merge_request_pipeline, + target_project: project, + target_branch: 'master', + source_project: project, + source_branch: 'feature-1') + end + + let!(:merge_request_2) do + create(:merge_request, + :with_merge_request_pipeline, + target_project: project, + target_branch: 'master', + source_project: project, + source_branch: 'feature-2') + end + + before do + project.add_developer(user) + end + + it 'includes merge requests information' do + expect(subject.all? { |entry| entry[:merge_request].present? }).to be_truthy + end + + it 'preloads related merge requests', :postgresql do + recorded = ActiveRecord::QueryRecorder.new { subject } + + expect(recorded.log) + .to include("SELECT \"merge_requests\".* FROM \"merge_requests\" " \ + "WHERE \"merge_requests\".\"id\" IN (#{merge_request_1.id}, #{merge_request_2.id})") + end + end + describe 'number of queries when preloaded' do subject { serializer.represent(resource, preload: true) } let(:resource) { Ci::Pipeline.all } |