omnibus-gitlab/spec/chef/cookbooks/gitlab/libraries/helpers/pg_status_helper_spec.rb

134 lines
4.6 KiB
Ruby

require 'chef_helper'
RSpec.describe PgStatusHelper do
cached(:chef_run) { converge_config }
let!(:node) { chef_run.node }
let!(:helper) { PgHelper.new(node) }
let(:connection_info) { helper.build_connection_info('dbname', 'dbhost', 'port', 'pguser') }
context 'when checking status' do
subject { described_class.new(connection_info, node) }
describe '#service_checks_exhausted?' do
it 'returns true when there are zero remaining service checks' do
allow(subject).to receive(:remaining_service_checks).and_return(0)
expect(subject.service_checks_exhausted?).to be true
end
it 'returns false when more service checks are allowed' do
allow(subject).to receive(:remaining_service_checks).and_return(1)
expect(subject.service_checks_exhausted?).to be false
end
end
describe '#ready?' do
it 'raises no warnings when Postgres is accepting connections' do
allow(subject).to receive(:accepting_connections?).and_return(true)
expect(subject.ready?).to be true
end
it 'raises a warning when Postgres is not responding' do
allow(subject).to receive(:not_responding?).and_return(true)
allow(subject).to receive(:remaining_service_checks).and_return(0)
expect { subject.ready? }.to raise_error(RuntimeError, 'PostgreSQL did not respond before service checks were exhausted')
end
it 'raises a warning when Postgres gets invalid connection parameters' do
allow(subject).to receive(:invalid_connection_parameters?).and_return(true)
expect { subject.ready? }.to raise_error(RuntimeError, 'PostgreSQL is not receiving the correct connection parameters')
end
it 'raises a warning when all service checks are exhausted' do
allow(subject).to receive(:service_checks_exhausted?).and_return(true)
expect { subject.ready? }.to raise_error(RuntimeError, 'Exhausted service checks and database is still not available')
end
end
context 'when invoking pg_isready' do
using RSpec::Parameterized::TableSyntax
where(:exit_code, :accepting, :rejecting, :not_responding, :invalid_parameters) do
0 | true | false | false | false
1 | false | true | false | false
2 | false | false | true | false
3 | false | false | false | true
end
with_them do
before do
result = spy('shellout')
allow(subject).to receive(:do_shell_out).and_return(result)
allow(result).to receive(:exitstatus).and_return(exit_code)
end
describe '#service_state' do
it 'returns the expected exit code' do
expect(subject.service_state).to eq(exit_code)
end
end
describe '#accepting_connections?' do
it 'returns the expected boolean' do
expect(subject.accepting_connections?).to be accepting
end
end
describe '#rejecting_connections?' do
it 'returns the expected boolean' do
expect(subject.rejecting_connections?).to be rejecting
end
end
describe '#not_responding?' do
it 'returns the expected boolean' do
expect(subject.not_responding?).to be not_responding
end
end
describe '#invalid_connection_parameters?' do
it 'returns the expected boolean' do
expect(subject.invalid_connection_parameters?).to be invalid_parameters
end
end
end
end
end
context 'when all checks use configured defaults' do
subject { described_class.new(connection_info, node) }
describe '#maximum_service_checks' do
it 'will check 20 times' do
expect(subject.maximum_service_checks).to eq(20)
end
end
describe '#service_check_interval' do
it 'will check every 5 seconds' do
expect(subject.service_check_interval).to eq(5)
end
end
end
context 'when checks are are customized' do
let(:the_answer) { 424242 }
before do
chef_run.node.normal['postgresql']['max_service_checks'] = the_answer
chef_run.node.normal['postgresql']['service_check_interval'] = the_answer
@subject = described_class.new(connection_info, node)
end
describe '#maximum_service_checks' do
it 'will check the configured number of times' do
expect(@subject.maximum_service_checks).to eq(the_answer)
end
end
describe '#service_check_interval' do
it 'will check at a configured interval' do
expect(@subject.service_check_interval).to eq(the_answer)
end
end
end
end