From 08286a12e5a38bcac394f71e9f33662519e4d4d7 Mon Sep 17 00:00:00 2001
From: Alex Reisner <alex@alexreisner.com>
Date: Sat, 22 Dec 2012 20:01:47 -0500
Subject: [PATCH] Make params passed to Query override config values.

If you do this:

  Geocoder::Query.new("Kremlin, Moscow", :params => {:language => "ru"})

you should get a response in Russian ("ru") regardless of the value set
in Geocoder.configure(...).
---
 lib/geocoder/lookups/bing.rb           |  4 ++--
 lib/geocoder/lookups/geocoder_ca.rb    |  4 ++--
 lib/geocoder/lookups/google.rb         |  4 ++--
 lib/geocoder/lookups/google_premier.rb |  2 +-
 lib/geocoder/lookups/mapquest.rb       |  5 ++---
 lib/geocoder/lookups/maxmind.rb        |  4 ++--
 lib/geocoder/lookups/nominatim.rb      |  4 ++--
 lib/geocoder/lookups/yahoo.rb          |  4 ++--
 lib/geocoder/lookups/yandex.rb         |  4 ++--
 test/lookup_test.rb                    | 21 +++++++++++++++++++++
 10 files changed, 38 insertions(+), 18 deletions(-)

diff --git a/lib/geocoder/lookups/bing.rb b/lib/geocoder/lookups/bing.rb
index 44184508..b99c8d6c 100644
--- a/lib/geocoder/lookups/bing.rb
+++ b/lib/geocoder/lookups/bing.rb
@@ -38,10 +38,10 @@ module Geocoder::Lookup
     end
 
     def query_url_params(query)
-      super.merge(
+      {
         :key => configuration.api_key,
         :query => query.reverse_geocode? ? nil : query.sanitized_text
-      )
+      }.merge(super)
     end
   end
 end
diff --git a/lib/geocoder/lookups/geocoder_ca.rb b/lib/geocoder/lookups/geocoder_ca.rb
index 81e1f850..7ec7c1e9 100644
--- a/lib/geocoder/lookups/geocoder_ca.rb
+++ b/lib/geocoder/lookups/geocoder_ca.rb
@@ -27,12 +27,12 @@ module Geocoder::Lookup
     end
 
     def query_url_params(query)
-      params = super.merge(
+      params = {
         :geoit    => "xml",
         :jsonp    => 1,
         :callback => "test",
         :auth     => configuration.api_key
-      )
+      }.merge(super)
       if query.reverse_geocode?
         lat,lon = query.coordinates
         params[:latt] = lat
diff --git a/lib/geocoder/lookups/google.rb b/lib/geocoder/lookups/google.rb
index 96387c45..c16bf85f 100644
--- a/lib/geocoder/lookups/google.rb
+++ b/lib/geocoder/lookups/google.rb
@@ -54,9 +54,9 @@ module Geocoder::Lookup
     end
 
     def query_url_params(query)
-      super.merge(query_url_google_params(query)).merge(
+      query_url_google_params(query).merge(
         :key => configuration.api_key
-      )
+      ).merge(super)
     end
   end
 end
diff --git a/lib/geocoder/lookups/google_premier.rb b/lib/geocoder/lookups/google_premier.rb
index d555c632..d59adf9d 100644
--- a/lib/geocoder/lookups/google_premier.rb
+++ b/lib/geocoder/lookups/google_premier.rb
@@ -22,7 +22,7 @@ module Geocoder::Lookup
     private # ---------------------------------------------------------------
 
     def query_url_params(query)
-      super.merge(query_url_google_params(query)).merge(
+      query_url_google_params(query).merge(super).merge(
         :key => nil, # don't use param inherited from Google lookup
         :client => configuration.api_key[1],
         :channel => configuration.api_key[2]
diff --git a/lib/geocoder/lookups/mapquest.rb b/lib/geocoder/lookups/mapquest.rb
index a0e31f39..8c325e49 100644
--- a/lib/geocoder/lookups/mapquest.rb
+++ b/lib/geocoder/lookups/mapquest.rb
@@ -27,12 +27,11 @@ module Geocoder::Lookup
     end
 
     def query_url_params(query)
-      key = configuration.api_key
       params = { :location => query.sanitized_text }
-      if key
+      if key = configuration.api_key
         params[:key] = CGI.unescape(key)
       end
-      super.merge(params)
+      params.merge(super)
     end
 
     def results(query)
diff --git a/lib/geocoder/lookups/maxmind.rb b/lib/geocoder/lookups/maxmind.rb
index ba41e40e..e0275033 100644
--- a/lib/geocoder/lookups/maxmind.rb
+++ b/lib/geocoder/lookups/maxmind.rb
@@ -39,10 +39,10 @@ module Geocoder::Lookup
     end
 
     def query_url_params(query)
-      super.merge(
+      {
         :l => configuration.api_key,
         :i => query.sanitized_text
-      )
+      }.merge(super)
     end
   end
 end
diff --git a/lib/geocoder/lookups/nominatim.rb b/lib/geocoder/lookups/nominatim.rb
index aea86e4b..e8d36d00 100644
--- a/lib/geocoder/lookups/nominatim.rb
+++ b/lib/geocoder/lookups/nominatim.rb
@@ -26,12 +26,12 @@ module Geocoder::Lookup
     end
 
     def query_url_params(query)
-      params = super.merge(
+      params = {
         :format => "json",
         :polygon => "1",
         :addressdetails => "1",
         :"accept-language" => configuration.language
-      )
+      }.merge(super)
       if query.reverse_geocode?
         lat,lon = query.coordinates
         params[:lat] = lat
diff --git a/lib/geocoder/lookups/yahoo.rb b/lib/geocoder/lookups/yahoo.rb
index a271b776..0c27cc0c 100644
--- a/lib/geocoder/lookups/yahoo.rb
+++ b/lib/geocoder/lookups/yahoo.rb
@@ -60,13 +60,13 @@ module Geocoder::Lookup
     end
 
     def query_url_params(query)
-      super.merge(
+      {
         :location => query.sanitized_text,
         :flags => "JXTSR",
         :gflags => "AC#{'R' if query.reverse_geocode?}",
         :locale => "#{configuration.language}_US",
         :appid => configuration.api_key
-      )
+      }.merge(super)
     end
 
     def cache_key(query)
diff --git a/lib/geocoder/lookups/yandex.rb b/lib/geocoder/lookups/yandex.rb
index 9e93d50f..f5559efb 100644
--- a/lib/geocoder/lookups/yandex.rb
+++ b/lib/geocoder/lookups/yandex.rb
@@ -43,12 +43,12 @@ module Geocoder::Lookup
       else
         q = query.sanitized_text
       end
-      super.merge(
+      {
         :geocode => q,
         :format => "json",
         :plng => "#{configuration.language}", # supports ru, uk, be
         :key => configuration.api_key
-      )
+      }.merge(super)
     end
   end
 end
diff --git a/test/lookup_test.rb b/test/lookup_test.rb
index eeba7ba5..51c2e0d6 100644
--- a/test/lookup_test.rb
+++ b/test/lookup_test.rb
@@ -33,6 +33,27 @@ class LookupTest < Test::Unit::TestCase
     end
   end
 
+  {
+    :bing => :key,
+    :geocoder_ca => :auth,
+    :google => :language,
+    :google_premier => :language,
+    :mapquest => :key,
+    :maxmind => :l,
+    :nominatim => :"accept-language",
+    :yahoo => :locale,
+    :yandex => :plng
+  }.each do |l,p|
+    define_method "test_passing_param_to_#{l}_query_overrides_configuration_value" do
+      set_api_key!(l)
+      url = Geocoder::Lookup.get(l).query_url(Geocoder::Query.new(
+        "test", :params => {p => "xxxx"}
+      ))
+      assert_match /#{p}=xxxx/, url,
+        "Param passed to #{l} lookup does not override configuration value"
+    end
+  end
+
   def test_raises_exception_on_invalid_key
     Geocoder.configure(:always_raise => [Geocoder::InvalidApiKey])
     #Geocoder::Lookup.all_services_except_test.each do |l|
-- 
GitLab