class FlakyTester::ResultsParser

Constants

FAILED_SUITE_REGEX
FAILED_TEST_REGEX

Public Class Methods

new(results_file) click to toggle source
# File lib/flaky_tester/results_parser.rb, line 8
def initialize(results_file)
  @results_file = results_file
  @failed_suite_count = 0
  @failed_test_counts = {}
end

Public Instance Methods

parse() click to toggle source
# File lib/flaky_tester/results_parser.rb, line 14
def parse
  @results_file.each do |line|
    failed_suite_match_data = FAILED_SUITE_REGEX.match(line)

    if failed_suite_match_data
      @failed_suite_count += 1
      next
    end

    failed_test_match_data = FAILED_TEST_REGEX.match(line)

    if failed_test_match_data
      failed_test = failed_test_match_data[1]
      @failed_test_counts[failed_test] ||= 0
      @failed_test_counts[failed_test] += 1
    end
  end

  results_message
ensure
  close_results_file
end

Private Instance Methods

close_results_file() click to toggle source
# File lib/flaky_tester/results_parser.rb, line 54
def close_results_file
  @results_file.close

  if zero_failures?
    File.delete(@results_file.path)
  end
end
results_message() click to toggle source
# File lib/flaky_tester/results_parser.rb, line 39
def results_message
  return "Success! All tests passed." if zero_failures?

  message = "Oh no... The suite failed #{@failed_suite_count} times:\n"

  sorted_failed_test_counts = @failed_test_counts.sort_by { |_, count| -count }.to_h

  sorted_failed_test_counts.each_with_object(message) do |(failed_test, count), message|
    message.concat("\n#{failed_test} failed #{count} times.")
  end

  message.concat("\n\nCheck the errors in the file:\n")
  message.concat(Pathname.new(@results_file.path).relative_path_from(Dir.pwd).to_s)
end
zero_failures?() click to toggle source
# File lib/flaky_tester/results_parser.rb, line 62
def zero_failures?
  @failed_suite_count == 0
end