spec/lib/release_tools/promotion/manager_spec.rb (116 lines of code) (raw):

# frozen_string_literal: true require 'spec_helper' describe ReleaseTools::Promotion::Manager do let(:deploy_package) { '13.1.202005220540-7c84ccdc806.59f00bb0515' } let(:package_version) { ReleaseTools::Version.new(deploy_package) } let(:version) { ReleaseTools::Version.new('13.1.0') } let(:status) { instance_double(ReleaseTools::Promotion::ProductionStatus, fine?: true) } subject(:manager) do described_class.new end before do allow(ReleaseTools::ReleaseManagers::Schedule) .to receive(:new) .and_return(instance_double(ReleaseTools::ReleaseManagers::Schedule, version_for_date: version)) allow(manager).to receive(:status).and_return(status) end describe '#authorize!' do let(:fake_client) { spy("ReleaseTools::GitlabClient") } let(:issue) { instance_double(ReleaseTools::MonthlyIssue, project: ReleaseTools::Project::Release::Tasks) } before do stub_const("ReleaseTools::GitlabClient", fake_client) end it 'updates the issue' do expect(ReleaseTools::Promotion::StatusNote).to receive(:new) .with( { status: status, package_version: package_version, override_reason: 'false' } ).and_return(double('note', body: 'a comment')) without_dry_run do manager.authorize!(package_version, issue) end expect(fake_client) .to have_received(:create_issue_note) .with( ReleaseTools::Project::Release::Tasks, { issue: issue, body: 'a comment' } ) end it 'raises an exception if the system is not fine' do expect(status).to receive(:fine?).and_return(false) expect(manager).to receive(:create_issue_comment) without_dry_run do expect { manager.authorize!(package_version, issue) }.to raise_error(ReleaseTools::Promotion::Manager::UnsafeProductionError) end end context 'when IGNORE_PRODUCTION_CHECKS is set' do it 'updates the issue with the reason why it was overridden' do ignore_production_checks = 'a reason to ignore checks' expect(ReleaseTools::Promotion::StatusNote).to receive(:new) .with( { status: status, package_version: package_version, override_reason: ignore_production_checks } ).and_return(double('note', body: 'a comment')) ClimateControl.modify( IGNORE_PRODUCTION_CHECKS: ignore_production_checks ) do without_dry_run do manager.authorize!(package_version, issue) end end expect(fake_client) .to have_received(:create_issue_note) .with( ReleaseTools::Project::Release::Tasks, { issue: issue, body: 'a comment' } ) end it 'unescapes the ignore reason' do expect(ReleaseTools::Promotion::StatusNote).to receive(:new) .with( { status: status, package_version: package_version, override_reason: 'foo,bar' } ).and_return(double('note', body: 'a comment')) ClimateControl.modify( IGNORE_PRODUCTION_CHECKS: CGI.escape('foo,bar') ) do without_dry_run do manager.authorize!(package_version, issue) end end expect(fake_client) .to have_received(:create_issue_note) .with( ReleaseTools::Project::Release::Tasks, { issue: issue, body: 'a comment' } ) end it "doesn't raise an exception if the system is not fine" do ignore_production_checks = 'a reason to ignore checks' expect(manager).to receive(:create_issue_comment) ClimateControl.modify(IGNORE_PRODUCTION_CHECKS: ignore_production_checks) do without_dry_run do expect { manager.authorize!(package_version, issue) }.not_to raise_error end end end end end end