diff --git a/lib/geocoder/lookups/bing.rb b/lib/geocoder/lookups/bing.rb index b99c8d6ce6e5a8d2df95b3f24f24bc6887827a04..ce78da803275e7cacd93976279a363ed557fc540 100644 --- a/lib/geocoder/lookups/bing.rb +++ b/lib/geocoder/lookups/bing.rb @@ -17,13 +17,21 @@ module Geocoder::Lookup end def query_url(query) - "#{protocol}://dev.virtualearth.net/REST/v1/Locations" + - (query.reverse_geocode? ? "/#{query.sanitized_text}?" : "?") + - url_query_string(query) + base_url(query) + url_query_string(query) end private # --------------------------------------------------------------- + def base_url(query) + ["#{protocol}://dev.virtualearth.net/REST/v1/Locations", + query.options[:region], + sanitized_text(query)].compact.join("/") + "?" + end + + def sanitized_text(query) + URI.escape(query.sanitized_text.strip) if !query.reverse_geocode? + end + def results(query) return [] unless doc = fetch_data(query) @@ -40,7 +48,7 @@ module Geocoder::Lookup def query_url_params(query) { :key => configuration.api_key, - :query => query.reverse_geocode? ? nil : query.sanitized_text + :query => query.reverse_geocode? ? query.sanitized_text : nil }.merge(super) end end diff --git a/test/services_test.rb b/test/services_test.rb index f7c7ca61ac38fd812e8e5f6bc46ca4cfd41b3090..e084a40c382eecacbf89c943364351118188d42e 100644 --- a/test/services_test.rb +++ b/test/services_test.rb @@ -264,6 +264,45 @@ class ServicesTest < Test::Unit::TestCase assert_equal 0, results.length end + def test_bing_query_url_contains_region + lookup = Geocoder::Lookup::Bing.new + url = lookup.query_url(Geocoder::Query.new( + "manchester", + :region => "uk" + )) + assert_match /Locations\/uk\/manchester/, url + assert_no_match /query/, url + end + + def test_bing_query_url_without_region + lookup = Geocoder::Lookup::Bing.new + url = lookup.query_url(Geocoder::Query.new( + "manchester" + )) + assert_match /Locations\/manchester/, url + assert_no_match /query/, url + end + + def test_bing_query_url_contains_address_with_spaces + lookup = Geocoder::Lookup::Bing.new + url = lookup.query_url(Geocoder::Query.new( + "manchester, lancashire", + :region => "uk" + )) + assert_match /Locations\/uk\/manchester,%20lancashire/, url + assert_no_match /query/, url + end + + def test_bing_query_url_contains_address_with_trailing_and_leading_spaces + lookup = Geocoder::Lookup::Bing.new + url = lookup.query_url(Geocoder::Query.new( + " manchester, lancashire ", + :region => "uk" + )) + assert_match /Locations\/uk\/manchester,%20lancashire/, url + assert_no_match /query/, url + end + # --- Nominatim --- def test_nominatim_result_components