From bb2c550f06b76b4cee170811d178f9835a21db69 Mon Sep 17 00:00:00 2001 From: Alex Stupka Date: Sun, 3 May 2020 22:22:46 -0700 Subject: [PATCH 1/2] Map address validation exceptions to validation exceptions. * This is needed to handle validation differently in the client. --- lib/vertex_client/payloads/base.rb | 16 +++++++++++ lib/vertex_client/resources/base.rb | 2 ++ test/resources/base_test.rb | 41 ++++++++++++++++++++++++++--- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/lib/vertex_client/payloads/base.rb b/lib/vertex_client/payloads/base.rb index 4fdf952..cb2d333 100644 --- a/lib/vertex_client/payloads/base.rb +++ b/lib/vertex_client/payloads/base.rb @@ -3,6 +3,12 @@ module VertexClient module Payload class Base + # https://www.agiis.org/Links/ErrorCodes.htm + ADDRESS_VALIDATION_CODES = %w[ + E101 E212 E213 E214 E216 E302 E412 E413 E420 E421 E422 E423 E425 E427 E428 E429 E430 E431 + E432 E433 E434 E435 E436 E437 E439 E450 E451 E452 E453 E501 E502 E503 E504 E505 E600 E601 + ].freeze + attr_reader :params def initialize(params) @@ -16,8 +22,18 @@ def transform } end + def map_to_validation_exception!(exception) + return exception unless ADDRESS_VALIDATION_CODES.include?(fault_code(exception.message)) + + VertexClient::ValidationError.new("Invalid address: #{exception.message}") + end + private + def fault_code(message) + message.match(/fault code=(?\w+),/)&.[](:code) + end + def request_key :"#{self.class.name.demodulize.underscore}_request" end diff --git a/lib/vertex_client/resources/base.rb b/lib/vertex_client/resources/base.rb index 26634a2..bd8338a 100644 --- a/lib/vertex_client/resources/base.rb +++ b/lib/vertex_client/resources/base.rb @@ -19,6 +19,8 @@ def config_key def response @response ||= connection.request(@payload.transform) + rescue Savon::SOAPFault => e + raise @payload.map_to_validation_exception!(e) end def connection diff --git a/test/resources/base_test.rb b/test/resources/base_test.rb index c1a2be9..e9cb3b8 100644 --- a/test/resources/base_test.rb +++ b/test/resources/base_test.rb @@ -1,10 +1,10 @@ require 'test_helper' describe VertexClient::Resource::Base do - class VertexClient::Resource::MyTest < VertexClient::Resource::Base + class VertexClient::Resource::MyTest < VertexClient::Resource::Base ENDPOINT = 'MyEndPoint'.freeze end - class VertexClient::Payload::MyTest < VertexClient::Payload::Base + class VertexClient::Payload::MyTest < VertexClient::Payload::Base def validate! end @@ -15,10 +15,12 @@ def body class VertexClient::Response::MyTest < VertexClient::Response::Base; end; let(:resource) { VertexClient::Resource::MyTest.new({ test: :ok })} + let(:connection) { resource.send(:connection) } + let(:payload) { resource.instance_variable_get(:@payload) } describe 'initialize' do it 'sets @payload with a new instance of payload_type' do - assert_kind_of VertexClient::Payload::MyTest, resource.instance_variable_get(:@payload) + assert_kind_of VertexClient::Payload::MyTest, payload end end @@ -40,6 +42,39 @@ class VertexClient::Response::MyTest < VertexClient::Response::Base; end; end end + describe 'when a soap fault is raised' do + let(:nori) { Nori.new(:strip_namespaces => true, :convert_tags_to => lambda { |tag| tag.snakecase.to_sym }) } + let(:address_fault) { fault_message(<<-ERROR) } + No tax areas were found during the lookup. The address fields are inconsistent for the specified asOfDate. (Street Information=1-252 AR / B- BTRY, Street Information 2=null, Postal Code=UNIT, City=APOAE, Sub Division=null, Main Division=09877-1368, Country=USA, As Of Date=20200419) Failed to cleanse address. (fault code=E412, fault code text=Primary name not found in directory.) + ERROR + let(:fault) { fault_message("The request cannot be processed") } + let(:address_soap_fault) { Savon::SOAPFault.new(HTTPI::Response.new(500, {}, address_fault), nori) } + let(:soap_fault) { Savon::SOAPFault.new(HTTPI::Response.new(500, {}, fault), nori) } + + it 'maps to a validation exception for address errors' do + connection.stubs(:request).raises(address_soap_fault) + assert_raises(VertexClient::ValidationError) { resource.result } + end + + it 'raises SOAPFault for non validation errors' do + connection.stubs(:request).raises(soap_fault) + assert_raises(Savon::SOAPFault) { resource.result } + end + + def fault_message(fault_string) + <<-STRING + + + + soapenv:Client + #{fault_string} + + + + STRING + end + end + describe 'when response is not set' do before do resource.stubs(:response).returns(nil) From 12745157a42592a8f3f76659c639a68fb389e1e4 Mon Sep 17 00:00:00 2001 From: Alex Stupka Date: Mon, 4 May 2020 10:17:29 -0700 Subject: [PATCH 2/2] Bump gem version to 0.9.2. --- lib/vertex_client/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/vertex_client/version.rb b/lib/vertex_client/version.rb index e442837..89d329d 100644 --- a/lib/vertex_client/version.rb +++ b/lib/vertex_client/version.rb @@ -1,3 +1,3 @@ module VertexClient - VERSION = '0.9.1' + VERSION = '0.9.2' end