spec/unit/module_loader/puppetfile_spec.rb in r10k-3.11.0 vs spec/unit/module_loader/puppetfile_spec.rb in r10k-3.12.0
- old
+ new
@@ -1,15 +1,15 @@
require 'spec_helper'
require 'r10k/module_loader/puppetfile'
+require 'tmpdir'
describe R10K::ModuleLoader::Puppetfile do
describe 'initial parameters' do
describe 'honor' do
let(:options) do
{
basedir: '/test/basedir/env',
- forge: 'localforge.internal.corp',
overrides: { modules: { deploy_modules: true } },
environment: R10K::Environment::Git.new('env',
'/test/basedir/',
'env',
{ remote: 'git://foo/remote',
@@ -45,14 +45,10 @@
puppetfile = R10K::ModuleLoader::Puppetfile.new(**relative_options)
expect(puppetfile.instance_variable_get(:@puppetfile_path)).to eq('/test/basedir/env/Puppetfile.global')
end
end
- it 'the forge' do
- expect(subject.instance_variable_get(:@forge)).to eq('localforge.internal.corp')
- end
-
it 'the overrides' do
expect(subject.instance_variable_get(:@overrides)).to eq({ modules: { deploy_modules: true }})
end
it 'the environment' do
@@ -69,14 +65,10 @@
it 'has a Puppetfile rooted in the basedir' do
expect(subject.instance_variable_get(:@puppetfile_path)).to eq('/test/basedir/Puppetfile')
end
- it 'uses the public forge' do
- expect(subject.instance_variable_get(:@forge)).to eq('forgeapi.puppetlabs.com')
- end
-
it 'creates an empty overrides' do
expect(subject.instance_variable_get(:@overrides)).to eq({})
end
it 'does not require an environment' do
@@ -89,18 +81,18 @@
let(:basedir) { '/test/basedir' }
subject { R10K::ModuleLoader::Puppetfile.new(basedir: basedir) }
it 'should transform Forge modules with a string arg to have a version key' do
- expect(R10K::Module).to receive(:new).with('puppet/test_module', subject.moduledir, hash_including(version: '1.2.3'), anything).and_call_original
+ expect(R10K::Module).to receive(:from_metadata).with('puppet/test_module', subject.moduledir, hash_including(version: '1.2.3'), anything).and_call_original
expect { subject.add_module('puppet/test_module', '1.2.3') }.to change { subject.modules }
expect(subject.modules.collect(&:name)).to include('test_module')
end
it 'should not accept Forge modules with a version comparison' do
- expect(R10K::Module).to receive(:new).with('puppet/test_module', subject.moduledir, hash_including(version: '< 1.2.0'), anything).and_call_original
+ expect(R10K::Module).to receive(:from_metadata).with('puppet/test_module', subject.moduledir, hash_including(version: '< 1.2.0'), anything).and_call_original
expect {
subject.add_module('puppet/test_module', '< 1.2.0')
}.to raise_error(RuntimeError, /module puppet\/test_module.*doesn't have an implementation/i)
@@ -120,11 +112,11 @@
end
it 'should accept non-Forge modules with a hash arg' do
module_opts = { git: 'git@example.com:puppet/test_module.git' }
- expect(R10K::Module).to receive(:new).with('puppet/test_module', subject.moduledir, module_opts, anything).and_call_original
+ expect(R10K::Module).to receive(:from_metadata).with('puppet/test_module', subject.moduledir, module_opts, anything).and_call_original
expect { subject.add_module('puppet/test_module', module_opts) }.to change { subject.modules }
expect(subject.modules.collect(&:name)).to include('test_module')
end
@@ -132,11 +124,11 @@
module_opts = {
install_path: 'vendor',
git: 'git@example.com:puppet/test_module.git',
}
- expect(R10K::Module).to receive(:new).with('puppet/test_module', File.join(basedir, 'vendor'), module_opts, anything).and_call_original
+ expect(R10K::Module).to receive(:from_metadata).with('puppet/test_module', File.join(basedir, 'vendor'), module_opts, anything).and_call_original
expect { subject.add_module('puppet/test_module', module_opts) }.to change { subject.modules }
expect(subject.modules.collect(&:name)).to include('test_module')
end
@@ -146,11 +138,11 @@
module_opts = {
install_path: install_path,
git: 'git@example.com:puppet/test_module.git',
}
- expect(R10K::Module).to receive(:new).with('puppet/test_module', install_path, module_opts, anything).and_call_original
+ expect(R10K::Module).to receive(:from_metadata).with('puppet/test_module', install_path, module_opts, anything).and_call_original
expect { subject.add_module('puppet/test_module', module_opts) }.to change { subject.modules }
expect(subject.modules.collect(&:name)).to include('test_module')
end
@@ -177,11 +169,11 @@
mod = instance_double('R10K::Module::Base', name: 'conflict', origin: :puppetfile, 'origin=': nil)
loader = R10K::ModuleLoader::Puppetfile.new(basedir: basedir, environment: env)
allow(env).to receive(:'module_conflicts?').with(mod).and_return(true)
allow(mod).to receive(:spec_deletable=)
- expect(R10K::Module).to receive(:new).with('conflict', anything, anything, anything).and_return(mod)
+ expect(R10K::Module).to receive(:from_metadata).with('conflict', anything, anything, anything).and_return(mod)
expect { loader.add_module('conflict', {}) }.not_to change { loader.modules }
end
end
describe '#purge_exclusions' do
@@ -212,25 +204,25 @@
before do
allow(subject).to receive(:puppetfile_content).and_return('')
end
it 'returns an array of paths that #purge! will operate within' do
- expect(R10K::Module).to receive(:new).with('puppet/test_module', subject.moduledir, hash_including(version: '1.2.3'), anything).and_call_original
+ expect(R10K::Module).to receive(:from_metadata).with('puppet/test_module', subject.moduledir, hash_including(version: '1.2.3'), anything).and_call_original
subject.add_module('puppet/test_module', '1.2.3')
- subject.load
+ subject.load!
expect(subject.modules.length).to be 1
expect(subject.managed_directories).to match_array([subject.moduledir])
end
context "with a module with install_path == ''" do
it "basedir isn't in the list of paths to purge" do
module_opts = { install_path: '', git: 'git@example.com:puppet/test_module.git' }
- expect(R10K::Module).to receive(:new).with('puppet/test_module', basedir, module_opts, anything).and_call_original
+ expect(R10K::Module).to receive(:from_metadata).with('puppet/test_module', basedir, module_opts, anything).and_call_original
subject.add_module('puppet/test_module', module_opts)
- subject.load
+ subject.load!
expect(subject.modules.length).to be 1
expect(subject.managed_directories).to be_empty
end
end
@@ -247,97 +239,165 @@
it 'wraps and re-raises syntax errors' do
@path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'invalid-syntax')
pf_path = File.join(@path, 'Puppetfile')
expect {
- subject.load
+ subject.load!
}.to raise_error do |e|
expect_wrapped_error(e, pf_path, SyntaxError)
end
end
it 'wraps and re-raises load errors' do
@path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'load-error')
pf_path = File.join(@path, 'Puppetfile')
expect {
- subject.load
+ subject.load!
}.to raise_error do |e|
expect_wrapped_error(e, pf_path, LoadError)
end
end
it 'wraps and re-raises argument errors' do
@path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'argument-error')
pf_path = File.join(@path, 'Puppetfile')
expect {
- subject.load
+ subject.load!
}.to raise_error do |e|
expect_wrapped_error(e, pf_path, ArgumentError)
end
end
+ describe 'forge declaration' do
+ before(:each) do
+ PuppetForge.host = ""
+ end
+
+ it 'is respected if `allow_puppetfile_override` is true' do
+ @path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'forge-override')
+ puppetfile = R10K::ModuleLoader::Puppetfile.new(basedir: @path, overrides: { forge: { allow_puppetfile_override: true } })
+ puppetfile.load!
+ expect(PuppetForge.host).to eq("my.custom.forge.com/")
+ end
+
+ it 'is ignored if `allow_puppetfile_override` is false' do
+ @path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'forge-override')
+ puppetfile = R10K::ModuleLoader::Puppetfile.new(basedir: @path, overrides: { forge: { allow_puppetfile_override: false } })
+ expect(PuppetForge).not_to receive(:host=).with("my.custom.forge.com")
+ puppetfile.load!
+ expect(PuppetForge.host).to eq("/")
+ end
+ end
+
it 'rejects Puppetfiles with duplicate module names' do
@path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'duplicate-module-error')
pf_path = File.join(@path, 'Puppetfile')
expect {
- subject.load
+ subject.load!
}.to raise_error(R10K::Error, /Puppetfiles cannot contain duplicate module names/i)
end
it 'wraps and re-raises name errors' do
@path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'name-error')
pf_path = File.join(@path, 'Puppetfile')
expect {
- subject.load
+ subject.load!
}.to raise_error do |e|
expect_wrapped_error(e, pf_path, NameError)
end
end
it 'accepts a forge module with a version' do
@path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'valid-forge-with-version')
pf_path = File.join(@path, 'Puppetfile')
- expect { subject.load }.not_to raise_error
+ expect { subject.load! }.not_to raise_error
end
describe 'setting a custom moduledir' do
it 'allows setting an absolute moduledir' do
@path = '/fake/basedir'
allow(subject).to receive(:puppetfile_content).and_return('moduledir "/fake/moduledir"')
- subject.load
+ subject.load!
expect(subject.instance_variable_get(:@moduledir)).to eq('/fake/moduledir')
end
it 'roots relative moduledirs in the basedir' do
@path = '/fake/basedir'
allow(subject).to receive(:puppetfile_content).and_return('moduledir "my/moduledir"')
- subject.load
+ subject.load!
expect(subject.instance_variable_get(:@moduledir)).to eq(File.join(@path, 'my/moduledir'))
end
end
it 'accepts a forge module without a version' do
@path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'valid-forge-without-version')
pf_path = File.join(@path, 'Puppetfile')
- expect { subject.load }.not_to raise_error
+ expect { subject.load! }.not_to raise_error
end
it 'creates a git module and applies the default branch specified in the Puppetfile' do
@path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'default-branch-override')
pf_path = File.join(@path, 'Puppetfile')
- expect { subject.load }.not_to raise_error
+ expect { subject.load! }.not_to raise_error
git_module = subject.modules[0]
expect(git_module.default_ref).to eq 'here_lies_the_default_branch'
end
it 'creates a git module and applies the provided default_branch_override' do
@path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'default-branch-override')
pf_path = File.join(@path, 'Puppetfile')
default_branch_override = 'default_branch_override_name'
subject.default_branch_override = default_branch_override
- expect { subject.load }.not_to raise_error
+ expect { subject.load! }.not_to raise_error
git_module = subject.modules[0]
expect(git_module.default_override_ref).to eq default_branch_override
expect(git_module.default_ref).to eq 'here_lies_the_default_branch'
+ end
+
+ describe 'using module metadata' do
+ it 'properly loads module metadata' do
+ @path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'various-modules')
+ metadata = subject.load_metadata[:modules].map { |mod| [ mod.name, mod.version ] }.to_h
+ expect(metadata['apt']).to eq('2.1.1')
+ expect(metadata['stdlib']).to eq(nil)
+ expect(metadata['concat']).to eq(nil)
+ expect(metadata['rpm']).to eq('2.1.1-pre1')
+ expect(metadata['foo']).to eq(nil)
+ expect(metadata['bar']).to eq('v1.2.3')
+ expect(metadata['baz']).to eq('123abc456')
+ expect(metadata['fizz']).to eq('1234567890abcdef1234567890abcdef12345678')
+ expect(metadata['buzz']).to eq(nil)
+ end
+
+ it 'does not load module implementations for static versioned' do
+ @path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'various-modules')
+ subject.load_metadata
+ modules = subject.load[:modules].map { |mod| [ mod.name, mod ] }.to_h
+ expect(modules['apt']).to be_a_kind_of(R10K::Module::Definition)
+ expect(modules['stdlib']).to be_a_kind_of(R10K::Module::Forge)
+ expect(modules['concat']).to be_a_kind_of(R10K::Module::Forge)
+ expect(modules['rpm']).to be_a_kind_of(R10K::Module::Definition)
+ expect(modules['foo']).to be_a_kind_of(R10K::Module::Git)
+ expect(modules['bar']).to be_a_kind_of(R10K::Module::Definition)
+ expect(modules['baz']).to be_a_kind_of(R10K::Module::Definition)
+ expect(modules['fizz']).to be_a_kind_of(R10K::Module::Definition)
+ expect(modules['buzz']).to be_a_kind_of(R10K::Module::Git)
+ end
+
+ it 'loads module implementations whose static versions are different' do
+ fixture_path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'various-modules')
+ @path = Dir.mktmpdir
+ unsynced_pf_path = File.join(fixture_path, 'Puppetfile')
+ FileUtils.cp(unsynced_pf_path, @path)
+
+ subject.load_metadata
+
+ synced_pf_path = File.join(fixture_path, 'Puppetfile.new')
+ FileUtils.cp(synced_pf_path, File.join(@path, 'Puppetfile'))
+
+ modules = subject.load[:modules].map { |mod| [ mod.name, mod ] }.to_h
+
+ expect(modules['apt']).to be_a_kind_of(R10K::Module::Forge)
+ end
end
end
end