spec/chef/gitlab-ctl-commands-ee/replicate_geo_database_spec.rb (102 lines of code) (raw):
require 'spec_helper'
require 'omnibus-ctl'
RSpec.describe 'gitlab-ctl replicate-geo-database' do
subject { Omnibus::Ctl.new('testing-ctl') }
let(:required_arguments) do
%w(--host=gitlab-primary.geo
--slot-name=gitlab_primary_geo)
end
before do
allow_any_instance_of(Omnibus::Ctl).to receive(:require).and_call_original
allow_any_instance_of(Omnibus::Ctl).to receive(:require).with(
'/opt/testing-ctl/embedded/service/omnibus-ctl-ee/lib/geo/replication'
) do
require_relative('../../../files/gitlab-ctl-commands-ee/lib/geo/replication')
end
subject.load_file('files/gitlab-ctl-commands-ee/replicate_geo_database.rb')
end
it 'appends a geo replication command' do
expect(subject.get_all_commands_hash).to include('replicate-geo-database')
end
describe "#replicate_geo_database" do
it 'executes the geo replication command' do
stub_command_arguments(required_arguments)
expect(Geo::Replication).to receive(:new).and_call_original
.with(subject, hash_including(host: 'gitlab-primary.geo',
slot_name: 'gitlab_primary_geo'))
expect_any_instance_of(Geo::Replication).to receive(:execute)
replicate_geo_database
end
it 'applies defaults to optional arguments' do
stub_command_arguments(required_arguments)
expect(Geo::Replication).to receive(:new).and_call_original
.with(subject, hash_including(host: 'gitlab-primary.geo',
slot_name: 'gitlab_primary_geo',
user: 'gitlab_replicator',
port: 5432,
password: nil,
now: false,
force: false,
skip_backup: false,
skip_replication_slot: false,
backup_timeout: 1800,
sslmode: 'verify-full',
sslcompression: 0,
recovery_target_timeline: 'latest',
db_name: 'gitlabhq_production'))
expect_any_instance_of(Geo::Replication).to receive(:execute)
replicate_geo_database
end
it 'requires the host argument' do
stub_command_arguments(%w(--slot-name=gitlab_primary_geo))
expect(Geo::Replication).not_to receive(:new)
# Important to catch this SystemExit or else RSpec exits
expect { subject.replicate_geo_database }.to raise_error(SystemExit).and(
output(/missing argument: host/).to_stdout
)
end
it 'requires the slot-name argument' do
stub_command_arguments(%w(--host=gitlab-primary.geo))
expect(Geo::Replication).not_to receive(:new)
# Important to catch this SystemExit or else RSpec exits
expect { subject.replicate_geo_database }.to raise_error(SystemExit).and(
output(/missing argument: --slot-name/).to_stdout
)
end
context 'with SSL compression enabled' do
it 'enables SSL compression' do
stub_command_arguments(
required_arguments +
%w(--sslmode=disable
--sslcompression=1
--no-wait))
expect(Geo::Replication).to receive(:new).and_call_original
.with(subject, hash_including(host: 'gitlab-primary.geo',
slot_name: 'gitlab_primary_geo',
sslmode: 'disable',
sslcompression: 1,
now: true))
expect_any_instance_of(Geo::Replication).to receive(:execute)
replicate_geo_database
end
end
context 'with db_name specified' do
it 'sets the db_name option' do
stub_command_arguments(
required_arguments +
%w(--db-name=custom_db_name))
expect(Geo::Replication).to receive(:new).and_call_original
.with(subject, hash_including(host: 'gitlab-primary.geo',
slot_name: 'gitlab_primary_geo',
db_name: 'custom_db_name'))
expect_any_instance_of(Geo::Replication).to receive(:execute)
replicate_geo_database
end
end
end
def stub_command_arguments(arguments)
expect_any_instance_of(Omnibus::Ctl::GeoReplicationCommand)
.to receive(:arguments).and_return(arguments)
end
def replicate_geo_database
# GeoReplicationCommand is designed to `exit 1` when there is a problem
# during option parsing. Tests that trigger this exit will also silently
# exit RSpec immediately, *and* they will *not* fail.
#
# So if a test expects a successful call, we *must* catch at least
# SystemExit for the test to be valid. And since other errors are always
# possible, and should also fail the test, we don't need to specify
# SystemExit here.
#
# In short, this is necessary for a failable test.
expect { subject.replicate_geo_database }.not_to raise_error
end
end