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