spec/lib/release_tools/deployments/blockers_metrics_spec.rb (87 lines of code) (raw):
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe ReleaseTools::Deployments::BlockersMetrics do
subject(:deployment_blocker) { described_class.new }
let(:local_time) { Time.utc(2023, 4, 1, 0, 0, 0) }
let(:client) { instance_double(ReleaseTools::Metrics::Client) }
let(:fetcher) { instance_double(ReleaseTools::Deployments::BlockerIssueFetcher) }
let(:calculator) { instance_double(ReleaseTools::Deployments::BlockersCalculator) }
before do
allow(ReleaseTools::Metrics::Client).to receive(:new).and_return(client)
allow(ReleaseTools::Deployments::BlockerIssueFetcher).to receive(:new).and_return(fetcher)
allow(ReleaseTools::Deployments::BlockersCalculator).to receive(:new).and_return(calculator)
end
describe '#execute' do
context 'when the feature flag is disabled' do
before do
disable_feature(:deployment_blockers_metrics)
end
it 'does nothing' do
expect(fetcher).not_to receive(:fetch)
expect(calculator).not_to receive(:blocker_types)
deployment_blocker.execute
end
end
context 'when the feature flag is enabled' do
before do
enable_feature(:deployment_blockers_metrics)
end
context 'when creating a new metric for the deployment blockers' do
let(:root_cause_list) do
[
"RootCause::Broken-Security-Mirror",
"RootCause::Config-Change",
"RootCause::DB-Migration",
"RootCause::Dev-Instance",
"RootCause::External-Dependency",
"RootCause::Feature-Flag",
"RootCause::Flaky-Test",
"RootCause::Indeterminate",
"RootCause::Known-Software-Issue",
"RootCause::Native-Traffic",
"RootCause::Needed",
"RootCause::Ops-Instance",
"RootCause::Release-Compatibility",
"RootCause::Saturation",
"RootCause::Software-Change",
"RootCause::SPoF",
"Change-request"
]
end
let(:blocker_types) do
{
"RootCause::Flaky-Test" => { gstg: 10.0, gprd: 5.0, count: 3 },
"RootCause::Feature-Flag" => { gstg: 20.0, gprd: 15.0, count: 2 }
}
end
before do
allow(fetcher).to receive(:fetch)
allow(fetcher).to receive_messages(deployment_blockers: [], start_time: local_time)
allow(calculator).to receive_messages(blocker_types: blocker_types)
end
it 'calculates and sets metrics for each blocker type' do
Timecop.freeze(local_time) do
root_cause_list.each do |root_cause|
blocked_time = blocker_types[root_cause] || { gprd: 0, gstg: 0, count: 0 }
expect(client).to receive(:set).with(
'deployment_blocker_count',
blocked_time[:count],
labels: "#{root_cause},2023-04-01"
)
expect(client).to receive(:set).with(
'deployment_hours_blocked',
blocked_time[:gprd],
labels: "#{root_cause},gprd,2023-04-01"
)
expect(client).to receive(:set).with(
'deployment_hours_blocked',
blocked_time[:gstg],
labels: "#{root_cause},gstg,2023-04-01"
)
end
deployment_blocker.execute
end
end
end
end
end
end