spec/gitlab/qa/runtime/omnibus_configuration_spec.rb (214 lines of code) (raw):

# frozen_string_literal: true module Gitlab::QA::Runtime RSpec.describe OmnibusConfiguration do subject(:omnibusConfiguration) { described_class.new } describe '#initialize' do it 'contains an initial comment denoting GitLab QA' do expect(omnibusConfiguration.instance_variable_get(:@config).size).to eq(1) expect(omnibusConfiguration.instance_variable_get(:@config).first).to include('GitLab QA') end context 'when prefix is specified' do let(:prefixed_configuration) { '# prefixed' } let(:generated_comment_configuration) do "# Generated by GitLab QA Omnibus Configurator at YYYY-MM-DD HH:MM:SS\n# prefixed" end it 'inserts configuration after the generation comment' do expect(described_class.new(prefixed_configuration).instance_variable_get(:@config).last) .to eq(prefixed_configuration) end it 'removes any duplicated generated by comments' do config = described_class.new(generated_comment_configuration).instance_variable_get(:@config) expect(config.last.split("\n").size).to eq(1) end end end describe '#expand_config_template' do let(:gitlab) do instance_double( Gitlab::QA::Component::Gitlab, address: "http://gitlab.test", class: Struct.new(:name).new("Gitlab::QA::Component::Gitlab") ) end it 'expands the ERB template' do omnibusConfiguration.<< "gitlab_rails['a'] = external_url '<%= gitlab.address %>'" omnibusConfiguration.expand_config_template(gitlab) expect(omnibusConfiguration.instance_variable_get(:@config).last).to include('http://gitlab.test') end end describe '#sanitize!' do it 'removes duplicate omnibus entries' do omnibusConfiguration.<< "gitlab_rails['a'] = true" omnibusConfiguration.<< "gitlab_rails['a'] = true" # intentional duplicate omnibusConfiguration.<< "gitlab_rails['b'] = true" expect(omnibusConfiguration.sanitize!.size).to eq(3) # +1 from the configurator comment end it 'removes duplicate omnibus entries in multiline config' do omnibusConfiguration.<< <<~OMNIBUS a['setting_1'] = true a['setting_3'] = false OMNIBUS omnibusConfiguration.<< <<~OMNIBUS a['setting_1'] = true a['setting_4'] = false OMNIBUS expect(omnibusConfiguration.sanitize!.size).to eq(4) # +1 from the configurator comment end it 'splits each setting into an array item' do omnibusConfiguration.<< <<~OMNIBUS a['setting_1'] = true external_url 'http://gitlab.test a['setting_2'] = [ { name: 'setting_2a_name', id: 'setting_2a_id' }, { name: 'setting_2b_name', id: 'setting_2b_id' }, ] a['setting_3'] = false OMNIBUS expect(omnibusConfiguration.sanitize!.size).to eq(5) # +1 from the configurator comment end it 'merges entries with an array' do omnibusConfiguration.<< <<~OMNIBUS gitlab_rails['omniauth_providers'] = [ { name: 'github', app_id: '$QA_GITHUB_OAUTH_APP_ID', app_secret: '$QA_GITHUB_OAUTH_APP_SECRET', url: 'https://github.com/', verify_ssl: false, args: { scope: 'user:email' } } ] gitlab_rails['omniauth_allow_single_sign_on'] = ['github'] OMNIBUS expected_output_1 = <<~OMNIBUS gitlab_rails['omniauth_providers'] = [ { name: 'github', app_id: '$QA_GITHUB_OAUTH_APP_ID', app_secret: '$QA_GITHUB_OAUTH_APP_SECRET', url: 'https://github.com/', verify_ssl: false, args: { scope: 'user:email' } }] OMNIBUS expected_output_2 = "gitlab_rails['omniauth_allow_single_sign_on'] = ['github']" expect(omnibusConfiguration.sanitize![1]).to eq expected_output_1.chomp expect(omnibusConfiguration.sanitize![2]).to eq expected_output_2.chomp end it 'detects duplicate entries' do omnibusConfiguration.<< "gitlab_rails['a'] = true" omnibusConfiguration.<< "gitlab_rails['a'] = false" expect { omnibusConfiguration.sanitize! }.to raise_error(RuntimeError) end it 'removes duplicate omnibus entries in multiline config' do omnibusConfiguration.<< <<~OMNIBUS a['setting_1'] = false a['setting_3'] = false OMNIBUS omnibusConfiguration.<< <<~OMNIBUS a['setting_1'] = true a['setting_4'] = false OMNIBUS expect { omnibusConfiguration.sanitize! }.to raise_error(RuntimeError) end it 'sanitizes a malformed configuration' do omnibusConfiguration.<< "gitlab_rails['a']=true" # well formed # gitlab_rails['a'] = true # vs gitlab_rails['a']=true expect(omnibusConfiguration.sanitize!.last).to eq("gitlab_rails['a'] = true") end it 'allows comments' do omnibusConfiguration.<< "# test" omnibusConfiguration.<< "a = true" expect(omnibusConfiguration.sanitize!.size).to eq(3) # +1 from the configurator comment end it 'leaves multiple equal signs alone' do omnibusConfiguration.<< <<~RUBY a['test'] = { "key" => "value" } RUBY expect(omnibusConfiguration.sanitize!.last).to eq(%(a['test'] = { 'key' => 'value' })) end it 'converts double quotes into single quotes' do omnibusConfiguration.<< %(a['test'] = { "foo" => "bar" }) expect(omnibusConfiguration.sanitize!.last).to eq("a['test'] = { 'foo' => 'bar' }") end it 'allows space-separated DSL-type entries' do omnibusConfiguration.<< %(mattermost_url 'abc123.test') expect(omnibusConfiguration.sanitize!.last).to eq("mattermost_url 'abc123.test'") end it 'method invocations' do omnibusConfiguration.<< <<~OMNIBUS gitaly['configuration'] = { storage: [ { name: 'default', path: '/test/default/repositories', }, { name: 'alternative', path: '/test/alternative/repositories', } ], } OMNIBUS expect(omnibusConfiguration.sanitize!.size).to eq(2) end end describe '#<<' do it 'adds the config to the base configuration' do omnibusConfiguration.<< "gitlab_rails['a'] = true" expect(omnibusConfiguration.instance_variable_get(:@config).size).to eq(2) # +1 from the configurator comment end it 'strips any newlines off' do omnibusConfiguration.<< "gitlab_rails['a'] = true\n" expect(omnibusConfiguration.instance_variable_get(:@config).last).to eq("gitlab_rails['a'] = true") end it 'ignores empty configurations' do omnibusConfiguration.<< "\n" expect(omnibusConfiguration.instance_variable_get(:@config).size).to eq(1) end end describe OmnibusConfigurations::Default do describe '#configuration' do it 'has a default configuration' do expect(omnibusConfiguration.configuration).not_to be_empty end it 'is a String type' do expect(omnibusConfiguration.configuration).to be_a String end it 'sets a theme' do expect(omnibusConfiguration.configuration) .to include("gitlab_rails['gitlab_default_theme']") end it 'disables animations' do expect(omnibusConfiguration.configuration) .to include("gitlab_rails['gitlab_disable_animations'] = true") end it 'sets cache expiry' do expect(omnibusConfiguration.configuration) .to include("gitlab_rails['application_settings_cache_seconds'] = 0") end end end describe OmnibusConfigurations::ObjectStorage do it 'has a preparation method' do expect(described_class.instance_methods(false)).to include(:prepare) end it 'has exec commands' do expect(described_class.instance_methods(false)).to include(:exec_commands) end describe '#prepare' do subject(:clazz) { described_class.new } it 'returns an instance of Component::Base' do expect(clazz.prepare).to be_a(Gitlab::QA::Component::Base) end end end end end