spec/chef/gitlab-ctl-commands-ee/lib/geo/promotion_preflight_checks_spec.rb (119 lines of code) (raw):
require 'spec_helper'
require 'geo/promotion_preflight_checks'
require 'gitlab_ctl/util'
RSpec.describe Geo::PromotionPreflightChecks, '#execute' do
let(:confirmation) { 'y' }
let(:options) { { confirm_primary_is_down: true } }
subject(:command) { described_class.new(nil, options) }
before do
allow(STDIN).to receive(:gets).and_return(confirmation)
allow(command).to receive(:run_command).with(any_args)
shell_out_object = double.tap do |shell_out_object|
allow(shell_out_object).to receive(:stdout).and_return('SUCCESS')
allow(shell_out_object).to receive(:error?).and_return(false)
end
allow(command).to receive(:run_command).with(
'gitlab-rake gitlab:geo:check_replication_verification_status')
.and_return(shell_out_object)
end
it 'prints preflight check instructions' do
expect { command.execute }.to output(
/Ensure you have completed the following manual preflight checks/)
.to_stdout
end
context 'when manual checks are confirmed' do
it 'does not raise an error' do
expect { command.execute }.to_not raise_error
end
it 'runs `check_replication_verification_status` task' do
is_expected.to receive(:run_command).with(
'gitlab-rake gitlab:geo:check_replication_verification_status').once
command.execute
end
context 'when gitlab:geo:check_replication_verification_status fails' do
around do |example|
example.run
rescue SystemExit
end
before do
shell_out_object = double.tap do |shell_out_object|
allow(shell_out_object).to receive(:stdout).and_return('error message')
allow(shell_out_object).to receive(:error?).and_return(true)
end
allow(command).to receive(:run_command).with(
'gitlab-rake gitlab:geo:check_replication_verification_status')
.once
.and_return(shell_out_object)
end
it 'prints error message when rake task errors' do
expect { command.execute }.to output(
/error message\nERROR: Replication\/verification is incomplete./).to_stdout
end
it 'exits with 1 when rake task errors' do
expect { command.execute }.to raise_error(SystemExit) do |error|
expect(error.status).to eq(1)
end
end
end
context 'when gitlab:geo:check_replication_verification_status passes' do
it 'prints a success message' do
expect { command.execute }.to output(
/All preflight checks have passed. This node can now be promoted./)
.to_stdout
end
end
end
context 'when manual checks are not confirmed' do
let(:confirmation) { 'n' }
around do |example|
example.run
rescue SystemExit
end
it 'print error message' do
expect { command.execute }.to output(
/ERROR: Manual preflight checks were not performed/
).to_stdout
end
end
describe 'option --confirm-primary-is-down' do
before do
allow(command).to receive(:confirm_manual_checks).and_return(true)
end
context 'when the option is not passed' do
let(:options) { {} }
let(:confirmation) { 'n' }
around do |example|
example.run
rescue SystemExit
end
it 'asks user for confirmation' do
expect { command.execute }.to output(
/Is primary down? (N\/y)/)
.to_stdout
end
it 'prints an error message when user doesn not select y/Y' do
expect { command.execute }.to output(
/ERROR: Primary node must be down./)
.to_stdout
end
end
context 'when the option is passed' do
it 'does not ask user for confirmation' do
expect { command.execute }.not_to output(
/Is primary down? (N\/y)/)
.to_stdout
end
end
end
context 'when all checks pass' do
before do
allow(command).to receive(:confirm_manual_checks).and_return(true)
allow(command).to receive(:confirm_primary_is_down).and_return(true)
end
it 'prints a success message' do
expect { command.execute }.to output(
/All preflight checks have passed. This node can now be promoted./)
.to_stdout
end
end
end