From 2225e453fdfb5edbdbcc25f6b64478b6e7476dd4 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Thu, 17 Oct 2013 11:30:49 -0600 Subject: [PATCH 1/2] SalesTerm XML errors raise verbose IntuitRequestException --- lib/quickeebooks/online/service/sales_term.rb | 15 +++++++++++++++ lib/quickeebooks/online/service/service_base.rb | 11 ----------- .../online/services/sales_term_spec.rb | 11 +++++++++++ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/lib/quickeebooks/online/service/sales_term.rb b/lib/quickeebooks/online/service/sales_term.rb index 4d356d5..15b7e79 100644 --- a/lib/quickeebooks/online/service/sales_term.rb +++ b/lib/quickeebooks/online/service/sales_term.rb @@ -10,6 +10,21 @@ def fetch_by_id(id, idDomain = 'QB', options = {}) url = "#{url_for_resource(Quickeebooks::Online::Model::SalesTerm::REST_RESOURCE)}/#{id}" fetch_object(Quickeebooks::Online::Model::SalesTerm, url, { :idDomain => idDomain }) end + + private + + def fetch_object(model, url, params = {}, options = {}) + raise ArgumentError, "missing model to instantiate" if model.nil? + response = do_http_get(url, params, {'Content-Type' => 'text/xml'}) + + xml = parse_xml(response.body) + begin + element = xml.at_xpath("//xmlns:#{model::XML_NODE}") + rescue Nokogiri::XML::XPath::SyntaxError => ex + raise IntuitRequestException.new("Error parsing XML: #{ex.message}\nHTTP Response: (#{response.code}) #{response.body}") + end + model.from_xml(element) + end end end end diff --git a/lib/quickeebooks/online/service/service_base.rb b/lib/quickeebooks/online/service/service_base.rb index 1a3b407..e5616c1 100644 --- a/lib/quickeebooks/online/service/service_base.rb +++ b/lib/quickeebooks/online/service/service_base.rb @@ -78,17 +78,6 @@ def valid_xml_document(xml) %Q{\n#{xml.strip}} end - def fetch_object(model, url, params = {}, options = {}) - raise ArgumentError, "missing model to instantiate" if model.nil? - response = do_http_get(url, params, {'Content-Type' => 'text/xml'}) - - xml = parse_xml(response.body) - element = xml.at_xpath("//xmlns:#{model::XML_NODE}") - model.from_xml(element) - rescue => ex - raise IntuitRequestException.new("Error parsing XML: #{ex.message}") - end - def fetch_collection(model, filters = [], page = 1, per_page = 20, sort = nil, options ={}) raise ArgumentError, "missing model to instantiate" if model.nil? diff --git a/spec/quickeebooks/online/services/sales_term_spec.rb b/spec/quickeebooks/online/services/sales_term_spec.rb index d3ecbd4..8210611 100644 --- a/spec/quickeebooks/online/services/sales_term_spec.rb +++ b/spec/quickeebooks/online/services/sales_term_spec.rb @@ -34,4 +34,15 @@ sales_term.meta_data.last_updated_time.should == Time.parse('2013-01-17T19:04:19-08:00') sales_term.name.should == "Net 30" end + + context 'when a XML parsing error occurs' do + it "raises an IntuitRequestException" do + xml = '' + url = @service.url_for_resource(Quickeebooks::Online::Model::SalesTerm.resource_for_singular) + url = "#{url}/99?idDomain=QB" + FakeWeb.register_uri(:get, url, :status => ["200", "OK"], :body => xml) + expect{ @service.fetch_by_id(99) }.to raise_error(IntuitRequestException) + end + end + end From 5e14bfb793d80c8e1bad016abb232952c114ad70 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Thu, 17 Oct 2013 14:51:08 -0600 Subject: [PATCH 2/2] Also rescue errors coming from Model.from_xml --- lib/quickeebooks/online/service/sales_term.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/quickeebooks/online/service/sales_term.rb b/lib/quickeebooks/online/service/sales_term.rb index 15b7e79..df3dc59 100644 --- a/lib/quickeebooks/online/service/sales_term.rb +++ b/lib/quickeebooks/online/service/sales_term.rb @@ -20,10 +20,10 @@ def fetch_object(model, url, params = {}, options = {}) xml = parse_xml(response.body) begin element = xml.at_xpath("//xmlns:#{model::XML_NODE}") + model.from_xml(element) rescue Nokogiri::XML::XPath::SyntaxError => ex raise IntuitRequestException.new("Error parsing XML: #{ex.message}\nHTTP Response: (#{response.code}) #{response.body}") end - model.from_xml(element) end end end