From a5b24f8ea03aa7bd492094d75a6a1a990abd6d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Javier=20L=C3=B3pez?= Date: Thu, 22 Nov 2018 19:24:45 +0100 Subject: Create MergeRequestPipelinesFinder --- app/finders/merge_request_pipelines_finder.rb | 57 ++++++++++++++++++++++ app/models/merge_request.rb | 5 +- .../finders/merge_request_pipelines_finder_spec.rb | 29 +++++++++++ 3 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 app/finders/merge_request_pipelines_finder.rb create mode 100644 spec/finders/merge_request_pipelines_finder_spec.rb diff --git a/app/finders/merge_request_pipelines_finder.rb b/app/finders/merge_request_pipelines_finder.rb new file mode 100644 index 00000000000..40ff32a2d7f --- /dev/null +++ b/app/finders/merge_request_pipelines_finder.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +class MergeRequestPipelinesFinder + attr_reader :merge_request, :pipelines, :params + + ALLOWED_INDEXED_COLUMNS = %w[id status ref user_id].freeze + + def initialize(merge_request, params = {}) + @merge_request = merge_request + @pipelines = merge_request&.source_project&.pipelines + @params = params + end + + def execute + return Ci::Pipeline.none if pipelines.nil? + + items = with_source_branch_ref(pipelines) + items = by_sha(items) + sort_items(items) + end + + private + + # rubocop: disable CodeReuse/ActiveRecord + def by_sha(items) + if params[:sha].present? + items.where(sha: params[:sha]) + else + items + end + end + # rubocop: enable CodeReuse/ActiveRecord + + # rubocop: disable CodeReuse/ActiveRecord + def with_source_branch_ref(items) + items.where(ref: merge_request.source_branch) + end + # rubocop: enable CodeReuse/ActiveRecord + + # rubocop: disable CodeReuse/ActiveRecord + def sort_items(items) + order_by = if ALLOWED_INDEXED_COLUMNS.include?(params[:order_by]) + params[:order_by] + else + :id + end + + sort = if params[:sort] =~ /\A(ASC|DESC)\z/i + params[:sort] + else + :desc + end + + items.order(order_by => sort) + end + # rubocop: enable CodeReuse/ActiveRecord +end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 6b05ee06199..6f5327b1362 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -1056,10 +1056,7 @@ class MergeRequest < ActiveRecord::Base def all_pipelines(shas: all_commit_shas) return Ci::Pipeline.none unless source_project - @all_pipelines ||= source_project.pipelines - .where(sha: shas, ref: source_branch) - .where(merge_request: [nil, self]) - .sort_by_merge_request_pipelines + @all_pipelines ||= MergeRequestPipelinesFinder.new(self, sha: all_commit_shas).execute.sort_by_merge_request_pipelines end def merge_request_pipeline_exists? diff --git a/spec/finders/merge_request_pipelines_finder_spec.rb b/spec/finders/merge_request_pipelines_finder_spec.rb new file mode 100644 index 00000000000..a67effcda4a --- /dev/null +++ b/spec/finders/merge_request_pipelines_finder_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe MergeRequestPipelinesFinder do + let(:merge_request) { create(:merge_request, :conflict) } + + before do + create_list(:ci_pipeline, 2, :auto_devops_source, project: merge_request.source_project, sha: merge_request.diff_head_sha, ref: merge_request.source_branch) + create(:ci_pipeline, :repository_source, project: merge_request.source_project, sha: merge_request.all_commit_shas.last, ref: merge_request.source_branch) + create_list(:ci_pipeline, 2, project: merge_request.source_project, sha: merge_request.diff_head_sha) + end + + describe "#execute" do + it 'filters by sha' do + params = { sha: merge_request.diff_head_sha } + + pipelines = described_class.new(merge_request, params).execute + + expect(pipelines.size).to eq(2) + end + + it 'with source_branch ref as the pipeline ref by default' do + pipelines = described_class.new(merge_request).execute + + expect(pipelines.size).to eq(3) + end + end +end -- cgit v1.2.1