added a way to log exceptions, and use it in error responses, which are now tested

This commit is contained in:
HoneyryderChuck 2018-12-31 02:55:03 +00:00
parent bef4315ded
commit 05d9ca909f
3 changed files with 59 additions and 1 deletions

View File

@ -21,5 +21,27 @@ module HTTPX
message = "\e[#{COLORS[color]}m#{message}\e[0m" if color && @options.debug.isatty
@options.debug << message
end
if !Exception.instance_methods.include?(:full_message)
def log_exception(ex, level: @options.debug_level, label: "", color: nil)
return unless @options.debug
return unless @options.debug_level >= level
message = +"#{ex.message} (#{ex.class})"
message << "\n" << ex.backtrace.join("\n") unless ex.backtrace.nil?
log(level: level, label: label, color: color) { message }
end
else
def log_exception(ex, level: @options.debug_level, label: "", color: nil)
return unless @options.debug
return unless @options.debug_level >= level
log(level: level, label: label, color: color) { ex.full_message }
end
end
end
end

View File

@ -244,7 +244,7 @@ module HTTPX
def initialize(error, options)
@error = error
@options = Options.new(options)
log { "#{error.class}: #{error}" }
log_exception(@error)
end
def status
@ -254,5 +254,15 @@ module HTTPX
def raise_for_status
raise @error
end
# rubocop:disable Style/MissingRespondToMissing
def method_missing(meth, *, &block)
if Response.public_method_defined?(meth)
raise NoMethodError, "undefined response method `#{meth}' for error response"
end
super
end
# rubocop:enable Style/MissingRespondToMissing
end
end

View File

@ -0,0 +1,26 @@
# frozen_string_literal: true
require_relative "test_helper"
class ErrorResponseTest < Minitest::Test
include HTTPX
def test_response_status
r1 = ErrorResponse.new(RuntimeError.new("wow"), {})
assert r1.status == "wow"
end
def test_response_raise_for_status
some_error = Class.new(RuntimeError)
r1 = ErrorResponse.new(some_error.new("wow"), {})
assert_raises(some_error) { r1.raise_for_status }
end
def test_respond_method_missing_errors
r1 = ErrorResponse.new(RuntimeError.new("wow"), {})
ex1 = assert_raises(NoMethodError) { r1.headers }
assert ex1.message =~ /undefined response method/
ex2 = assert_raises(NoMethodError) { r1.bang }
assert ex2.message =~ /undefined method/
end
end