From 50a3f5fe08a4d438db6320ccbc7b762b922f67d9 Mon Sep 17 00:00:00 2001 From: Eike Send Date: Mon, 7 Feb 2022 13:13:02 +0100 Subject: [PATCH] Adds meaningful Ioki::Error::Base message --- lib/ioki/client.rb | 2 +- lib/ioki/error/base.rb | 13 ++++++++++--- spec/ioki/client_spec.rb | 18 ++++++++++++++++++ spec/ioki/error_spec.rb | 25 +++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/lib/ioki/client.rb b/lib/ioki/client.rb index bd96d227..b7ec155d 100644 --- a/lib/ioki/client.rb +++ b/lib/ioki/client.rb @@ -56,7 +56,7 @@ def request(url:, method: :get, body: nil, headers: [], params: nil) error_class = Ioki::Error.http_status_code_to_error_class(response.status) - raise error_class.new(http_response: response) if error_class + raise error_class, response if error_class return response.body, response end diff --git a/lib/ioki/error/base.rb b/lib/ioki/error/base.rb index 74768d29..802d141a 100644 --- a/lib/ioki/error/base.rb +++ b/lib/ioki/error/base.rb @@ -5,10 +5,17 @@ module Error class Base < StandardError attr_accessor :http_response - def initialize(message = nil, http_response: nil) - super(message) - + def initialize(http_response) @http_response = http_response + super http_response_message + end + + def http_response_message + [ + http_response&.status, + http_response&.env&.url, + http_response&.body + ].join ' | ' end def api_error diff --git a/spec/ioki/client_spec.rb b/spec/ioki/client_spec.rb index c280d1df..16814fbe 100644 --- a/spec/ioki/client_spec.rb +++ b/spec/ioki/client_spec.rb @@ -150,6 +150,24 @@ class NullApi expect(e.http_response.env.response_body).to eq(sent_response_body) expect(e.api_error).to eq(sent_response_body) end + + it 'will expose the HTTP status in the error message' do + client_response + rescue StandardError => e + expect(e.message).to include '422' + end + + it 'will expose the requested URL in the error message' do + client_response + rescue StandardError => e + expect(e.message).to include passed_path.to_s + end + + it 'will expose the HTTP response body in the error message' do + client_response + rescue StandardError => e + expect(e.message).to include sent_response_body.to_s + end end context 'when the underlying http adapter response is without error' do diff --git a/spec/ioki/error_spec.rb b/spec/ioki/error_spec.rb index 266b776c..5f67c440 100644 --- a/spec/ioki/error_spec.rb +++ b/spec/ioki/error_spec.rb @@ -44,4 +44,29 @@ expect(described_class.http_status_code_to_error_class(123)).to eq(Ioki::Error::UnexpectedResponseCode) end end + + describe 'message' do + subject(:error_message) { error.message } + + let(:error) { Ioki::Error::NotAcceptable.new http_response } + let(:http_response) { instance_double 'Faraday::Response', status: 406, body: response_body.to_json, env: env } + let(:env) { instance_double 'Faraday::Env', url: url } + let(:url) { 'https://example.com/api' } + let(:response_body) do + { + 'api_errors' => [ + { 'message' => message_1, 'code' => code }, + { 'message' => message_2, 'code' => code } + ] + } + end + let(:message_1) { 'X-Client-Identifier must be set' } + let(:message_2) { 'X-Api-Version must be set' } + let(:code) { 'headers_missing_error' } + + it { is_expected.to include url } + it { is_expected.to include code } + it { is_expected.to include message_1 } + it { is_expected.to include message_2 } + end end