169 lines
4.8 KiB
Ruby
169 lines
4.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe 'validate database config' do
|
|
include RakeHelpers
|
|
include StubENV
|
|
|
|
let(:rails_configuration) { Rails::Application::Configuration.new(Rails.root) }
|
|
let(:ar_configurations) { ActiveRecord::DatabaseConfigurations.new(rails_configuration.database_configuration) }
|
|
|
|
subject do
|
|
load Rails.root.join('config/initializers/validate_database_config.rb')
|
|
end
|
|
|
|
before do
|
|
allow(File).to receive(:exist?).and_call_original
|
|
allow(File).to receive(:exist?).with(Rails.root.join("config/database_geo.yml")).and_return(false)
|
|
|
|
# The `AS::ConfigurationFile` calls `read` in `def initialize`
|
|
# thus we cannot use `expect_next_instance_of`
|
|
# rubocop:disable RSpec/AnyInstanceOf
|
|
expect_any_instance_of(ActiveSupport::ConfigurationFile)
|
|
.to receive(:read).with(Rails.root.join('config/database.yml')).and_return(database_yml)
|
|
# rubocop:enable RSpec/AnyInstanceOf
|
|
|
|
allow(Rails.application).to receive(:config).and_return(rails_configuration)
|
|
allow(ActiveRecord::Base).to receive(:configurations).and_return(ar_configurations)
|
|
end
|
|
|
|
shared_examples 'with SKIP_DATABASE_CONFIG_VALIDATION=true' do
|
|
before do
|
|
stub_env('SKIP_DATABASE_CONFIG_VALIDATION', 'true')
|
|
end
|
|
|
|
it 'does not raise exception' do
|
|
expect { subject }.not_to raise_error
|
|
end
|
|
end
|
|
|
|
context 'when config/database.yml is valid' do
|
|
context 'uses legacy syntax' do
|
|
let(:database_yml) do
|
|
<<-EOS
|
|
production:
|
|
adapter: postgresql
|
|
encoding: unicode
|
|
database: gitlabhq_production
|
|
username: git
|
|
password: "secure password"
|
|
host: localhost
|
|
EOS
|
|
end
|
|
|
|
it 'validates configuration with a warning' do
|
|
expect(main_object).to receive(:warn).with /uses a deprecated syntax for/
|
|
|
|
expect { subject }.not_to raise_error
|
|
end
|
|
|
|
it_behaves_like 'with SKIP_DATABASE_CONFIG_VALIDATION=true'
|
|
end
|
|
|
|
context 'uses new syntax' do
|
|
let(:database_yml) do
|
|
<<-EOS
|
|
production:
|
|
main:
|
|
adapter: postgresql
|
|
encoding: unicode
|
|
database: gitlabhq_production
|
|
username: git
|
|
password: "secure password"
|
|
host: localhost
|
|
EOS
|
|
end
|
|
|
|
it 'validates configuration without errors and warnings' do
|
|
expect(main_object).not_to receive(:warn)
|
|
|
|
expect { subject }.not_to raise_error
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'when config/database.yml is invalid' do
|
|
context 'uses unknown connection name' do
|
|
let(:database_yml) do
|
|
<<-EOS
|
|
production:
|
|
main:
|
|
adapter: postgresql
|
|
encoding: unicode
|
|
database: gitlabhq_production
|
|
username: git
|
|
password: "secure password"
|
|
host: localhost
|
|
|
|
another:
|
|
adapter: postgresql
|
|
encoding: unicode
|
|
database: gitlabhq_production
|
|
username: git
|
|
password: "secure password"
|
|
host: localhost
|
|
EOS
|
|
end
|
|
|
|
it 'raises exception' do
|
|
expect { subject }.to raise_error /This installation of GitLab uses unsupported database names/
|
|
end
|
|
|
|
it_behaves_like 'with SKIP_DATABASE_CONFIG_VALIDATION=true'
|
|
end
|
|
|
|
context 'uses replica configuration' do
|
|
let(:database_yml) do
|
|
<<-EOS
|
|
production:
|
|
main:
|
|
adapter: postgresql
|
|
encoding: unicode
|
|
database: gitlabhq_production
|
|
username: git
|
|
password: "secure password"
|
|
host: localhost
|
|
replica: true
|
|
EOS
|
|
end
|
|
|
|
it 'raises exception' do
|
|
expect { subject }.to raise_error /with 'replica: true' parameter in/
|
|
end
|
|
|
|
it_behaves_like 'with SKIP_DATABASE_CONFIG_VALIDATION=true'
|
|
end
|
|
|
|
context 'main is not a first entry' do
|
|
let(:database_yml) do
|
|
<<-EOS
|
|
production:
|
|
ci:
|
|
adapter: postgresql
|
|
encoding: unicode
|
|
database: gitlabhq_production_ci
|
|
username: git
|
|
password: "secure password"
|
|
host: localhost
|
|
replica: true
|
|
|
|
main:
|
|
adapter: postgresql
|
|
encoding: unicode
|
|
database: gitlabhq_production
|
|
username: git
|
|
password: "secure password"
|
|
host: localhost
|
|
replica: true
|
|
EOS
|
|
end
|
|
|
|
it 'raises exception' do
|
|
expect { subject }.to raise_error /The `main:` database needs to be defined as a first configuration item/
|
|
end
|
|
|
|
it_behaves_like 'with SKIP_DATABASE_CONFIG_VALIDATION=true'
|
|
end
|
|
end
|
|
end
|