class Minitest::ViewsCoverage

Constants

MERGE_MODE_FLAG
NO_TEMPLATE_IDENTIFIERS
RESULT_FILENAME_PREFIX

Public Class Methods

new(options) click to toggle source
Calls superclass method
# File lib/minitest/views_coverage_plugin.rb, line 7
def initialize(options)
  super()
  @mode = options.delete(:mode) || 'clean'
  @coverage_result = {}
  subscribe_to_notifications
end

Public Instance Methods

prerecord(klass, _name) click to toggle source
# File lib/minitest/views_coverage_plugin.rb, line 14
def prerecord(klass, _name)
  @test_type = klass < ActionDispatch::SystemTestCase ? :system : :unit
end
report() click to toggle source
# File lib/minitest/views_coverage_plugin.rb, line 18
def report
  write_result(@coverage_result[:unit], :unit) if @coverage_result[:unit].present?
  write_result(@coverage_result[:system], :system) if @coverage_result[:system].present?
  write_merged_result if @mode == MERGE_MODE_FLAG
end

Private Instance Methods

merge_results(current_result:, previous_test_type:) click to toggle source
# File lib/minitest/views_coverage_plugin.rb, line 44
def merge_results(current_result:, previous_test_type:)
  previous_result = YAML.load_file("#{RESULT_FILENAME_PREFIX}#{previous_test_type}.yml")
  current_result.merge(previous_result) { |_path, previous_count, current_count| previous_count + current_count }
end
prepare_result_hash() click to toggle source
# File lib/minitest/views_coverage_plugin.rb, line 49
def prepare_result_hash
  {}.tap do |hash|
    NO_TEMPLATE_IDENTIFIERS.each { |identifier| hash[identifier] = 0 }
    Dir.glob('app/views/**/*.*').each { |file_path| hash[file_path] = 0 }
  end
end
subscribe_to_notifications() click to toggle source
# File lib/minitest/views_coverage_plugin.rb, line 26
def subscribe_to_notifications
  %w[render_template.action_view render_partial.action_view render_collection.action_view].each do |event_name|
    ActiveSupport::Notifications.subscribe event_name do |_name, _start, _finish, _id, payload|
      @coverage_result[@test_type] ||= prepare_result_hash
      @coverage_result[@test_type][payload[:identifier].delete_prefix("#{::Rails.root.to_s}/")] += 1
    end
  end
end
write_merged_result() click to toggle source
# File lib/minitest/views_coverage_plugin.rb, line 35
def write_merged_result
  if @coverage_result[:system].present?
    result = merge_results(current_result: @coverage_result[:system], previous_test_type: :unit)
  else
    result = merge_results(current_result: @coverage_result[:unit], previous_test_type: :system)
  end
  write_result(result, :merged)
end
write_result(result, type) click to toggle source
# File lib/minitest/views_coverage_plugin.rb, line 56
def write_result(result, type)
  File.open("#{RESULT_FILENAME_PREFIX}#{type}.yml", 'w') do |file|
    file.write(YAML.dump(result))
  end

  called_views = result.select { |_, count| count.positive? }
  not_called_views = result.select { |_, count| count.zero? }

  file = File.new("#{RESULT_FILENAME_PREFIX}#{type}_pretty.txt", 'w')
  file.write("=============== Not called ===============\n")
  not_called_views.keys.sort.each { |path| file.write("#{path}\n") }

  file.write("\n\n\n")
  file.write("=============== Called ===============\n")
  called_views.each_pair { |path, call_counter| file.write("#{call_counter}:\t\t#{path}\n") }

  file.write("\n\n\n")
  file.write("=============== Summary ===============\n")
  file.write("Uncalled: #{not_called_views.length}\n")
  file.write("Called: #{called_views.length}\n")
  file.write("Coverage %: #{((called_views.length.to_d / result.length) * 100).to_s}")
  file.close
end