# frozen_string_literal: true # Minitest plugin writing a junit-xml report to INFINITO_JUNIT_REPORT. require "minitest" module Minitest class InfinitoJUnitReporter < AbstractReporter # @param path [String] file the junit report is written to def initialize(path) super() @path = path @results = [] end def record(result) @results << result end def report require "fileutils" FileUtils.mkdir_p(File.dirname(@path)) File.write(@path, document) end private def document body = @results.map { |result| testcase(result) } ['', "", *body, "", ""].join("\n") end def testcase(result) seconds = format("%.6f", result.time) head = "" : "#{head}>#{body}" end def outcome(result) return "" if result.failures.empty? failure = result.failures.first message = escape("#{failure.class}: #{failure.message}") return "" if result.skipped? tag = failure.is_a?(UnexpectedError) ? "error" : "failure" "<#{tag} message=#{message}/>" end def escape(value) quoted = value.to_s .gsub("&", "&") .gsub("<", "<") .gsub(">", ">") .gsub('"', """) %("#{quoted}") end end # @param _options [Hash] minitest runner options, unused def self.plugin_infinito_junit_init(_options) path = ENV.fetch("INFINITO_JUNIT_REPORT", nil) reporter << InfinitoJUnitReporter.new(path) unless path.nil? || path.empty? end end Minitest.extensions << "infinito_junit"