From c1297755d4af11eb918ad987983ebd8398e38f58 Mon Sep 17 00:00:00 2001 From: Jeff McCune Date: Thu, 19 Jul 2012 17:37:39 -0700 Subject: (Maint) Fix up the get_module_path parser function This patch switches the spec tests for the get_module_path function to use mock objects. The underlying Puppet::Module.find method has reasonable test coverage inside of Puppet core so we might as well break the tight dependency while we're fixing up the specs to use the new parser scope. The behavior of the parser function itself should still have complete coverage even though the tests have switched to mock the implementation inside of Puppet. --- .../parser/functions/get_module_path_spec.rb | 52 +++++++++++----------- 1 file changed, 27 insertions(+), 25 deletions(-) (limited to 'spec/unit/puppet/parser/functions/get_module_path_spec.rb') diff --git a/spec/unit/puppet/parser/functions/get_module_path_spec.rb b/spec/unit/puppet/parser/functions/get_module_path_spec.rb index d8340f4..0a769eb 100644 --- a/spec/unit/puppet/parser/functions/get_module_path_spec.rb +++ b/spec/unit/puppet/parser/functions/get_module_path_spec.rb @@ -1,42 +1,44 @@ -#!/usr/bin/env rspec -require 'puppet' -require 'fileutils' +#! /usr/bin/env ruby -S rspec require 'spec_helper' + describe Puppet::Parser::Functions.function(:get_module_path) do - include PuppetSpec::Files + Internals = PuppetlabsSpec::PuppetInternals - def get_scope(environment = 'production') - scope = Puppet::Parser::Scope.new - scope.compiler = Puppet::Parser::Compiler.new(Puppet::Node.new("floppy", :environment => environment)) - scope + def scope(environment = "production") + Internals.scope(:compiler => Internals.compiler(:node => Internals.node(:environment => environment))) end + it 'should only allow one argument' do - expect { get_scope.function_get_module_path([]) }.should raise_error(Puppet::ParseError, /Wrong number of arguments, expects one/) - expect { get_scope.function_get_module_path(['1','2','3']) }.should raise_error(Puppet::ParseError, /Wrong number of arguments, expects one/) + expect { scope.function_get_module_path([]) }.should raise_error(Puppet::ParseError, /Wrong number of arguments, expects one/) + expect { scope.function_get_module_path(['1','2','3']) }.should raise_error(Puppet::ParseError, /Wrong number of arguments, expects one/) end it 'should raise an exception when the module cannot be found' do - expect { get_scope.function_get_module_path(['foo']) }.should raise_error(Puppet::ParseError, /Could not find module/) + expect { scope.function_get_module_path(['foo']) }.should raise_error(Puppet::ParseError, /Could not find module/) end describe 'when locating a module' do - let(:modulepath) { tmpdir('modulepath') } - let(:foo_path) { File.join(modulepath, 'foo') } - before(:each) { FileUtils.mkdir(foo_path) } + let(:modulepath) { "/tmp/does_not_exist" } + let(:path_of_module_foo) do + mod = mock("Puppet::Module") + mod.stubs(:path).returns("/tmp/does_not_exist/foo") + mod + end + + before(:each) { Puppet[:modulepath] = modulepath } + it 'should be able to find module paths from the modulepath setting' do - Puppet[:modulepath] = modulepath - get_scope.function_get_module_path(['foo']).should == foo_path + Puppet::Module.expects(:find).with('foo', 'production').returns(path_of_module_foo) + scope.function_get_module_path(['foo']).should == path_of_module_foo.path end it 'should be able to find module paths when the modulepath is a list' do Puppet[:modulepath] = modulepath + ":/tmp" - get_scope.function_get_module_path(['foo']).should == foo_path + Puppet::Module.expects(:find).with('foo', 'production').returns(path_of_module_foo) + scope.function_get_module_path(['foo']).should == path_of_module_foo.path end - it 'should be able to find module paths from the environment' do - conf_file = tmpfile('conffile') - File.open(conf_file, 'w') do |fh| - fh.write("[dansenvironment]\nmodulepath = #{modulepath}") - end - Puppet[:config] = conf_file - Puppet.parse_config - get_scope('dansenvironment').function_get_module_path(['foo']).should ==foo_path + it 'should respect the environment' do + pending("Disabled on Puppet 2.6.x") if Puppet.version =~ /^2\.6\b/ + Puppet.settings[:environment] = 'danstestenv' + Puppet::Module.expects(:find).with('foo', 'danstestenv').returns(path_of_module_foo) + scope('danstestenv').function_get_module_path(['foo']).should == path_of_module_foo.path end end end -- cgit v1.2.3 From fd2ce0d24797b22022ecb14c32ffe88ff70de319 Mon Sep 17 00:00:00 2001 From: Jeff McCune Date: Mon, 23 Jul 2012 15:47:51 -0700 Subject: (Maint) Don't mock with mocha Without this patch applied the stdlib module has load-order issues with mocha and rspec-puppet. The root cause has yet to be determined, but we've narrowed it down to this description: "If any rspec-puppet example groups run before parser function example groups and the parser function example groups use mock() then you'll get this error:" You can exercise this explicitly with: rspec -fd spec/unit/puppet/{provider,type,parser} This will ensure rspec runs all of the provider and type spec tests, which are rspec-puppet ones, before the parser function specs are run. I should also note we empted out the test in the file_line provider to be nothing except an empty describe block and this was still sufficient to trigger the load order error described here. Failures: 1) function_get_module_path when locating a module should be able to find module paths from the modulepath setting Failure/Error: mod = mock("Puppet::Module") NoMethodError: undefined method `mock' for # # ./spec/unit/puppet/parser/functions/get_module_path_spec.rb:21 # ./spec/unit/puppet/parser/functions/get_module_path_spec.rb:29 2) function_get_module_path when locating a module should be able to find module paths when the modulepath is a list Failure/Error: mod = mock("Puppet::Module") NoMethodError: undefined method `mock' for # # ./spec/unit/puppet/parser/functions/get_module_path_spec.rb:21 # ./spec/unit/puppet/parser/functions/get_module_path_spec.rb:34 3) function_get_module_path when locating a module should respect the environment Failure/Error: mod = mock("Puppet::Module") NoMethodError: undefined method `mock' for # # ./spec/unit/puppet/parser/functions/get_module_path_spec.rb:21 # ./spec/unit/puppet/parser/functions/get_module_path_spec.rb:40 Finished in 1.53 seconds 326 examples, 3 failures, 1 pending Paired-with: Andrew Parker --- spec/unit/puppet/parser/functions/get_module_path_spec.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'spec/unit/puppet/parser/functions/get_module_path_spec.rb') diff --git a/spec/unit/puppet/parser/functions/get_module_path_spec.rb b/spec/unit/puppet/parser/functions/get_module_path_spec.rb index 0a769eb..e761706 100644 --- a/spec/unit/puppet/parser/functions/get_module_path_spec.rb +++ b/spec/unit/puppet/parser/functions/get_module_path_spec.rb @@ -3,6 +3,12 @@ require 'spec_helper' describe Puppet::Parser::Functions.function(:get_module_path) do Internals = PuppetlabsSpec::PuppetInternals + class StubModule + attr_reader :path + def initialize(path) + @path = path + end + end def scope(environment = "production") Internals.scope(:compiler => Internals.compiler(:node => Internals.node(:environment => environment))) @@ -17,11 +23,7 @@ describe Puppet::Parser::Functions.function(:get_module_path) do end describe 'when locating a module' do let(:modulepath) { "/tmp/does_not_exist" } - let(:path_of_module_foo) do - mod = mock("Puppet::Module") - mod.stubs(:path).returns("/tmp/does_not_exist/foo") - mod - end + let(:path_of_module_foo) { StubModule.new("/tmp/does_not_exist/foo") } before(:each) { Puppet[:modulepath] = modulepath } -- cgit v1.2.3