puppetlabs-stdlib/spec/acceptance/build_csv.rb
2014-05-07 15:00:30 -07:00

83 lines
2.5 KiB
Ruby
Executable file

#!/usr/bin/env ruby
# vim: set sw=2 sts=2 et tw=80 :
require 'rspec'
#XXX Super ugly hack to keep from starting beaker nodes
module Kernel
# make an alias of the original require
alias_method :original_require, :require
# rewrite require
def require name
original_require name if name != 'spec_helper_acceptance'
end
end
UNSUPPORTED_PLATFORMS = []
def fact(*args) [] end
#XXX End hax
# Get a list of functions for test coverage
function_list = Dir[File.join(File.dirname(__FILE__),"..","..","lib","puppet","parser","functions","*.rb")].collect do |function_rb|
File.basename(function_rb,".rb")
end
## Configure rspec to parse tests
options = RSpec::Core::ConfigurationOptions.new(['spec/acceptance'])
configuration = RSpec::configuration
world = RSpec::world
options.parse_options
options.configure(configuration)
configuration.load_spec_files
## Collect up tests and example groups into a hash
def get_tests(children)
children.inject({}) do |memo,c|
memo[c.description] = Hash.new
memo[c.description]["groups"] = get_tests(c.children) unless c.children.empty?
memo[c.description]["tests"] = c.examples.collect { |e|
e.description unless e.pending?
}.compact unless c.examples.empty?
memo[c.description]["pending_tests"] = c.examples.collect { |e|
e.description if e.pending?
}.compact unless c.examples.empty?
memo
end
end
def count_test_types_in(type,group)
return 0 if group.nil?
group.inject(0) do |m,(k,v)|
m += v.length if k == type
m += count_tests_in(v) if v.is_a?(Hash)
m
end
end
def count_tests_in(group)
count_test_types_in('tests',group)
end
def count_pending_tests_in(group)
count_test_types_in('pending_tests',group)
end
# Convert tests hash to csv format
def to_csv(function_list,tests)
function_list.collect do |function_name|
if v = tests["#{function_name} function"]
positive_tests = count_tests_in(v["groups"]["success"])
negative_tests = count_tests_in(v["groups"]["failure"])
pending_tests =
count_pending_tests_in(v["groups"]["failure"]) +
count_pending_tests_in(v["groups"]["failure"])
else
positive_tests = 0
negative_tests = 0
pending_tests = 0
end
sprintf("%-25s, %-9d, %-9d, %-9d", function_name,positive_tests,negative_tests,pending_tests)
end.compact
end
tests = get_tests(world.example_groups)
csv = to_csv(function_list,tests)
percentage_tested = "#{tests.count*100/function_list.count}%"
printf("%-25s, %-9s, %-9s, %-9s\n","#{percentage_tested} have tests.","Positive","Negative","Pending")
puts csv