From 6165b9bf7b373a69e5349443d14dbef889dfd8c9 Mon Sep 17 00:00:00 2001 From: Travis Pew <travis@travispew.com> Date: Sun, 9 Mar 2014 12:05:59 -0400 Subject: [PATCH] Add geocod.io exceptions --- lib/geocoder/lookups/geocodio.rb | 13 ++++++++++--- test/fixtures/geocodio_bad_api_key | 3 +++ test/fixtures/geocodio_invalid | 4 ++++ test/fixtures/geocodio_over_query_limit | 4 ++++ test/unit/lookups/geocodio_test.rb | 21 +++++++++++++++++++++ 5 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/geocodio_bad_api_key create mode 100644 test/fixtures/geocodio_invalid create mode 100644 test/fixtures/geocodio_over_query_limit diff --git a/lib/geocoder/lookups/geocodio.rb b/lib/geocoder/lookups/geocodio.rb index 8d6cd211..1f7c2f86 100644 --- a/lib/geocoder/lookups/geocodio.rb +++ b/lib/geocoder/lookups/geocodio.rb @@ -15,10 +15,17 @@ module Geocoder::Lookup def results(query) return [] unless doc = fetch_data(query) - if doc['error'].nil? - return doc["results"] + return doc["results"] if doc['error'].nil? + + if doc['error'] == 'Invalid API key' + raise_error(Geocoder::InvalidApiKey) || + warn("Geocodio service error: invalid API key.") + elsif doc['error'].match(/You have reached your daily maximum/) + raise_error(Geocoder::OverQueryLimitError, doc['error']) || + warn("Geocodio service error: #{doc['error']}.") else - warn "Geocodio service error: #{doc['error']}." + raise_error(Geocoder::InvalidRequest, doc['error']) || + warn("Geocodio service error: #{doc['error']}.") end [] end diff --git a/test/fixtures/geocodio_bad_api_key b/test/fixtures/geocodio_bad_api_key new file mode 100644 index 00000000..fb552519 --- /dev/null +++ b/test/fixtures/geocodio_bad_api_key @@ -0,0 +1,3 @@ +{ + "error": "Invalid API key" +} diff --git a/test/fixtures/geocodio_invalid b/test/fixtures/geocodio_invalid new file mode 100644 index 00000000..f7161085 --- /dev/null +++ b/test/fixtures/geocodio_invalid @@ -0,0 +1,4 @@ +{ + "error": "Could not geocode address, zip code, city or city/state are required" +} + diff --git a/test/fixtures/geocodio_over_query_limit b/test/fixtures/geocodio_over_query_limit new file mode 100644 index 00000000..803542d8 --- /dev/null +++ b/test/fixtures/geocodio_over_query_limit @@ -0,0 +1,4 @@ +{ + "error": "You have reached your daily maximum, please add a payment method for continued use. You can configure billing at https://dash.geocod.io" +} + diff --git a/test/unit/lookups/geocodio_test.rb b/test/unit/lookups/geocodio_test.rb index 1bb4b313..c1ac2c74 100644 --- a/test/unit/lookups/geocodio_test.rb +++ b/test/unit/lookups/geocodio_test.rb @@ -31,4 +31,25 @@ class GeocodioTest < GeocoderTestCase query = Geocoder::Query.new([45.423733, -75.676333]) assert_match /reverse/, query.url end + + def test_raises_invalid_request_exception + Geocoder.configure Geocoder.configure(:always_raise => [Geocoder::InvalidRequest]) + assert_raises Geocoder::InvalidRequest do + Geocoder.search("invalid") + end + end + + def test_raises_api_key_exception + Geocoder.configure Geocoder.configure(:always_raise => [Geocoder::InvalidApiKey]) + assert_raises Geocoder::InvalidApiKey do + Geocoder.search("bad api key") + end + end + + def test_raises_over_limit_exception + Geocoder.configure Geocoder.configure(:always_raise => [Geocoder::OverQueryLimitError]) + assert_raises Geocoder::OverQueryLimitError do + Geocoder.search("over query limit") + end + end end -- GitLab