From 7f3cb08c2f1cb580ee8115fffaaf5803ff545dd4 Mon Sep 17 00:00:00 2001
From: Dan Drinkard <dan.drinkard@gmail.com>
Date: Thu, 13 Mar 2014 16:14:17 -0400
Subject: [PATCH] Raise on 400, 402

---
 lib/geocoder/lookups/base.rb |  8 +++++++-
 test/unit/lookup_test.rb     | 27 ++++++++++++++++++++++++++-
 2 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/lib/geocoder/lookups/base.rb b/lib/geocoder/lookups/base.rb
index 115f914d..6d1a75ab 100644
--- a/lib/geocoder/lookups/base.rb
+++ b/lib/geocoder/lookups/base.rb
@@ -225,9 +225,15 @@ module Geocoder
       end
 
       def check_response_for_errors!(response)
-        if response.code.to_i == 401
+        if response.code.to_i == 400
+          raise_error(Geocoder::InvalidRequest) ||
+            warn("Geocoding API error: 400 Invalid Request")
+        elsif response.code.to_i == 401
           raise_error(Geocoder::RequestDenied) ||
             warn("Geocoding API error: 401 Unauthorized")
+        elsif response.code.to_i == 402
+          raise_error(Geocoder::OverQueryLimitError) ||
+            warn("Geocoding API error: 402 Forbidden")
         end
       end
 
diff --git a/test/unit/lookup_test.rb b/test/unit/lookup_test.rb
index 5ece0de4..1eb249f7 100644
--- a/test/unit/lookup_test.rb
+++ b/test/unit/lookup_test.rb
@@ -56,7 +56,32 @@ class LookupTest < GeocoderTestCase
     end
   end
 
-  def test_raises_exception_on_401_response
+  def test_raises_exception_on_error_http_status
+    error_statuses = {
+      '400' => Geocoder::InvalidRequest,
+      '401' => Geocoder::RequestDenied,
+      '402' => Geocoder::OverQueryLimitError
+    }
+    Geocoder.configure(always_raise: error_statuses.values)
+    error_statuses.each do |code, err|
+      assert_raises err do
+        lookup = Geocoder::Lookup.get(:smarty_streets)
+        response = MockHttpResponse.new(code: code.to_i)
+        lookup.send(:check_response_for_errors!, response)
+      end
+    end
+  end
+
+    def test_raises_exception_on_401_response
+    Geocoder.configure(always_raise: [Geocoder::RequestDenied])
+    assert_raises Geocoder::RequestDenied do
+      lookup = Geocoder::Lookup.get(:smarty_streets)
+      response = MockHttpResponse.new(code: 401)
+      lookup.send(:check_response_for_errors!, response)
+    end
+  end
+
+    def test_raises_exception_on_402_response
     Geocoder.configure(always_raise: [Geocoder::RequestDenied])
     assert_raises Geocoder::RequestDenied do
       lookup = Geocoder::Lookup.get(:smarty_streets)
-- 
GitLab