summaryrefslogtreecommitdiff
path: root/scripts/failed_tests.rb
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/failed_tests.rb')
-rwxr-xr-xscripts/failed_tests.rb122
1 files changed, 122 insertions, 0 deletions
diff --git a/scripts/failed_tests.rb b/scripts/failed_tests.rb
new file mode 100755
index 00000000000..fb13df7bf62
--- /dev/null
+++ b/scripts/failed_tests.rb
@@ -0,0 +1,122 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require 'optparse'
+require 'fileutils'
+require 'uri'
+require 'json'
+require 'set'
+
+class FailedTests
+ def initialize(options)
+ @filename = options.delete(:previous_tests_report_path)
+ @output_directory = options.delete(:output_directory)
+ @rspec_pg_regex = options.delete(:rspec_pg_regex)
+ @rspec_ee_pg_regex = options.delete(:rspec_ee_pg_regex)
+ end
+
+ def output_failed_test_files
+ create_output_dir
+
+ failed_files_for_suite_collection.each do |suite_collection_name, suite_collection_files|
+ failed_test_files = suite_collection_files.map { |filepath| filepath.delete_prefix('./') }.join(' ')
+
+ output_file = File.join(output_directory, "#{suite_collection_name}_failed_files.txt")
+
+ File.open(output_file, 'w') do |file|
+ file.write(failed_test_files)
+ end
+ end
+ end
+
+ def failed_files_for_suite_collection
+ suite_map.each_with_object(Hash.new { |h, k| h[k] = Set.new }) do |(suite_collection_name, suite_collection_regex), hash|
+ failed_suites.each do |suite|
+ hash[suite_collection_name].merge(failed_files(suite)) if suite['name'] =~ suite_collection_regex
+ end
+ end
+ end
+
+ def suite_map
+ @suite_map ||= {
+ rspec: rspec_pg_regex,
+ rspec_ee: rspec_ee_pg_regex,
+ jest: /jest/
+ }
+ end
+
+ private
+
+ attr_reader :filename, :output_directory, :rspec_pg_regex, :rspec_ee_pg_regex
+
+ def file_contents
+ @file_contents ||= begin
+ File.read(filename)
+ rescue Errno::ENOENT
+ '{}'
+ end
+ end
+
+ def file_contents_as_json
+ @file_contents_as_json ||= begin
+ JSON.parse(file_contents)
+ rescue JSON::ParserError
+ {}
+ end
+ end
+
+ def failed_suites
+ return [] unless file_contents_as_json['suites']
+
+ file_contents_as_json['suites'].select { |suite| suite['failed_count'] > 0 }
+ end
+
+ def failed_files(suite)
+ return [] unless suite
+
+ suite['test_cases'].each_with_object([]) do |failure_hash, failed_cases|
+ failed_cases << failure_hash['file'] if failure_hash['status'] == 'failed'
+ end
+ end
+
+ def create_output_dir
+ return if File.directory?(output_directory)
+
+ puts 'Creating output directory...'
+ FileUtils.mkdir_p(output_directory)
+ end
+end
+
+if $0 == __FILE__
+ options = {
+ previous_tests_report_path: 'test_results/previous/test_reports.json',
+ output_directory: 'tmp/previous_failed_tests/',
+ rspec_pg_regex: /rspec .+ pg12( .+)?/,
+ rspec_ee_pg_regex: /rspec-ee .+ pg12( .+)?/
+ }
+
+ OptionParser.new do |opts|
+ opts.on("-p", "--previous-tests-report-path PREVIOUS_TESTS_REPORT_PATH", String, "Path of the file listing previous test failures") do |value|
+ options[:previous_tests_report_path] = value
+ end
+
+ opts.on("-o", "--output-directory OUTPUT_DIRECTORY", String, "Output directory for failed test files") do |value|
+ options[:output_directory] = value
+ end
+
+ opts.on("--rspec-pg-regex RSPEC_PG_REGEX", Regexp, "Regex to use when finding matching RSpec jobs") do |value|
+ options[:rspec_pg_regex] = value
+ end
+
+ opts.on("--rspec-ee-pg-regex RSPEC_EE_PG_REGEX", Regexp, "Regex to use when finding matching RSpec EE jobs") do |value|
+ options[:rspec_ee_pg_regex] = value
+ end
+
+ opts.on("-h", "--help", "Prints this help") do
+ puts opts
+ exit
+ end
+ end.parse!
+
+ FailedTests.new(options).output_failed_test_files
+end