class Minitest::RakeCIReporter

RakeCI Minitest Reporter

Public Class Methods

enable!() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 37
def self.enable!
  @enabled = true
end
enabled?() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 41
def self.enabled?
  @enabled ||= !!ENV['MINITEST_RAKE_CI']
end

Public Instance Methods

load_current_commit_hash() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 67
def load_current_commit_hash
  load_current_commit_data
end
report() click to toggle source
Calls superclass method
# File lib/minitest/rake_ci_plugin.rb, line 47
def report
  super

  hash = {
    statistics: current_statistics,
    # results: results,
    metrics: current_metrics,
    attachments: current_attachments
  }

  save_current_commit_data(hash)
end

Private Instance Methods

current_attachments() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 130
def current_attachments
  return @current_attachments if @current_attachments

  @current_attachments = []
  @current_attachments << failures_attachment if failures.positive?
  @current_attachments << errors_attachment if errors.positive?
  @current_attachments << pass_attachment if passing?
  @current_attachments << flakes_attachment if flakes.positive?
  @current_attachments
end
current_metrics() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 113
def current_metrics
  return @current_metrics if @current_metrics

  @current_metrics = []
  (current_statistics.keys - %i[total_time]).each do |name|
    metric = {
      name: 'ci_test_count',
      type: :gauge,
      label_set: { name: name },
      value: current_statistics[name]
    }
    @current_metrics << metric
    io.puts metric.inspect
  end
  @current_metrics
end
current_statistics() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 106
def current_statistics
  @current_statistics ||= {
    total_time: total_time, runs: count, assertions: assertions, failures: failures,
    errors: errors, skips: skips, flakes: flakes
  }
end
error_snippets() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 73
def error_snippets
  snippets_for results.reject(&:skipped?).select(&:error?)
end
errors_attachment() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 157
def errors_attachment
  {
    color: 'warning',
    text: 'test error'.pluralize(errors) + error_snippets,
    footer: footer
  }
end
failure_snippets() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 77
def failure_snippets
  snippets_for results.reject(&:skipped?).reject(&:error?)
end
failures_attachment() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 141
def failures_attachment
  {
    color: 'danger',
    text: 'test failure'.pluralize(failures) + failure_snippets,
    footer: footer
  }
end
flake_snippets() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 81
def flake_snippets
  snippets_for flakey_results
end
flakes_attachment() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 149
def flakes_attachment
  {
    color: '#bb44ff',
    text: 'flakey test'.pluralize(flakes) + flake_snippets,
    footer: footer
  }
end
name() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 187
def name
  'minitest'
end
newly_passing?() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 177
def newly_passing?
  return false unless passing?

  last_commit_hash = load_last_commit_data
  return false if last_commit_hash.nil?

  last_commit_hash[:statistics][:failures].positive? ||
    last_commit_hash[:statistics][:errors].positive?
end
pass_attachment() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 165
def pass_attachment
  {
    color: 'good',
    text: newly_passing? ? 'Tests now pass! :tada:' : 'Tests passed',
    footer: footer
  }
end
passing?() click to toggle source
# File lib/minitest/rake_ci_plugin.rb, line 173
def passing?
  !(failures.positive? || errors.positive?)
end
snippets_for(results, limit = 5) click to toggle source

Adapted from Rails’ TestUnit reporter in lib/rails/test_unit/reporter.rb

# File lib/minitest/rake_ci_plugin.rb, line 86
def snippets_for(results, limit = 5)
  executable = defined?(Rails) ? 'bin/rails test ' : 'bundle exec rake test TEST='

  snippets = results[0, limit].map do |result|
    location, line =
      if result.respond_to?(:source_location)
        result.source_location
      else
        result.method(result.name).source_location
      end

    # Include test result details, as well has how to rerun the failed test
    "#{result}#{executable}#{location.sub(%r{^#{Dir.pwd}/?}, '')}:#{line}"
  end

  snippets << "+ #{results.length - limit} more" if (results.length - limit).positive?

  snippets.any? ? "\n```\n#{snippets.join("\n")}\n```" : ''
end