summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--.sync.yml7
-rw-r--r--Gemfile3
-rw-r--r--Rakefile2
-rw-r--r--lib/puppet/parser/functions/defined_with_params.rb5
-rw-r--r--lib/puppet/type/file_line.rb4
l---------spec/fixtures/modules/stdlib/lib1
l---------spec/fixtures/modules/stdlib/manifests1
-rwxr-xr-xspec/functions/defined_with_params_spec.rb9
-rwxr-xr-xspec/functions/ensure_resource_spec.rb33
-rwxr-xr-xspec/functions/load_module_metadata_spec.rb43
-rw-r--r--spec/functions/loadjson_spec.rb67
12 files changed, 126 insertions, 52 deletions
diff --git a/.gitignore b/.gitignore
index dd126f2..95f271b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,6 @@ coverage/
log/
.idea/
*.iml
+!spec/fixtures/
+spec/fixtures/manifests/site.pp
+spec/fixtures/modules/*
diff --git a/.sync.yml b/.sync.yml
new file mode 100644
index 0000000..431b9d1
--- /dev/null
+++ b/.sync.yml
@@ -0,0 +1,7 @@
+---
+.gitignore:
+ paths:
+ - '!spec/fixtures/'
+ - 'spec/fixtures/manifests/site.pp'
+ - 'spec/fixtures/modules/*'
+
diff --git a/Gemfile b/Gemfile
index e490bc9..9b5b214 100644
--- a/Gemfile
+++ b/Gemfile
@@ -16,10 +16,11 @@ group :development, :unit_tests do
gem 'json', :require => false
gem 'metadata-json-lint', :require => false
gem 'puppet_facts', :require => false
- gem 'puppet-blacksmith', :require => false
gem 'puppetlabs_spec_helper', :require => false
gem 'rspec-puppet', '>= 2.3.2', :require => false
gem 'simplecov', :require => false
+ gem 'puppet-blacksmith', :require => false
+ gem 'rest-client', '~> 1.8.0', :require => false
end
group :system_tests do
gem 'beaker-rspec', *location_for(ENV['BEAKER_RSPEC_VERSION'] || '>= 3.4')
diff --git a/Rakefile b/Rakefile
index 3b07e4d..8906d23 100644
--- a/Rakefile
+++ b/Rakefile
@@ -4,7 +4,7 @@ require 'puppetlabs_spec_helper/rake_tasks'
PuppetLint.configuration.fail_on_warnings = true
PuppetLint.configuration.send('relative')
-PuppetLint.configuration.send('disable_char_check')
+PuppetLint.configuration.send('disable_140chars')
PuppetLint.configuration.send('disable_class_inherits_from_params_class')
PuppetLint.configuration.send('disable_documentation')
PuppetLint.configuration.send('disable_single_quote_string_with_variables')
diff --git a/lib/puppet/parser/functions/defined_with_params.rb b/lib/puppet/parser/functions/defined_with_params.rb
index d7df306..99687ae 100644
--- a/lib/puppet/parser/functions/defined_with_params.rb
+++ b/lib/puppet/parser/functions/defined_with_params.rb
@@ -26,7 +26,10 @@ ENDOFDOC
ret = false
if resource = findresource(reference.to_s)
matches = params.collect do |key, value|
- resource[key] == value
+ # eql? avoids bugs caused by monkeypatching in puppet
+ resource_is_undef = resource[key].eql?(:undef) || resource[key].nil?
+ value_is_undef = value.eql?(:undef) || value.nil?
+ (resource_is_undef && value_is_undef) || (resource[key] == value)
end
ret = params.empty? || !matches.include?(false)
end
diff --git a/lib/puppet/type/file_line.rb b/lib/puppet/type/file_line.rb
index f2c6937..a02b514 100644
--- a/lib/puppet/type/file_line.rb
+++ b/lib/puppet/type/file_line.rb
@@ -93,8 +93,8 @@ Puppet::Type.newtype(:file_line) do
newparam(:path) do
desc 'The file Puppet will ensure contains the line specified by the line parameter.'
validate do |value|
- unless (Puppet.features.posix? and value =~ /^\//) or (Puppet.features.microsoft_windows? and (value =~ /^.:\// or value =~ /^\/\/[^\/]+\/[^\/]+/))
- raise(Puppet::Error, "File paths must be fully qualified, not '#{value}'")
+ unless Puppet::Util.absolute_path?(value)
+ raise Puppet::Error, "File paths must be fully qualified, not '#{value}'"
end
end
end
diff --git a/spec/fixtures/modules/stdlib/lib b/spec/fixtures/modules/stdlib/lib
deleted file mode 120000
index b6ce6cc..0000000
--- a/spec/fixtures/modules/stdlib/lib
+++ /dev/null
@@ -1 +0,0 @@
-../../../../lib/ \ No newline at end of file
diff --git a/spec/fixtures/modules/stdlib/manifests b/spec/fixtures/modules/stdlib/manifests
deleted file mode 120000
index cdcdae0..0000000
--- a/spec/fixtures/modules/stdlib/manifests
+++ /dev/null
@@ -1 +0,0 @@
-../../../../manifests/ \ No newline at end of file
diff --git a/spec/functions/defined_with_params_spec.rb b/spec/functions/defined_with_params_spec.rb
index 516d986..e2f3abe 100755
--- a/spec/functions/defined_with_params_spec.rb
+++ b/spec/functions/defined_with_params_spec.rb
@@ -23,4 +23,13 @@ describe 'defined_with_params' do
it { is_expected.to run.with_params('User[dan]', {'ensure' => 'present', 'managehome' => false}).and_return(true) }
it { is_expected.to run.with_params('User[dan]', {'ensure' => 'absent', 'managehome' => false}).and_return(false) }
end
+
+ describe 'when passing undef values' do
+ let :pre_condition do
+ 'file { "/tmp/a": ensure => present }'
+ end
+
+ it { is_expected.to run.with_params('File[/tmp/a]', {}).and_return(true) }
+ it { is_expected.to run.with_params('File[/tmp/a]', { 'ensure' => 'present', 'owner' => :undef }).and_return(true) }
+ end
end
diff --git a/spec/functions/ensure_resource_spec.rb b/spec/functions/ensure_resource_spec.rb
index c4f2cbd..9a17f5b 100755
--- a/spec/functions/ensure_resource_spec.rb
+++ b/spec/functions/ensure_resource_spec.rb
@@ -10,6 +10,32 @@ describe 'ensure_resource' do
is_expected.to run.with_params(1,2,3).and_raise_error(Puppet::ParseError)
}
+ context 'given an empty catalog' do
+ describe 'after running ensure_resource("user", "username1", {})' do
+ before { subject.call(['User', 'username1', {}]) }
+
+ # this lambda is required due to strangeness within rspec-puppet's expectation handling
+ it { expect(lambda { catalogue }).to contain_user('username1').without_ensure }
+ end
+
+ describe 'after running ensure_resource("user", "username1", { gid => undef })' do
+ before { subject.call(['User', 'username1', { 'gid' => :undef }]) }
+
+ # this lambda is required due to strangeness within rspec-puppet's expectation handling
+ it { expect(lambda { catalogue }).to contain_user('username1').without_ensure }
+ it { expect(lambda { catalogue }).to contain_user('username1').without_gid }
+ end
+
+ describe 'after running ensure_resource("user", "username1", { ensure => present, gid => undef })' do
+ before { subject.call(['User', 'username1', { 'ensure' => 'present', 'gid' => :undef }]) }
+
+ # this lambda is required due to strangeness within rspec-puppet's expectation handling
+ it { expect(lambda { catalogue }).to contain_user('username1').with_ensure('present') }
+ it { expect(lambda { catalogue }).to contain_user('username1').without_gid }
+ end
+
+ end
+
context 'given a catalog with "user { username1: ensure => present }"' do
let(:pre_condition) { 'user { username1: ensure => present }' }
@@ -28,6 +54,13 @@ describe 'ensure_resource' do
it { expect(lambda { catalogue }).to contain_user('username2').without_ensure }
end
+ describe 'after running ensure_resource("user", "username1", { gid => undef })' do
+ before { subject.call(['User', 'username1', { 'gid' => :undef }]) }
+
+ # this lambda is required due to strangeness within rspec-puppet's expectation handling
+ it { expect(lambda { catalogue }).to contain_user('username1').with_ensure('present') }
+ end
+
describe 'after running ensure_resource("user", ["username1", "username2"], {})' do
before { subject.call(['User', ['username1', 'username2'], {}]) }
diff --git a/spec/functions/load_module_metadata_spec.rb b/spec/functions/load_module_metadata_spec.rb
index fe665fb..1a61e2c 100755
--- a/spec/functions/load_module_metadata_spec.rb
+++ b/spec/functions/load_module_metadata_spec.rb
@@ -5,25 +5,34 @@ describe 'load_module_metadata' do
it { is_expected.to run.with_params().and_raise_error(Puppet::ParseError, /wrong number of arguments/i) }
it { is_expected.to run.with_params("one", "two", "three").and_raise_error(Puppet::ParseError, /wrong number of arguments/i) }
- it "should json parse the file" do
- allow(scope).to receive(:function_get_module_path).with(['science']).and_return('/path/to/module/')
- allow(File).to receive(:exists?).with(/metadata.json/).and_return(true)
- allow(File).to receive(:read).with(/metadata.json/).and_return('{"name": "spencer-science"}')
+ describe "when calling with valid arguments" do
+ before :each do
+ if RSpec.configuration.puppet_future
+ allow(File).to receive(:read).with(/\/stdlib\/metadata.json/, {:encoding=>"utf-8"}).and_return('{"name": "puppetlabs-stdlib"}')
+ else
+ allow(File).to receive(:read).with(/\/stdlib\/metadata.json/).and_return('{"name": "puppetlabs-stdlib"}')
+ end
+ end
+ it "should json parse the file" do
+ allow(scope).to receive(:function_get_module_path).with(['science']).and_return('/path/to/module/')
+ allow(File).to receive(:exists?).with('/path/to/module/metadata.json').and_return(true)
+ allow(File).to receive(:read).with('/path/to/module/metadata.json').and_return('{"name": "spencer-science"}')
- result = subject.call(['science'])
- expect(result['name']).to eq('spencer-science')
- end
+ result = subject.call(['science'])
+ expect(result['name']).to eq('spencer-science')
+ end
- it "should fail by default if there is no metadata.json" do
- allow(scope).to receive(:function_get_module_path).with(['science']).and_return('/path/to/module/')
- allow(File).to receive(:exists?).with(/metadata.json/).and_return(false)
- expect {subject.call(['science'])}.to raise_error(Puppet::ParseError)
- end
+ it "should fail by default if there is no metadata.json" do
+ allow(scope).to receive(:function_get_module_path).with(['science']).and_return('/path/to/module/')
+ allow(File).to receive(:exists?).with('/path/to/module/metadata.json').and_return(false)
+ expect {subject.call(['science'])}.to raise_error(Puppet::ParseError)
+ end
- it "should return nil if user allows empty metadata.json" do
- allow(scope).to receive(:function_get_module_path).with(['science']).and_return('/path/to/module/')
- allow(File).to receive(:exists?).with(/metadata.json/).and_return(false)
- result = subject.call(['science', true])
- expect(result).to eq({})
+ it "should return nil if user allows empty metadata.json" do
+ allow(scope).to receive(:function_get_module_path).with(['science']).and_return('/path/to/module/')
+ allow(File).to receive(:exists?).with('/path/to/module/metadata.json').and_return(false)
+ result = subject.call(['science', true])
+ expect(result).to eq({})
+ end
end
end
diff --git a/spec/functions/loadjson_spec.rb b/spec/functions/loadjson_spec.rb
index 12a9b82..a00dff9 100644
--- a/spec/functions/loadjson_spec.rb
+++ b/spec/functions/loadjson_spec.rb
@@ -4,35 +4,46 @@ describe 'loadjson' do
it { is_expected.not_to eq(nil) }
it { is_expected.to run.with_params().and_raise_error(ArgumentError, /wrong number of arguments/i) }
- context 'when a non-existing file is specified' do
- let(:filename) { '/tmp/doesnotexist' }
- before {
- File.expects(:exists?).with(filename).returns(false).once
- PSON.expects(:load).never
- }
- it { is_expected.to run.with_params(filename, {'default' => 'value'}).and_return({'default' => 'value'}) }
- end
+ describe "when calling with valid arguments" do
+ before :each do
+ if RSpec.configuration.puppet_future
+ allow(File).to receive(:read).with(/\/stdlib\/metadata.json/, {:encoding=>"utf-8"}).and_return('{"name": "puppetlabs-stdlib"}')
+ else
+ allow(File).to receive(:read).with(/\/stdlib\/metadata.json/).and_return('{"name": "puppetlabs-stdlib"}')
+ end
+ end
- context 'when an existing file is specified' do
- let(:filename) { '/tmp/doesexist' }
- let(:data) { { 'key' => 'value' } }
- let(:json) { '{"key":"value"}' }
- before {
- File.expects(:exists?).with(filename).returns(true).once
- File.expects(:read).with(filename).returns(json).once
- PSON.expects(:load).with(json).returns(data).once
- }
- it { is_expected.to run.with_params(filename).and_return(data) }
- end
+ context 'when a non-existing file is specified' do
+ let(:filename) { '/tmp/doesnotexist' }
+ before {
+ allow(File).to receive(:exists?).with(filename).and_return(false).once
+ allow(PSON).to receive(:load).never
+ }
+ it { is_expected.to run.with_params(filename, {'default' => 'value'}).and_return({'default' => 'value'}) }
+ end
+
+ context 'when an existing file is specified' do
+ let(:filename) { '/tmp/doesexist' }
+ let(:data) { { 'key' => 'value' } }
+ let(:json) { '{"key":"value"}' }
+ before {
+ allow(File).to receive(:exists?).with(filename).and_return(true).once
+ allow(File).to receive(:read).with(filename).and_return(json).once
+ allow(File).to receive(:read).with(filename).and_return(json).once
+ allow(PSON).to receive(:load).with(json).and_return(data).once
+ }
+ it { is_expected.to run.with_params(filename).and_return(data) }
+ end
- context 'when the file could not be parsed' do
- let(:filename) { '/tmp/doesexist' }
- let(:json) { '{"key":"value"}' }
- before {
- File.expects(:exists?).with(filename).returns(true).once
- File.expects(:read).with(filename).returns(json).once
- PSON.stubs(:load).with(json).once.raises StandardError, 'Something terrible have happened!'
- }
- it { is_expected.to run.with_params(filename, {'default' => 'value'}).and_return({'default' => 'value'}) }
+ context 'when the file could not be parsed' do
+ let(:filename) { '/tmp/doesexist' }
+ let(:json) { '{"key":"value"}' }
+ before {
+ allow(File).to receive(:exists?).with(filename).and_return(true).once
+ allow(File).to receive(:read).with(filename).and_return(json).once
+ allow(PSON).to receive(:load).with(json).once.and_raise StandardError, 'Something terrible have happened!'
+ }
+ it { is_expected.to run.with_params(filename, {'default' => 'value'}).and_return({'default' => 'value'}) }
+ end
end
end