vmpooler/spec/unit/vmpooler_spec.rb
Samuel Beaulieu 23efcc4cc0
(maint) Fix EXTRA_CONFIG merge behavior
Before this change if an extra config file had new keys they would get
merged to the main config but if it contained an existing key, like
'providers' it would overwrite the original config.
Adding a library 'deep_merge' to do a more natural merge, where existing keys
get sub-elements added together and arrays are combined like for the
pool configuration.
Adding spec tests around EXTRA_CONFIG as they were missing, by adding
and testing two new extra_config.yaml fixture files
2021-12-23 13:34:33 -06:00

74 lines
2.8 KiB
Ruby

require 'spec_helper'
describe 'Vmpooler' do
describe '.config' do
let(:config_file) { File.join(fixtures_dir, 'vmpooler2.yaml') }
let(:config) { YAML.load_file(config_file) }
before(:each) do
ENV['VMPOOLER_DEBUG'] = 'true'
ENV['VMPOOLER_CONFIG_FILE'] = nil
ENV['VMPOOLER_CONFIG'] = nil
end
context 'when no config is given' do
it 'defaults to vmpooler.yaml' do
default_config_file = File.join(fixtures_dir, 'vmpooler.yaml')
default_config = YAML.load_file(default_config_file)
Dir.chdir(fixtures_dir) do
expect(Vmpooler.config[:pools]).to eq(default_config[:pools])
end
end
it 'keeps a copy of the original pools at startup' do
Dir.chdir(fixtures_dir) do
configuration = Vmpooler.config
expect(configuration[:pools]).to eq(configuration[:pools_at_startup])
end
end
it 'the copy is a separate object and not a reference' do
Dir.chdir(fixtures_dir) do
configuration = Vmpooler.config
configuration[:pools][0]['template'] = 'sam'
expect(configuration[:pools]).not_to eq(configuration[:pools_at_startup])
end
end
end
context 'when config variable is set' do
it 'should use the config' do
ENV['VMPOOLER_CONFIG'] = config.to_yaml
expect(Vmpooler.config[:pools]).to eq(config[:pools])
end
end
context 'when config file is set' do
before(:each) do
ENV['VMPOOLER_CONFIG_FILE'] = config_file
end
it 'should use the file' do
expect(Vmpooler.config[:pools]).to eq(config[:pools])
end
it 'merges one extra file, results in two providers' do
ENV['EXTRA_CONFIG'] = File.join(fixtures_dir, 'extra_config1.yaml')
expect(Vmpooler.config[:providers].keys).to include(:dummy)
expect(Vmpooler.config[:providers].keys).to include(:alice)
end
it 'merges two extra file, results in three providers and an extra pool' do
extra1 = File.join(fixtures_dir, 'extra_config1.yaml')
extra2 = File.join(fixtures_dir, 'extra_config2.yaml')
ENV['EXTRA_CONFIG'] = "#{extra1},#{extra2}"
expect(Vmpooler.config[:providers].keys).to include(:dummy)
expect(Vmpooler.config[:providers].keys).to include(:alice)
expect(Vmpooler.config[:providers].keys).to include(:bob)
merged_pools = [{"name"=>"pool03", "provider"=>"dummy", "ready_ttl"=>5, "size"=>5},
{"name"=>"pool04", "provider"=>"dummy", "ready_ttl"=>5, "size"=>5},
{"name"=>"pool05", "provider"=>"dummy", "ready_ttl"=>5, "size"=>5}]
expect(Vmpooler.config[:pools]).to eq(merged_pools)
expect(Vmpooler.config[:config]).not_to be_nil #merge does not deleted existing keys
end
end
end
end