From 05d9ca909fedec86c7ed7b28f8c316c2ad182a0c Mon Sep 17 00:00:00 2001 From: HoneyryderChuck Date: Mon, 31 Dec 2018 02:55:03 +0000 Subject: [PATCH] added a way to log exceptions, and use it in error responses, which are now tested --- lib/httpx/loggable.rb | 22 ++++++++++++++++++++++ lib/httpx/response.rb | 12 +++++++++++- test/error_response_test.rb | 26 ++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 test/error_response_test.rb diff --git a/lib/httpx/loggable.rb b/lib/httpx/loggable.rb index 84e44ce3..09bcb7c3 100644 --- a/lib/httpx/loggable.rb +++ b/lib/httpx/loggable.rb @@ -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 diff --git a/lib/httpx/response.rb b/lib/httpx/response.rb index b0991697..65202eb1 100644 --- a/lib/httpx/response.rb +++ b/lib/httpx/response.rb @@ -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 diff --git a/test/error_response_test.rb b/test/error_response_test.rb new file mode 100644 index 00000000..8d8de9bc --- /dev/null +++ b/test/error_response_test.rb @@ -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