Skip to content
Snippets Groups Projects
services_test.rb 6.47 KiB
Newer Older
# encoding: utf-8
require 'test_helper'

Alex Reisner's avatar
Alex Reisner committed
class ServicesTest < Test::Unit::TestCase
  def test_query_url_contains_values_in_params_hash
    Geocoder::Lookup.all_services_except_test.each do |l|
      next if l == :freegeoip # does not use query string
      set_api_key!(l)
      url = Geocoder::Lookup.get(l).send(:query_url, Geocoder::Query.new(
        "test", :params => {:one_in_the_hand => "two in the bush"}
      ))
      # should be "+"s for all lookups except Yahoo
      assert_match /one_in_the_hand=two(%20|\+)in(%20|\+)the(%20|\+)bush/, url,
        "Lookup #{l} does not appear to support arbitrary params in URL"
  # --- Google ---

  def test_google_result_components
    result = Geocoder.search("Madison Square Garden, New York, NY").first
    assert_equal "Manhattan",
      result.address_components_of_type(:sublocality).first['long_name']
  end

  def test_google_returns_city_when_no_locality_in_result
    result = Geocoder.search("no locality").first
    assert_equal "Haram", result.city
  end

  def test_google_city_results_returns_nil_if_no_matching_component_types
    result = Geocoder.search("no city data").first
    assert_equal nil, result.city
  end

  def test_google_precision
    result = Geocoder.search("Madison Square Garden, New York, NY").first
    assert_equal "ROOFTOP",
      result.precision
  end

  def test_google_query_url_contains_bounds
    lookup = Geocoder::Lookup::Google.new
    url = lookup.send(:query_url, Geocoder::Query.new(
      "Some Intersection",
      :bounds => [[40.0, -120.0], [39.0, -121.0]]
    ))
    assert_match /bounds=40.0+%2C-120.0+%7C39.0+%2C-121.0+/, url
  # --- Google Premier ---

  def test_google_premier_result_components
    Geocoder::Configuration.lookup = :google_premier
    result = Geocoder.search("Madison Square Garden, New York, NY").first
    assert_equal "Manhattan",
      result.address_components_of_type(:sublocality).first['long_name']
  end

  def test_google_premier_query_url
    Geocoder::Configuration.api_key = ["deadbeef", "gme-test", "test-dev"]
    assert_equal "http://maps.googleapis.com/maps/api/geocode/json?address=Madison+Square+Garden%2C+New+York%2C+NY&channel=test-dev&client=gme-test&language=en&sensor=false&signature=doJvJqX7YJzgV9rJ0DnVkTGZqTg=",
      Geocoder::Lookup::GooglePremier.new.send(:query_url, Geocoder::Query.new("Madison Square Garden, New York, NY"))
  def test_yahoo_no_results
    Geocoder::Configuration.lookup = :yahoo
    assert_equal [], Geocoder.search("no results")
  end

  def test_yahoo_error
    Geocoder::Configuration.lookup = :yahoo
    # keep test output clean: suppress timeout warning
    orig = $VERBOSE; $VERBOSE = nil
    assert_equal [], Geocoder.search("error")
  ensure
    $VERBOSE = orig
  end

  def test_yahoo_result_components
    Geocoder::Configuration.lookup = :yahoo
    result = Geocoder.search("madison square garden").first
    assert_equal "10001", result.postal_code
  end

  def test_yahoo_address_formatting
    Geocoder::Configuration.lookup = :yahoo
    result = Geocoder.search("madison square garden").first
    assert_equal "Madison Square Garden, New York, NY 10001, United States", result.address
  end


  # --- Yandex ---

  def test_yandex_with_invalid_key
    # keep test output clean: suppress timeout warning
    orig = $VERBOSE; $VERBOSE = nil
    Geocoder::Configuration.lookup = :yandex
    assert_equal [], Geocoder.search("invalid key")
  ensure
    $VERBOSE = orig
  end


  # --- Geocoder.ca ---

  def test_geocoder_ca_result_components
    Geocoder::Configuration.lookup = :geocoder_ca
    result = Geocoder.search([45.423733, -75.676333]).first
    assert_equal "CA", result.country_code
    assert_equal "289 Somerset ST E, Ottawa, ON K1N6W1, Canada", result.address
  end


  # --- FreeGeoIp ---

  def test_freegeoip_result_on_ip_address_search
    result = Geocoder.search("74.200.247.59").first
    assert result.is_a?(Geocoder::Result::Freegeoip)
  end

  def test_freegeoip_result_components
    result = Geocoder.search("74.200.247.59").first
    assert_equal "Plano, TX 75093, United States", result.address
  end


  # --- Bing ---

  def test_bing_result_components
    Geocoder::Configuration.lookup = :bing
    result = Geocoder.search("Madison Square Garden, New York, NY").first
    assert_equal "Madison Square Garden, NY", result.address
    assert_equal "NY", result.state
    assert_equal "New York", result.city
  end

  def test_bing_no_results
    Geocoder::Configuration.lookup = :bing
    results = Geocoder.search("no results")
    assert_equal 0, results.length
  end
Alex Reisner's avatar
Alex Reisner committed

Chris Myers's avatar
Chris Myers committed
  # --- Nominatim ---
Alex Reisner's avatar
Alex Reisner committed

  def test_nominatim_result_components
Chris Myers's avatar
Chris Myers committed
    Geocoder::Configuration.lookup = :nominatim
    result = Geocoder.search("Madison Square Garden, New York, NY").first
    assert_equal "10001", result.postal_code
  end

  def test_nominatim_address_formatting
    Geocoder::Configuration.lookup = :nominatim
    result = Geocoder.search("Madison Square Garden, New York, NY").first
    assert_equal "Madison Square Garden, West 31st Street, Long Island City, New York City, New York, 10001, United States of America",
      result.address
  end
  # --- MapQuest ---

  def test_api_route
    Geocoder::Configuration.lookup = :mapquest
    Geocoder::Configuration.api_key = "abc123"

    lookup = Geocoder::Lookup::Mapquest.new
    query = Geocoder::Query.new("Bluffton, SC")
    res = lookup.send(:query_url, query)
    assert_equal "http://www.mapquestapi.com/geocoding/v1/address?key=abc123&location=Bluffton%2C+SC",
      res
  end

  def test_mapquest_result_components
    Geocoder::Configuration.lookup = :mapquest
    result = Geocoder.search("Madison Square Garden, New York, NY").first
    assert_equal "10001", result.postal_code
  end

  def test_mapquest_address_formatting
    Geocoder::Configuration.lookup = :mapquest
    result = Geocoder.search("Madison Square Garden, New York, NY").first
    assert_equal "46 West 31st Street, New York, NY, 10001, US",
      result.address
  end

  private # ------------------------------------------------------------------

  def set_api_key!(lookup_name)
    if lookup_name == :google_premier
      Geocoder::Configuration.api_key = [
        'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
        'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
        'cccccccccccccccccccccccccccccc'
      ]
    elsif lookup_name == :yahoo
      Geocoder::Configuration.api_key = [
        'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
        'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
      ]
    else
      Geocoder::Configuration.api_key = nil
    end
  end