lib/belajar/test_result.rb in belajar-0.1.1 vs lib/belajar/test_result.rb in belajar-1.0.0

- old
+ new

@@ -1,27 +1,35 @@ -module Belajar +require 'json' +module Belajar class TestResult - require 'json' + CODE_ERROR_MESSAGE = ':( You got an error in your code!'.freeze attr_reader :examples, :example_count, :failure_count def initialize(result_json) @result = begin JSON.parse(result_json, symbolize_names: true) - rescue - syntax_error_json + rescue => error + syntax_error_json(error) end - @example_count = @result[:summary][:example_count] - @failure_count = @result[:summary][:failure_count] + @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 + status = example[:status] + exception = example[:exception] + message = exception ? exception[:message] : nil TestExample.new(description: description, status: status, message: message) end end @@ -45,42 +53,67 @@ private def build_failed_summary message = examples.map do |example| - "#{example.description}\n#{example.status}: #{example.message}" + "#{example.description}\n#{example.status}: #{example.message}".strip end - summary = message.map(&:strip).join("\n" * 3) + message.join("\n" * 3) end - def syntax_error_json + def syntax_error_json(error) + details = failure_details(error) + error_json(details) + end + + 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 + + def error_json(details) { summary: {}, examples: [ { - status: 'failed', - exception: { message: ":( You got a syntax error in your code!" } + status: TestExample::FAILED, + exception: { message: "#{CODE_ERROR_MESSAGE}\n\n#{details}" } } ] } end + + def failure_details(error) + line = error.backtrace.first + error_message = remove_colorization(error.message) + "#{error.class} in #{line}:\n#{error_message}" + end + + def remove_colorization(text) + text.gsub(/\x1b\[[0-9]*m/i, '') + end end class TestExample + PASSED = 'passed'.freeze + FAILED = 'failed'.freeze attr_reader :description, :status, :message - EXAMPLE_PASSED_MESSAGE = "Your code passed this requirement." + EXAMPLE_PASSED_MESSAGE = 'Your code passed this requirement.'.freeze - def initialize(args = {}) - @description = args[:description] - @status = args[:status] - @message = args[:message] || EXAMPLE_PASSED_MESSAGE + def initialize(status:, description: nil, message: nil) + @description = description + @status = status + @message = message || EXAMPLE_PASSED_MESSAGE end def passed? - @status == 'passed' + @status == PASSED end end - end