diff options
Diffstat (limited to 'code/environments/production/modules/stdlib/spec/acceptance/build_csv.rb')
-rw-r--r-- | code/environments/production/modules/stdlib/spec/acceptance/build_csv.rb | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/code/environments/production/modules/stdlib/spec/acceptance/build_csv.rb b/code/environments/production/modules/stdlib/spec/acceptance/build_csv.rb new file mode 100644 index 0000000..9059858 --- /dev/null +++ b/code/environments/production/modules/stdlib/spec/acceptance/build_csv.rb @@ -0,0 +1,89 @@ +# 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 original_require require + # rewrite require + def require(name) + original_require name if name != 'spec_helper_acceptance' + end +end +UNSUPPORTED_PLATFORMS = [].freeze +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')].map 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.each_with_object({}) do |c, memo| + memo[c.description] = {} + memo[c.description]['groups'] = get_tests(c.children) unless c.children.empty? + unless c.examples.empty? + memo[c.description]['tests'] = c.examples.map { |e| + e.description unless e.pending? + }.compact + end + next if c.examples.empty? + memo[c.description]['pending_tests'] = c.examples.map { |e| + e.description if e.pending? + }.compact + end +end + +def count_test_types_in(type, group) + return 0 if group.nil? + group.reduce(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.map { |function_name| + v = tests["#{function_name} function"] + if v + 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 + '%-25s, %-9d, %-9d, %-9d' % [function_name, positive_tests, negative_tests, pending_tests] + }.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 |