diff --git a/lib/xeroizer/record/base.rb b/lib/xeroizer/record/base.rb index a0534a5fb..d470a6499 100644 --- a/lib/xeroizer/record/base.rb +++ b/lib/xeroizer/record/base.rb @@ -105,15 +105,20 @@ def download_complete_record! end def save - save! - true + saves_successfully rescue XeroizerError => e log "[ERROR SAVING] (#{__FILE__}:#{__LINE__}) - #{e.message}" false end def save! - raise RecordInvalid unless valid? + raise RecordInvalid unless saves_successfully + end + + private + + def saves_successfully + return false unless valid? if new_record? create else @@ -121,8 +126,15 @@ def save! end saved! + rescue ApiException => e + e.validation_errors.each do |error| + errors << [:base, error] + end + false end + public + def saved! @complete_record_downloaded = true parent.mark_clean(self) diff --git a/test/unit/models/tax_rate_test.rb b/test/unit/models/tax_rate_test.rb index 70f714480..94a5bc5e4 100644 --- a/test/unit/models/tax_rate_test.rb +++ b/test/unit/models/tax_rate_test.rb @@ -1,5 +1,4 @@ require 'unit_test_helper' -require 'mocha/test_unit' class TaxRateTest < Test::Unit::TestCase include TestHelper diff --git a/test/unit/record/base_test.rb b/test/unit/record/base_test.rb index f2cdcd111..e29a2e5f7 100644 --- a/test/unit/record/base_test.rb +++ b/test/unit/record/base_test.rb @@ -132,9 +132,14 @@ class Xeroizer::Record::ExampleRecordClassModel < Xeroizer::Record::BaseModel; e end end - context 'api error received' do + context 'ApiException received' do setup do response = get_file_as_string('api_exception.xml') + + # XeroGenericApplication API Exceptions *claim* to be UTF-16 encoded, but are not + # @see http_response.rb Xeroizer::XmlErrorResponse#raise_bad_request! + response.gsub! '', '' + doc = Nokogiri::XML(response) exception = Xeroizer::ApiException.new(doc.root.xpath("Type").text, doc.root.xpath("Message").text, @@ -142,7 +147,6 @@ class Xeroizer::Record::ExampleRecordClassModel < Xeroizer::Record::BaseModel; e doc, '') - @contact.stubs(:valid?).returns(true) @contact.stubs(:create).raises(exception) @contact.stubs(:update).raises(exception) end @@ -156,7 +160,7 @@ class Xeroizer::Record::ExampleRecordClassModel < Xeroizer::Record::BaseModel; e must 'raise an exception updating records with #save!' do @contact.stubs(:new_record?).returns(false) - assert_raise(Xeroizer::ApiException) do + assert_raise(Xeroizer::XeroizerError) do @contact.save! end end @@ -170,6 +174,20 @@ class Xeroizer::Record::ExampleRecordClassModel < Xeroizer::Record::BaseModel; e @contact.stubs(:new_record?).returns(false) assert_equal(false, @contact.save) end + + must 'set errors creating records with #save' do + @contact.stubs(:new_record?).returns(true) + @contact.save + assert_equal([[:base, "Users Organisation is not subscribed to currency NZD"]], @contact.errors) + end + + must 'set errors updating records with #save!' do + @contact.stubs(:new_record?).returns(false) + assert_raise(Xeroizer::XeroizerError) do + @contact.save! + end + assert_equal([[:base, "Users Organisation is not subscribed to currency NZD"]], @contact.errors) + end end end end diff --git a/test/unit_test_helper.rb b/test/unit_test_helper.rb index 5b4309857..78e9a52d9 100644 --- a/test/unit_test_helper.rb +++ b/test/unit_test_helper.rb @@ -1,5 +1,6 @@ require 'test_helper' require 'webmock' +require 'mocha/test_unit' include WebMock::API WebMock.disable_net_connect!(allow_localhost: true)