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