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