fix error handling

errors are passed in the response body, not by response code
This commit is contained in:
stve 2015-02-25 22:22:13 -05:00
parent f745e5bc73
commit 9c2babc55f
2 changed files with 24 additions and 10 deletions

View file

@ -39,19 +39,29 @@ module Instapaper
@headers = Instapaper::HTTP::Headers.new(@client, @request_method, @uri, @options).request_headers @headers = Instapaper::HTTP::Headers.new(@client, @request_method, @uri, @options).request_headers
options_key = @request_method == :get ? :params : :form options_key = @request_method == :get ? :params : :form
response = ::HTTP.with(@headers).public_send(@request_method, @uri.to_s, options_key => @options) response = ::HTTP.with(@headers).public_send(@request_method, @uri.to_s, options_key => @options)
fail_if_error(response) fail_if_error(parsed_response(response))
raw ? response.to_s : symbolize_keys!(response.parse) raw ? response.to_s : parsed_response(response)
end end
def fail_if_error(response) def fail_if_error(response)
error = error(response.code) error = error(response)
fail(error) if error fail(error) if error
end end
def error(code) def error(response)
return unless Instapaper::Error::CODES.index(code.to_i) return unless response.is_a?(Array)
return unless response.size > 0
return unless response.first[:type] == 'error'
Instapaper::Error.from_response(code, @path) Instapaper::Error.from_response(response.first[:error_code], @path)
end
def parsed_response(response)
@parsed_response ||= begin
symbolize_keys!(response.parse)
rescue
response.to_s
end
end end
def symbolize_keys!(object) def symbolize_keys!(object)

View file

@ -21,9 +21,10 @@ describe Instapaper::Error do
Instapaper::Error::ERRORS.each do |status, exception| Instapaper::Error::ERRORS.each do |status, exception|
context "when HTTP status is #{status}" do context "when HTTP status is #{status}" do
let(:response_body) { %{[{"type":"error", "error_code":#{status}, "message":"Error Message URL"}]} }
before do before do
stub_post('/api/1/oauth/access_token') stub_post('/api/1/oauth/access_token')
.to_return(status: status, body: '', headers: {content_type: 'application/json; charset=utf-8'}) .to_return(status: 200, body: response_body, headers: {content_type: 'application/json; charset=utf-8'})
end end
it "raises #{exception}" do it "raises #{exception}" do
expect { @client.access_token('foo', 'bar') }.to raise_error(Instapaper::Error) expect { @client.access_token('foo', 'bar') }.to raise_error(Instapaper::Error)
@ -33,9 +34,10 @@ describe Instapaper::Error do
Instapaper::Error::BOOKMARK_ERRORS.each do |status, exception| Instapaper::Error::BOOKMARK_ERRORS.each do |status, exception|
context "when HTTP status is #{status}" do context "when HTTP status is #{status}" do
let(:response_body) { %{[{"type":"error", "error_code":#{status}, "message":"Error Message URL"}]} }
before do before do
stub_post('/api/1/bookmarks/list') stub_post('/api/1/bookmarks/list')
.to_return(status: status, body: '', headers: {content_type: 'application/json; charset=utf-8'}) .to_return(status: 200, body: response_body, headers: {content_type: 'application/json; charset=utf-8'})
end end
it "raises #{exception}" do it "raises #{exception}" do
expect { @client.bookmarks }.to raise_error(Instapaper::Error::BookmarkError) expect { @client.bookmarks }.to raise_error(Instapaper::Error::BookmarkError)
@ -45,9 +47,10 @@ describe Instapaper::Error do
Instapaper::Error::FOLDER_ERRORS.each do |status, exception| Instapaper::Error::FOLDER_ERRORS.each do |status, exception|
context "when HTTP status is #{status}" do context "when HTTP status is #{status}" do
let(:response_body) { %{[{"type":"error", "error_code":#{status}, "message":"Error Message URL"}]} }
before do before do
stub_post('/api/1/folders/list') stub_post('/api/1/folders/list')
.to_return(status: status, body: '', headers: {content_type: 'application/json; charset=utf-8'}) .to_return(status: 200, body: response_body, headers: {content_type: 'application/json; charset=utf-8'})
end end
it "raises #{exception}" do it "raises #{exception}" do
expect { @client.folders }.to raise_error(Instapaper::Error::FolderError) expect { @client.folders }.to raise_error(Instapaper::Error::FolderError)
@ -57,9 +60,10 @@ describe Instapaper::Error do
Instapaper::Error::HIGHLIGHT_ERRORS.each do |status, exception| Instapaper::Error::HIGHLIGHT_ERRORS.each do |status, exception|
context "when HTTP status is #{status}" do context "when HTTP status is #{status}" do
let(:response_body) { %{[{"type":"error", "error_code":#{status}, "message":"Error Message URL"}]} }
before do before do
stub_post('/api/1.1/bookmarks/123/highlights') stub_post('/api/1.1/bookmarks/123/highlights')
.to_return(status: status, body: fixture('highlights_list.json'), headers: {content_type: 'application/json; charset=utf-8'}) .to_return(status: 200, body: response_body, headers: {content_type: 'application/json; charset=utf-8'})
end end
it "raises #{exception}" do it "raises #{exception}" do
expect { @client.highlights('123') }.to raise_error(Instapaper::Error::HighlightError) expect { @client.highlights('123') }.to raise_error(Instapaper::Error::HighlightError)