Skip to content

Commit

Permalink
(Maint) Fix up the get_module_path parser function
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Jeff McCune committed Jul 23, 2012
1 parent 98ff3ab commit c129775
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 26 deletions.
2 changes: 1 addition & 1 deletion lib/puppet/parser/functions/get_module_path.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ module Puppet::Parser::Functions
$module_path = get_module_path('stdlib')
EOT
) do |args|
raise(Puppet::ParseError, "get_module_name(): Wrong number of arguments, expects one") unless args.size == 1
raise(Puppet::ParseError, "get_module_path(): Wrong number of arguments, expects one") unless args.size == 1
if module_path = Puppet::Module.find(args[0], compiler.environment.to_s)
module_path.path
else
Expand Down
52 changes: 27 additions & 25 deletions spec/unit/puppet/parser/functions/get_module_path_spec.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit c129775

Please sign in to comment.