class Belajar::TestResult

Constants

CODE_ERROR_MESSAGE

Attributes

example_count[R]
examples[R]
failure_count[R]

Public Class Methods

new(result_json) click to toggle source
# File lib/belajar/test_result.rb, line 9
def initialize(result_json)
  @result = begin
    JSON.parse(result_json, symbolize_names: true)
  rescue => error
    syntax_error_json(error)
  end

  @example_count = @result.dig(:summary, :example_count)
  @failure_count = @result.dig(:summary, :failure_count)
  error_count = @result.dig(:summary, :errors_outside_of_examples_count) || 0

  if error_count > 0
    @failure_count = error_count
    details = error_details(@result)
    @result = error_json(details)
  end

  @examples = @result[:examples].map do |example|
    description = example[:full_description]
    status      = example[:status]
    exception   = example[:exception]
    message     = exception ? exception[:message] : nil

    TestExample.new(description: description, status: status, message: message)
  end
end

Public Instance Methods

passed?() click to toggle source
# File lib/belajar/test_result.rb, line 36
def passed?
  @examples.reduce(true) do |passed, example|
    passed && example.passed?
  end
end
summary() click to toggle source
# File lib/belajar/test_result.rb, line 42
def summary
  if passed?
    "Your code passed all tests. #{Belajar::Congratulator.message}"
  else
    build_failed_summary
  end
end
summary_lines() click to toggle source
# File lib/belajar/test_result.rb, line 50
def summary_lines
  summary.lines.map(&:strip)
end

Private Instance Methods

build_failed_summary() click to toggle source
# File lib/belajar/test_result.rb, line 56
def build_failed_summary
  message = examples.map do |example|
    "#{example.description}\n#{example.status}: #{example.message}".strip
  end

  message.join("\n" * 3)
end
error_details(result) click to toggle source
# File lib/belajar/test_result.rb, line 69
def error_details(result)
  result[:messages]
    .first
    .split('\n')
    .each_with_index
    .select { |line, index| index > 0 && line.matches?(/temp_.+\.rb/) }
    .first.to_s
end
error_json(details) click to toggle source
# File lib/belajar/test_result.rb, line 78
def error_json(details)
  {
    summary: {},
    examples: [
      {
        status: TestExample::FAILED,
        exception: { message: "#{CODE_ERROR_MESSAGE}\n\n#{details}" }
      }
    ]
  }
end
failure_details(error) click to toggle source
# File lib/belajar/test_result.rb, line 90
def failure_details(error)
  line = error.backtrace.first
  error_message = remove_colorization(error.message)
  "#{error.class} in #{line}:\n#{error_message}"
end
remove_colorization(text) click to toggle source
# File lib/belajar/test_result.rb, line 96
def remove_colorization(text)
  text.gsub(/\x1b\[[0-9]*m/i, '')
end
syntax_error_json(error) click to toggle source
# File lib/belajar/test_result.rb, line 64
def syntax_error_json(error)
  details = failure_details(error)
  error_json(details)
end