diff --git a/lib/geocoder/lookups/geocodio.rb b/lib/geocoder/lookups/geocodio.rb index 8d6cd211d67d4b9ebfbacf1f3543c24dbf940a14..1f7c2f86a9769cdb148f019955f46c2aca28d9f4 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 0000000000000000000000000000000000000000..fb5525197b6d4bdac61d60206ef114f3da979a10 --- /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 0000000000000000000000000000000000000000..f716108533ddbdc4f720571568b87135695295b0 --- /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 0000000000000000000000000000000000000000..803542d89ea9bcf112241745974bcfb149e423d8 --- /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 1bb4b313aaa0f930b380a233c966cbe3569de392..c1ac2c746206c98e22571912a750d8a62fb51c6d 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