Add helper script to configure a module for rspec-puppet testing

This commit is contained in:
Tim Sharpe 2012-03-13 10:05:39 +11:00
parent a1b5ebe25d
commit 4300f25d22
4 changed files with 169 additions and 0 deletions

20
bin/rspec-puppet-init Executable file
View File

@ -0,0 +1,20 @@
#!/usr/bin/env ruby
$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
require 'rspec-puppet'
require 'optparse'
options = {
:module_name => nil,
}
OptionParser.new do |opts|
opts.banner = "Usage: rspec-puppet-init [options]"
opts.on('-n', '--name NAME', 'The name of the module (override autodetection)') do |v|
options[:module_name] = v
end
end.parse!
RSpec::Puppet::Setup.run(options[:module_name])

View File

@ -2,6 +2,7 @@ require 'puppet'
require 'rspec'
require 'rspec-puppet/matchers'
require 'rspec-puppet/example'
require 'rspec-puppet/setup'
RSpec.configure do |c|
c.add_setting :module_path, :default => '/etc/puppet/modules'

144
lib/rspec-puppet/setup.rb Normal file
View File

@ -0,0 +1,144 @@
require 'puppet'
require 'fileutils'
module RSpec::Puppet
class Setup
def self.run(module_name=nil)
unless is_module_dir?
$stderr.puts "Does not appear to be a Puppet module. Aborting"
return false
end
if module_name.nil?
module_name = get_module_name
if module_name.nil?
$stderr.puts "Unable to determine module name. Aborting"
return false
end
end
[
'spec',
'spec/classes',
'spec/defines',
'spec/functions',
'spec/hosts',
'spec/fixtures',
'spec/fixtures/manifests',
'spec/fixtures/modules',
"spec/fixtures/modules/#{module_name}",
].each { |dir| safe_mkdir(dir) }
safe_touch('spec/fixtures/manifests/site.pp')
['manifests','lib','files','templates'].each do |dir|
if File.exist? dir
safe_make_symlink("../../../../#{dir}", "spec/fixtures/modules/#{module_name}/#{dir}")
end
end
safe_create_spec_helper
safe_create_rakefile
end
protected
def self.get_module_name
p = Puppet::Parser::Lexer.new
module_name = nil
Dir["manifests/*.pp"].entries.each do |manifest|
p.string = File.read(manifest)
tokens = p.fullscan
i = tokens.index { |token| [:CLASS, :DEFINE].include? token.first }
unless i.nil?
module_name = tokens[i + 1].last[:value].split('::').first
break
end
end
module_name
end
def self.is_module_dir?
Dir["*"].entries.include? "manifests"
end
def self.safe_mkdir(dir)
if File.exists? dir
unless File.directory? dir
$stderr.puts "!! #{dir} already exists and is not a directory"
end
else
FileUtils.mkdir dir
puts " + #{dir}/"
end
end
def self.safe_touch(file)
if File.exists? file
unless File.file? file
$stderr.puts "!! #{file} already exists and is not a regular file"
end
else
FileUtils.touch file
puts " + #{file}"
end
end
def self.safe_create_spec_helper
content = <<-EOF
require 'rspec-puppet'
fixture_path = File.expand_path(File.join(__FILE__, '..', '..', 'fixtures'))
RSpec.configure do |c|
c.module_path = File.join(fixture_path, 'modules')
c.manifest_dir = File.join(fixture_path, 'manifests')
end
EOF
if File.exists? 'spec/spec_helper.rb'
old_content = File.read('spec/spec_helper.rb')
if old_content != content
$stderr.puts "!! spec/spec_helper.rb already exists and differs from template"
end
else
File.open('spec/spec_helper.rb', 'w') do |f|
f.puts content
end
puts ' + spec/spec_helper.rb'
end
end
def self.safe_make_symlink(source, target)
if File.exists? target
unless File.symlink? target
$stderr.puts "!! #{file} already exists and is not a symlink"
end
else
FileUtils.ln_s(source, target)
puts " + #{target}"
end
end
def self.safe_create_rakefile
content = <<-EOF
require 'rake'
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec) do |t|
t.pattern = 'spec/*/*_spec.rb'
end
EOF
if File.exists? 'Rakefile'
old_content = File.read('Rakefile')
if old_content != content
$stderr.puts "!! Rakefile already exists and differs from template"
end
else
File.open('Rakefile', 'w') do |f|
f.puts content
end
puts ' + Rakefile'
end
end
end
end

View File

@ -5,7 +5,10 @@ Gem::Specification.new do |s|
s.summary = 'RSpec tests for your Puppet manifests'
s.description = 'RSpec tests for your Puppet manifests'
s.executables = ['rspec-puppet-init']
s.files = [
'bin/rspec-puppet-init',
'lib/rspec-puppet/example/class_example_group.rb',
'lib/rspec-puppet/example/define_example_group.rb',
'lib/rspec-puppet/example/function_example_group.rb',
@ -16,6 +19,7 @@ Gem::Specification.new do |s|
'lib/rspec-puppet/matchers/include_class.rb',
'lib/rspec-puppet/matchers/run.rb',
'lib/rspec-puppet/matchers.rb',
'lib/rspec-puppet/setup.rb',
'lib/rspec-puppet/support.rb',
'lib/rspec-puppet.rb',
'LICENSE',