Improve spec for pipeline metrics worker
This commit is contained in:
parent
9c6c5c79f8
commit
a497803072
|
@ -5,11 +5,26 @@ class PipelineMetricsWorker
|
||||||
|
|
||||||
def perform(pipeline_id)
|
def perform(pipeline_id)
|
||||||
Ci::Pipeline.find_by(id: pipeline_id).try do |pipeline|
|
Ci::Pipeline.find_by(id: pipeline_id).try do |pipeline|
|
||||||
merge_requests = pipeline.merge_requests.map(&:id)
|
update_metrics_for_active_pipeline(pipeline) if pipeline.active?
|
||||||
|
update_metrics_for_succeeded_pipeline(pipeline) if pipeline.success?
|
||||||
metrics = MergeRequest::Metrics.where(merge_request_id: merge_requests)
|
|
||||||
metrics.update_all(latest_build_started_at: pipeline.started_at) if pipeline.active?
|
|
||||||
metrics.update_all(latest_build_finished_at: pipeline.finished_at) if pipeline.success?
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def update_metrics_for_active_pipeline(pipeline)
|
||||||
|
metrics(pipeline).update_all(latest_build_started_at: pipeline.started_at, latest_build_finished_at: nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_metrics_for_succeeded_pipeline(pipeline)
|
||||||
|
metrics(pipeline).update_all(latest_build_started_at: pipeline.started_at, latest_build_finished_at: pipeline.finished_at)
|
||||||
|
end
|
||||||
|
|
||||||
|
def metrics(pipeline)
|
||||||
|
MergeRequest::Metrics.where(merge_request_id: merge_requests(pipeline))
|
||||||
|
end
|
||||||
|
|
||||||
|
def merge_requests(pipeline)
|
||||||
|
pipeline.merge_requests.map(&:id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -187,33 +187,24 @@ describe Ci::Pipeline, models: true do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "merge request metrics" do
|
describe 'merge request metrics' do
|
||||||
let(:project) { FactoryGirl.create :project }
|
let(:project) { FactoryGirl.create :project }
|
||||||
let(:pipeline) { FactoryGirl.create(:ci_empty_pipeline, status: 'created', project: project, ref: 'master', sha: project.repository.commit('master').id) }
|
let(:pipeline) { FactoryGirl.create(:ci_empty_pipeline, status: 'created', project: project, ref: 'master', sha: project.repository.commit('master').id) }
|
||||||
let!(:merge_request) { create(:merge_request, source_project: project, source_branch: pipeline.ref) }
|
let!(:merge_request) { create(:merge_request, source_project: project, source_branch: pipeline.ref) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
expect(PipelineMetricsWorker).to receive(:perform_async).with(pipeline.id)
|
||||||
|
end
|
||||||
|
|
||||||
context 'when transitioning to running' do
|
context 'when transitioning to running' do
|
||||||
it 'records the build start time' do
|
it 'schedules metrics workers' do
|
||||||
time = Time.now
|
pipeline.run
|
||||||
Timecop.freeze(time) { build.run }
|
|
||||||
|
|
||||||
expect(merge_request.reload.metrics.latest_build_started_at).to be_within(1.second).of(time)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'clears the build end time' do
|
|
||||||
build.run
|
|
||||||
|
|
||||||
expect(merge_request.reload.metrics.latest_build_finished_at).to be_nil
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when transitioning to success' do
|
context 'when transitioning to success' do
|
||||||
it 'records the build end time' do
|
it 'schedules metrics workers' do
|
||||||
build.run
|
pipeline.succeed
|
||||||
time = Time.now
|
|
||||||
Timecop.freeze(time) { build.success }
|
|
||||||
|
|
||||||
expect(merge_request.reload.metrics.latest_build_finished_at).to be_within(1.second).of(time)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe PipelineMetricsWorker do
|
||||||
|
let(:project) { create(:project) }
|
||||||
|
let!(:merge_request) { create(:merge_request, source_project: project, source_branch: pipeline.ref) }
|
||||||
|
|
||||||
|
let(:pipeline) do
|
||||||
|
create(:ci_empty_pipeline,
|
||||||
|
status: status,
|
||||||
|
project: project,
|
||||||
|
ref: 'master',
|
||||||
|
sha: project.repository.commit('master').id,
|
||||||
|
started_at: 1.hour.ago,
|
||||||
|
finished_at: Time.now)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#perform' do
|
||||||
|
subject { described_class.new.perform(pipeline.id) }
|
||||||
|
|
||||||
|
context 'when pipeline is running' do
|
||||||
|
let(:status) { 'running' }
|
||||||
|
|
||||||
|
it 'records the build start time' do
|
||||||
|
subject
|
||||||
|
|
||||||
|
expect(merge_request.reload.metrics.latest_build_started_at).to eq(pipeline.started_at)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'clears the build end time' do
|
||||||
|
subject
|
||||||
|
|
||||||
|
expect(merge_request.reload.metrics.latest_build_finished_at).to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when pipeline succeeded' do
|
||||||
|
let(:status) { 'success' }
|
||||||
|
|
||||||
|
it 'records the build end time' do
|
||||||
|
subject
|
||||||
|
|
||||||
|
expect(merge_request.reload.metrics.latest_build_finished_at).to eq(pipeline.finished_at)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue