summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMałgorzata Ksionek <mksionek@gitlab.com>2019-06-01 16:08:50 +0200
committerMałgorzata Ksionek <mksionek@gitlab.com>2019-06-14 13:26:27 +0200
commita22c8d054e4191165ba9f4b5c1d6c72479d9a0b0 (patch)
treed592959a6f25f1d5e2ccfd0088cfd118e0800fd7
parente66e823166e2cb8a51489f05240ea1837067dc11 (diff)
downloadgitlab-ce-a22c8d054e4191165ba9f4b5c1d6c72479d9a0b0.tar.gz
Add review stage query
-rw-r--r--lib/gitlab/cycle_analytics/review_base_query.rb11
-rw-r--r--lib/gitlab/cycle_analytics/review_event_fetcher.rb2
-rw-r--r--lib/gitlab/cycle_analytics/review_stage.rb2
-rw-r--r--spec/lib/gitlab/cycle_analytics/review_stage_spec.rb37
4 files changed, 52 insertions, 0 deletions
diff --git a/lib/gitlab/cycle_analytics/review_base_query.rb b/lib/gitlab/cycle_analytics/review_base_query.rb
new file mode 100644
index 00000000000..eb22540dce0
--- /dev/null
+++ b/lib/gitlab/cycle_analytics/review_base_query.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module CycleAnalytics
+ module ReviewBaseQuery
+ def stage_query(project_ids)
+ super(project_ids).where(mr_metrics_table[:merged_at].not_eq(nil))
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cycle_analytics/review_event_fetcher.rb b/lib/gitlab/cycle_analytics/review_event_fetcher.rb
index de100295281..153683dfe0b 100644
--- a/lib/gitlab/cycle_analytics/review_event_fetcher.rb
+++ b/lib/gitlab/cycle_analytics/review_event_fetcher.rb
@@ -3,6 +3,8 @@
module Gitlab
module CycleAnalytics
class ReviewEventFetcher < BaseEventFetcher
+ include ReviewBaseQuery
+
def initialize(*args)
@projections = [mr_table[:title],
mr_table[:iid],
diff --git a/lib/gitlab/cycle_analytics/review_stage.rb b/lib/gitlab/cycle_analytics/review_stage.rb
index 294b656bc55..38f7288b229 100644
--- a/lib/gitlab/cycle_analytics/review_stage.rb
+++ b/lib/gitlab/cycle_analytics/review_stage.rb
@@ -3,6 +3,8 @@
module Gitlab
module CycleAnalytics
class ReviewStage < BaseStage
+ include ReviewBaseQuery
+
def start_time_attrs
@start_time_attrs ||= mr_table[:created_at]
end
diff --git a/spec/lib/gitlab/cycle_analytics/review_stage_spec.rb b/spec/lib/gitlab/cycle_analytics/review_stage_spec.rb
index 1412c8dfa08..e9ae2a10392 100644
--- a/spec/lib/gitlab/cycle_analytics/review_stage_spec.rb
+++ b/spec/lib/gitlab/cycle_analytics/review_stage_spec.rb
@@ -3,6 +3,43 @@ require 'lib/gitlab/cycle_analytics/shared_stage_spec'
describe Gitlab::CycleAnalytics::ReviewStage do
let(:stage_name) { :review }
+ let(:project) { create(:project) }
+ let!(:issue_1) { create(:issue, project: project, created_at: 90.minutes.ago) }
+ let!(:issue_2) { create(:issue, project: project, created_at: 60.minutes.ago) }
+ let!(:issue_3) { create(:issue, project: project, created_at: 60.minutes.ago) }
+ let!(:mr_1) { create(:merge_request, :closed, source_project: project, created_at: 60.minutes.ago) }
+ let!(:mr_2) { create(:merge_request, :closed, source_project: project, created_at: 40.minutes.ago, source_branch: 'A') }
+ let!(:mr_3) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'B') }
+ let!(:mr_4) { create(:merge_request, source_project: project, created_at: 10.minutes.ago, source_branch: 'C') }
+ let(:stage) { described_class.new(project: project, options: { from: 2.days.ago, current_user: project.creator }) }
+
+ before do
+ mr_1.metrics.update!(merged_at: 30.minutes.ago)
+ mr_2.metrics.update!(merged_at: 10.minutes.ago)
+
+ create(:merge_requests_closing_issues, merge_request: mr_1, issue: issue_1)
+ create(:merge_requests_closing_issues, merge_request: mr_2, issue: issue_2)
+ create(:merge_requests_closing_issues, merge_request: mr_3, issue: issue_3)
+ end
it_behaves_like 'base stage'
+
+ describe '#median' do
+ around do |example|
+ Timecop.freeze { example.run }
+ end
+
+ it 'counts median from issues with metrics' do
+ expect(stage.median).to eq(HALF_AN_HOUR_IN_SECONDS)
+ end
+ end
+
+ describe '#events' do
+ it 'exposes merge requests that closes issues' do
+ result = stage.events
+
+ expect(result.count).to eq(2)
+ expect(result.map { |event| event[:title] }).to contain_exactly(mr_1.title, mr_2.title)
+ end
+ end
end