diff --git a/lib/geocoder/lookups/locationiq.rb b/lib/geocoder/lookups/locationiq.rb index 7f14d214e5c14a9525aca0b20440195f840c96fc..a29581c454aff306bcda89d662d89396cfd3b0c1 100644 --- a/lib/geocoder/lookups/locationiq.rb +++ b/lib/geocoder/lookups/locationiq.rb @@ -16,5 +16,17 @@ module Geocoder::Lookup host = configuration[:host] || "locationiq.org/v1" "#{protocol}://#{host}/#{method}?key=#{configuration.api_key}&" + url_query_string(query) end + + private + + def results(query) + return [] unless doc = fetch_data(query) + + if !doc.is_a?(Array) && doc['error'] =~ /Invalid\skey/ + raise_error(Geocoder::InvalidApiKey, doc['error']) + end + + doc.is_a?(Array) ? doc : [doc] + end end end diff --git a/test/fixtures/locationiq_invalid_api_key b/test/fixtures/locationiq_invalid_api_key new file mode 100644 index 0000000000000000000000000000000000000000..636cff25ac7a882ca54d235b08c2b74904f1a1f5 --- /dev/null +++ b/test/fixtures/locationiq_invalid_api_key @@ -0,0 +1,3 @@ +{ + "error": "Invalid key" +} diff --git a/test/fixtures/locationiq_madison_square_garden b/test/fixtures/locationiq_madison_square_garden new file mode 100644 index 0000000000000000000000000000000000000000..b1c03ffd45cb3c1a34274d64158b0d13acf06474 --- /dev/null +++ b/test/fixtures/locationiq_madison_square_garden @@ -0,0 +1,150 @@ +[ + + { + "place_id": "30632629", + "licence": "Data Copyright OpenStreetMap Contributors, Some Rights Reserved. CC-BY-SA 2.0.", + "osm_type": "way", + "osm_id": "24801588", + "boundingbox": [ + "40.749828338623", + "40.7511596679688", + "-73.9943389892578", + "-73.9926528930664" + ], + "polygonpoints": [ + [ + "-73.9943346", + "40.7503638" + ], + [ + "-73.9942745", + "40.7504158" + ], + [ + "-73.9942593", + "40.750629" + ], + [ + "-73.9941343", + "40.7508432" + ], + [ + "-73.9939794", + "40.7509703" + ], + [ + "-73.9938042", + "40.7510532" + ], + [ + "-73.9938025", + "40.7511311" + ], + [ + "-73.9936051", + "40.7511571" + ], + [ + "-73.9935673", + "40.751105" + ], + [ + "-73.9934095", + "40.7511089" + ], + [ + "-73.9931235", + "40.7510548" + ], + [ + "-73.9928863", + "40.7509311" + ], + [ + "-73.9928068", + "40.750949" + ], + [ + "-73.992721", + "40.7508515" + ], + [ + "-73.9927444", + "40.7507889" + ], + [ + "-73.9926693", + "40.7506457" + ], + [ + "-73.9926597", + "40.7503657" + ], + [ + "-73.9928305", + "40.7500953" + ], + [ + "-73.9929757", + "40.7499911" + ], + [ + "-73.9931281", + "40.7499238" + ], + [ + "-73.993133", + "40.7498631" + ], + [ + "-73.9932961", + "40.7498306" + ], + [ + "-73.9933664", + "40.7498742" + ], + [ + "-73.993471", + "40.7498701" + ], + [ + "-73.9938023", + "40.7499263" + ], + [ + "-73.9940703", + "40.7500756" + ], + [ + "-73.9941876", + "40.7502038" + ], + [ + "-73.9942831", + "40.7502142" + ], + [ + "-73.9943346", + "40.7503638" + ] + ], + "lat": "40.7504928941818", + "lon": "-73.993466492276", + "display_name": "Madison Square Garden, West 31st Street, Long Island City, New York City, New York, 10001, United States of America", + "class": "leisure", + "type": "stadium", + "address": { + "stadium": "Madison Square Garden", + "road": "West 31st Street", + "suburb": "Long Island City", + "city": "New York City", + "county": "New York", + "state": "New York", + "postcode": "10001", + "country": "United States of America", + "country_code": "us" + } + } + +] diff --git a/test/fixtures/locationiq_no_results b/test/fixtures/locationiq_no_results new file mode 100644 index 0000000000000000000000000000000000000000..1e3ec7217afba05e6dcd456b0e89ec7f17bf7b55 --- /dev/null +++ b/test/fixtures/locationiq_no_results @@ -0,0 +1 @@ +[ ] diff --git a/test/fixtures/locationiq_over_limit b/test/fixtures/locationiq_over_limit new file mode 100644 index 0000000000000000000000000000000000000000..9b9f64d101860b2e098573d63a815d06b8ce2cb7 --- /dev/null +++ b/test/fixtures/locationiq_over_limit @@ -0,0 +1 @@ +<html>\n<head>\n<title>Bandwidth limit exceeded</title>\n</head>\n<body>\n<h1>Bandwidth limit exceeded</h1>\n\n<p>You have been temporarily blocked because you have been overusing OSM's geocoding service or because you have not provided sufficient identification of your application. This block will be automatically lifted after a while. Please take the time and adapt your scripts to reduce the number of requests and make sure that you send a valid UserAgent or Referer.</p>\n\n<p>For more information, consult the <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim_usage_policy\">usage policy</a> for the OSM Nominatim server.\n</body>\n</head>\n diff --git a/test/test_helper.rb b/test/test_helper.rb index 89aa2bef97f4884b047a70375bc5441efe77833b..9051042b0033d18bdb7d1f99a3f5cd89b210c623 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -176,6 +176,14 @@ module Geocoder end end + require 'geocoder/lookups/locationiq' + class Locationiq + private + def fixture_prefix + "locationiq" + end + end + require 'geocoder/lookups/yandex' class Yandex private diff --git a/test/unit/lookups/locationiq_test.rb b/test/unit/lookups/locationiq_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..05fee245f1e68ca00231ad10d25bd928cce7d628 --- /dev/null +++ b/test/unit/lookups/locationiq_test.rb @@ -0,0 +1,24 @@ +# encoding: utf-8 +require 'unit/lookups/nominatim_test' +require 'test_helper' + +class LocationIq < NominatimTest + + def setup + Geocoder.configure(lookup: :locationiq) + set_api_key!(:locationiq) + end + + def test_url_contains_api_key + Geocoder.configure(locationiq: {api_key: "abc123"}) + query = Geocoder::Query.new("Leadville, CO") + assert_equal "http://locationiq.org/v1/search.php?key=abc123&accept-language=en&addressdetails=1&format=json&q=Leadville%2C+CO", query.url + end + + def test_raises_exception_with_invalid_api_key + Geocoder.configure(always_raise: [Geocoder::InvalidApiKey]) + assert_raises Geocoder::InvalidApiKey do + Geocoder.search("invalid api key") + end + end +end