spec/lib/gdk/diagnostic/geo_spec.rb (179 lines of code) (raw):
# frozen_string_literal: true
RSpec.describe GDK::Diagnostic::Geo do
subject(:geo_diagnostic) { described_class.new }
let(:database_yml_file) { '/home/git/gdk/gitlab/config/database.yml' }
let(:default_content) do
<<-CONTENT
development:
main:
adapter: postgresql
encoding: unicode
database: gitlabhq_development
username: postgres
password: "secure password"
host: localhost
variables:
statement_timeout: 15s
CONTENT
end
let(:geo_content) do
<<-CONTENT
development:
main:
adapter: postgresql
encoding: unicode
database: gitlabhq_development
username: postgres
password: "secure password"
host: localhost
variables:
statement_timeout: 15s
geo:
adapter: postgresql
encoding: unicode
database: gitlabhq_geo_development
username: postgres
password: "secure password"
host: localhost
variables:
statement_timeout: 15s
CONTENT
end
shared_examples 'with Geo diagnostic success' do |geo_enabled, expected_result, database_settings = nil|
it "returns #{expected_result}" do
stub_geo_enabled(geo_enabled)
stub_database_yml_content(database_settings) if database_settings
expect(geo_diagnostic.success?).to eq(expected_result)
end
end
describe '#success?' do
context 'when geo.enabled is false' do
before do
stub_geo_enabled(false)
end
context 'and Geo database does not exist' do
include_examples 'with Geo diagnostic success', false, true
end
context 'and Geo database exists' do
before do
stub_database_yml_content(geo_content)
end
it 'returns false' do
expect(geo_diagnostic.success?).to be(false)
end
end
end
context 'when geo.enabled is true and geo.secondary is true' do
before do
stub_geo_enabled(true)
stub_geo_secondary
end
context 'and Geo database does not exist' do
include_examples 'with Geo diagnostic success', true, false
end
context 'and Geo database exists' do
before do
stub_database_yml_content(geo_content)
end
it 'returns true' do
expect(geo_diagnostic.success?).to be(true)
end
end
end
context 'when geo.enabled is true and geo.secondary is false' do
before do
stub_geo_enabled(true)
stub_geo_primary
end
context 'and Geo database does not exist' do
include_examples 'with Geo diagnostic success', true, true
end
context 'and Geo database exists' do
before do
stub_database_yml_content(geo_content)
end
it 'returns false' do
expect(geo_diagnostic.success?).to be(false)
end
end
end
end
describe '#detail' do
let(:success) { nil }
before do
allow(geo_diagnostic).to receive(:success?).and_return(success)
end
context 'when #success? returns true' do
let(:success) { true }
it 'returns nil' do
expect(geo_diagnostic.detail).to be_nil
end
end
context 'when #success? returns false' do
context 'when geo.enabled is false and Geo database exists' do
let(:success) { false }
before do
stub_geo_enabled(false)
stub_database_yml_content(geo_content)
end
it 'returns a message advising how to detail with the situation' do
expected_detail = <<~MESSAGE
There is a mismatch in your Geo configuration.
Geo is disabled in GDK, but `/home/git/gdk/gitlab/config/database.yml` contains geo database.
Please run `gdk reconfigure` to apply settings in gdk.yml.
For more details, please refer to https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/howto/geo.md.
MESSAGE
expect(geo_diagnostic.detail).to eq(expected_detail)
end
end
context 'when geo.enabled is true and geo.secondary is true and Geo database does not exist' do
let(:success) { false }
before do
stub_geo_enabled(true)
stub_geo_secondary
stub_database_yml_content(default_content)
end
it 'returns a message advising how to detail with the situation' do
expected_detail = <<~MESSAGE
There is a mismatch in your Geo configuration.
Geo is enabled in GDK as a secondary, but `/home/git/gdk/gitlab/config/database.yml` does not contain geo database.
Please run `gdk reconfigure` to apply settings in gdk.yml.
For more details, please refer to https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/howto/geo.md.
MESSAGE
expect(geo_diagnostic.detail).to eq(expected_detail)
end
end
context 'when geo.enabled is true and geo.secondary is false and Geo database exists' do
let(:success) { false }
before do
stub_geo_enabled(true)
stub_geo_primary
stub_database_yml_content(geo_content)
end
it 'returns a message advising how to detail with the situation' do
expected_detail = <<~MESSAGE
There is a mismatch in your Geo configuration.
Geo is enabled in GDK, but not as a secondary node, so `/home/git/gdk/gitlab/config/database.yml` should not contain geo database.
Please run `gdk reconfigure` to apply settings in gdk.yml.
For more details, please refer to https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/howto/geo.md.
MESSAGE
expect(geo_diagnostic.detail).to eq(expected_detail)
end
end
end
end
def stub_database_yml_content(content)
allow(File).to receive(:exist?).and_call_original
allow(File).to receive(:exist?).with(database_yml_file).and_return(true)
allow(File).to receive(:read).and_call_original
allow(File).to receive(:read).with(database_yml_file).and_return(content)
end
def stub_geo_enabled(enabled)
allow_any_instance_of(GDK::Config).to receive_message_chain('geo.enabled').and_return(enabled)
end
def stub_geo_primary
allow_any_instance_of(GDK::Config).to receive_message_chain('geo.secondary').and_return(nil)
end
def stub_geo_secondary
allow_any_instance_of(GDK::Config).to receive_message_chain('geo.secondary').and_return(true)
end
end