mirror of
https://github.com/HoneyryderChuck/httpx.git
synced 2025-12-11 00:02:21 -05: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
|
message = "\e[#{COLORS[color]}m#{message}\e[0m" if color && @options.debug.isatty
|
||||||
@options.debug << message
|
@options.debug << message
|
||||||
end
|
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
|
||||||
end
|
end
|
||||||
|
|||||||
@ -244,7 +244,7 @@ module HTTPX
|
|||||||
def initialize(error, options)
|
def initialize(error, options)
|
||||||
@error = error
|
@error = error
|
||||||
@options = Options.new(options)
|
@options = Options.new(options)
|
||||||
log { "#{error.class}: #{error}" }
|
log_exception(@error)
|
||||||
end
|
end
|
||||||
|
|
||||||
def status
|
def status
|
||||||
@ -254,5 +254,15 @@ module HTTPX
|
|||||||
def raise_for_status
|
def raise_for_status
|
||||||
raise @error
|
raise @error
|
||||||
end
|
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
|
||||||
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