Class: Ace::Test::EndToEndRunner::Molecules::FailureFinder

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/test/end_to_end_runner/molecules/failure_finder.rb

Overview

Scans cache for failed test cases from previous E2E test runs

Reads metadata.yml files from .ace-local/test-e2e/*-reports/ directories and extracts failed_test_cases arrays. Used by –only-failures CLI flag to re-run only tests that failed previously.

Note: This is a Molecule (not an Atom) because it performs filesystem I/O via Dir.glob and YAML file reading.

Constant Summary collapse

CACHE_DIR =
".ace-local/test-e2e"
METADATA_FILE =
"metadata.yml"
REPORTS_SUFFIX =
"-reports"

Instance Method Summary collapse

Instance Method Details

#find_all_failures(base_dir: Dir.pwd) ⇒ Array<String>

Find failed test cases across all packages

Scans cache directory for the most recent metadata.yml per test-id across all packages, returning aggregated failed test case IDs.

Parameters:

  • base_dir (String) (defaults to: Dir.pwd)

    Base directory to search from (default: current dir)

Returns:

  • (Array<String>)

    Failed test case IDs



48
49
50
51
52
53
54
# File 'lib/ace/test/end_to_end_runner/molecules/failure_finder.rb', line 48

def find_all_failures(base_dir: Dir.pwd)
   = (base_dir)
  return [] if .empty?

  most_recent = most_recent_per_test()
  extract_all_failed_ids(most_recent)
end

#find_failures(package:, base_dir: Dir.pwd) ⇒ Array<String>

Find failed test cases for a specific package

Scans cache directory for the most recent metadata.yml per test-id within the specified package, returning aggregated failed test case IDs.

Parameters:

  • package (String)

    Package name (e.g., “ace-lint”)

  • base_dir (String) (defaults to: Dir.pwd)

    Base directory to search from (default: current dir)

Returns:

  • (Array<String>)

    Failed test case IDs (e.g., [“TC-001”, “TC-003”])



30
31
32
33
34
35
36
37
38
39
# File 'lib/ace/test/end_to_end_runner/molecules/failure_finder.rb', line 30

def find_failures(package:, base_dir: Dir.pwd)
   = (base_dir)
  return [] if .empty?

  # Filter to package and get most recent per test-id
   = filter_by_package(, package)
  most_recent = most_recent_per_test()

  extract_all_failed_ids(most_recent)
end

#find_failures_by_package(packages:, base_dir: Dir.pwd) ⇒ Hash{String => Array<String>}

Find failed test cases grouped by package

Scans cache directory for the most recent metadata.yml per test-id within each package, returning a hash mapping package names to their failed test case IDs.

Parameters:

  • packages (Array<String>)

    Package names to scan

  • base_dir (String) (defaults to: Dir.pwd)

    Base directory to search from (default: current dir)

Returns:

  • (Hash{String => Array<String>})

    Package name to failed test case IDs



65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/ace/test/end_to_end_runner/molecules/failure_finder.rb', line 65

def find_failures_by_package(packages:, base_dir: Dir.pwd)
   = (base_dir)
  return {} if .empty?

  result = {}
  packages.each do |package|
     = filter_by_package(, package)
    most_recent = most_recent_per_test()
    failed_ids = extract_all_failed_ids(most_recent)
    result[package] = failed_ids unless failed_ids.empty?
  end
  result
end

#find_failures_by_scenario(packages:, base_dir: Dir.pwd) ⇒ Hash{String => Hash{String => Array<String>}}

Find failed test scenarios grouped by package and scenario (test-id)

Like find_failures_by_package but preserves per-scenario granularity. Callers can use this to re-run full failed scenarios.

Parameters:

  • packages (Array<String>)

    Package names to scan

  • base_dir (String) (defaults to: Dir.pwd)

    Base directory to search from (default: current dir)

Returns:

  • (Hash{String => Hash{String => Array<String>}})

    Package name => { test-id => failed TC IDs }



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/ace/test/end_to_end_runner/molecules/failure_finder.rb', line 88

def find_failures_by_scenario(packages:, base_dir: Dir.pwd)
   = (base_dir)
  return {} if .empty?

  result = {}
  packages.each do |package|
     = filter_by_package(, package)
    most_recent = most_recent_per_test()

    scenario_failures = {}
    most_recent.each do |entry|
      test_id = entry[:data]["test-id"]
      failed_ids = extract_failed_test_cases(entry[:data])
      scenario_failures[test_id] = failed_ids unless failed_ids.empty?
    end

    result[package] = scenario_failures unless scenario_failures.empty?
  end
  result
end