spec/lib/release_tools/metrics/patch_release_status_spec.rb (114 lines of code) (raw):

# frozen_string_literal: true require 'spec_helper' describe ReleaseTools::Metrics::PatchReleaseStatus do let(:delivery_metrics) { instance_double(ReleaseTools::Metrics::Client) } let(:gitlab_client) { stub_const('ReleaseTools::GitlabClient', spy) } describe '#execute' do before do allow(ReleaseTools::Metrics::Client) .to receive(:new) .and_return(delivery_metrics) end context 'when the feature flag is disabled' do subject(:release_status) { described_class.new(status: :open) } it 'does nothing' do expect(delivery_metrics).not_to receive(:set) release_status.execute end end context 'when creating a new metric for the patch release' do let(:next_patch_release_date) { "2024-02-15" } let(:current_minor_for_date) { "16.3" } let(:previous_minors) { ["16.2", "16.1", "16.0"] } before do allow(ReleaseTools::GitlabReleasesGemClient) .to receive_messages( current_minor_for_date: current_minor_for_date, next_patch_release_date: next_patch_release_date, previous_minors: previous_minors ) allow(gitlab_client) .to receive(:present?) .and_return(false) enable_feature(:release_status_metric) end context 'when it is a dry run' do subject(:release_status) { described_class.new(status: :open) } it 'does nothing' do expect(delivery_metrics).not_to receive(:set) release_status.execute end end context 'when given an invalid status' do subject(:release_status) { described_class.new(status: :invalid) } it 'does nothing' do expect(delivery_metrics).not_to receive(:set) without_dry_run { release_status.execute } end end context 'when the status is open' do subject(:release_status) { described_class.new(status: :open) } it 'creates a status metric for the active version' do expect(delivery_metrics).to receive(:reset).with(described_class::METRIC) expect(delivery_metrics).to receive(:set) .with(described_class::METRIC, 1, { labels: "2024-02-15,16.2 16.1 16.0" }) without_dry_run { release_status.execute } end end context 'when the status is warning' do subject(:release_status) { described_class.new(status: :warning) } let(:now) { Time.utc(2024, 4, 9, 0, 45) } let(:next_wednesday) { now.next_week(:wednesday).to_date } let(:wednesday_two_weeks_from_now) { next_wednesday.next_week(:wednesday).to_date } before do allow(ReleaseTools::GitlabReleasesGemClient) .to receive(:next_patch_release_date) .and_return(patch_release_date.to_s) end context 'when the next patch release date is not next week' do let(:patch_release_date) { wednesday_two_weeks_from_now } it 'does not set the value of the status metric' do expect(delivery_metrics).not_to receive(:set) Timecop.travel(now) do without_dry_run { release_status.execute } end end end context 'when the next patch release date is next week' do let(:patch_release_date) { next_wednesday } it 'sets the value of the status metric for the next patch release version to 2 (warning)' do expect(delivery_metrics).to receive(:reset).with(described_class::METRIC) expect(delivery_metrics).to receive(:set) .with(described_class::METRIC, 2, { labels: "#{next_wednesday},16.2 16.1 16.0" }) Timecop.travel(now) do without_dry_run { release_status.execute } end end end end context 'when the status is closed' do subject(:release_status) { described_class.new(status: :closed) } it 'sets the value of the status metric for the next patch release version to 3 (closed)' do expect(delivery_metrics).to receive(:reset).with(described_class::METRIC) expect(delivery_metrics).to receive(:set) .with(described_class::METRIC, 3, { labels: "2024-02-15,16.2 16.1 16.0" }) without_dry_run { release_status.execute } end end context 'when the security tracking issue is present' do subject(:release_status) { described_class.new(status: :closed) } let(:tracking_issue) { build(:issue, due_date: '2024-02-16') } before do allow(gitlab_client) .to receive(:next_security_tracking_issue) .and_return(tracking_issue) end it 'sets the release date label of the metric to the security tracking issue due date' do expect(delivery_metrics).to receive(:reset).with(described_class::METRIC) expect(delivery_metrics).to receive(:set) .with(described_class::METRIC, 3, { labels: "2024-02-16,16.2 16.1 16.0" }) without_dry_run { release_status.execute } end end end end end