mirror of
https://github.com/HoneyryderChuck/httpx.git
synced 2025-08-10 00:01:27 -04:00
added a way to log exceptions, and use it in error responses, which are now tested
This commit is contained in:
parent
bef4315ded
commit
05d9ca909f
@ -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
|
||||
|
@ -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
|
||||
|
26
test/error_response_test.rb
Normal file
26
test/error_response_test.rb
Normal 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
|
Loading…
x
Reference in New Issue
Block a user