diff options
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | .sync.yml | 7 | ||||
-rw-r--r-- | Gemfile | 3 | ||||
-rw-r--r-- | Rakefile | 2 | ||||
-rw-r--r-- | lib/puppet/parser/functions/defined_with_params.rb | 5 | ||||
-rw-r--r-- | lib/puppet/type/file_line.rb | 4 | ||||
l--------- | spec/fixtures/modules/stdlib/lib | 1 | ||||
l--------- | spec/fixtures/modules/stdlib/manifests | 1 | ||||
-rwxr-xr-x | spec/functions/defined_with_params_spec.rb | 9 | ||||
-rwxr-xr-x | spec/functions/ensure_resource_spec.rb | 33 | ||||
-rwxr-xr-x | spec/functions/load_module_metadata_spec.rb | 43 | ||||
-rw-r--r-- | spec/functions/loadjson_spec.rb | 67 |
12 files changed, 126 insertions, 52 deletions
@@ -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/*' + @@ -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') @@ -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 |