bw-geocoder 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. data/.gitignore +6 -0
  2. data/.travis.yml +31 -0
  3. data/CHANGELOG.md +377 -0
  4. data/LICENSE +20 -0
  5. data/README.md +1041 -0
  6. data/Rakefile +25 -0
  7. data/bin/geocode +5 -0
  8. data/examples/autoexpire_cache_dalli.rb +62 -0
  9. data/examples/autoexpire_cache_redis.rb +28 -0
  10. data/examples/cache_bypass.rb +48 -0
  11. data/gemfiles/Gemfile.mongoid-2.4.x +16 -0
  12. data/lib/generators/geocoder/config/config_generator.rb +14 -0
  13. data/lib/generators/geocoder/config/templates/initializer.rb +21 -0
  14. data/lib/generators/geocoder/maxmind/geolite_city_generator.rb +28 -0
  15. data/lib/generators/geocoder/maxmind/geolite_country_generator.rb +28 -0
  16. data/lib/generators/geocoder/maxmind/templates/migration/geolite_city.rb +30 -0
  17. data/lib/generators/geocoder/maxmind/templates/migration/geolite_country.rb +17 -0
  18. data/lib/geocoder/cache.rb +90 -0
  19. data/lib/geocoder/calculations.rb +428 -0
  20. data/lib/geocoder/cli.rb +121 -0
  21. data/lib/geocoder/configuration.rb +124 -0
  22. data/lib/geocoder/configuration_hash.rb +11 -0
  23. data/lib/geocoder/exceptions.rb +21 -0
  24. data/lib/geocoder/ip_address.rb +21 -0
  25. data/lib/geocoder/lookup.rb +100 -0
  26. data/lib/geocoder/lookups/baidu.rb +55 -0
  27. data/lib/geocoder/lookups/baidu_ip.rb +54 -0
  28. data/lib/geocoder/lookups/base.rb +302 -0
  29. data/lib/geocoder/lookups/bing.rb +59 -0
  30. data/lib/geocoder/lookups/dstk.rb +20 -0
  31. data/lib/geocoder/lookups/esri.rb +48 -0
  32. data/lib/geocoder/lookups/freegeoip.rb +47 -0
  33. data/lib/geocoder/lookups/geocoder_ca.rb +54 -0
  34. data/lib/geocoder/lookups/geocoder_us.rb +39 -0
  35. data/lib/geocoder/lookups/geocodio.rb +42 -0
  36. data/lib/geocoder/lookups/google.rb +67 -0
  37. data/lib/geocoder/lookups/google_places_details.rb +50 -0
  38. data/lib/geocoder/lookups/google_premier.rb +47 -0
  39. data/lib/geocoder/lookups/here.rb +62 -0
  40. data/lib/geocoder/lookups/ip_address_labs.rb +43 -0
  41. data/lib/geocoder/lookups/mapquest.rb +60 -0
  42. data/lib/geocoder/lookups/maxmind.rb +90 -0
  43. data/lib/geocoder/lookups/maxmind_local.rb +58 -0
  44. data/lib/geocoder/lookups/nominatim.rb +52 -0
  45. data/lib/geocoder/lookups/okf.rb +43 -0
  46. data/lib/geocoder/lookups/opencagedata.rb +58 -0
  47. data/lib/geocoder/lookups/ovi.rb +62 -0
  48. data/lib/geocoder/lookups/pointpin.rb +68 -0
  49. data/lib/geocoder/lookups/smarty_streets.rb +45 -0
  50. data/lib/geocoder/lookups/telize.rb +40 -0
  51. data/lib/geocoder/lookups/test.rb +44 -0
  52. data/lib/geocoder/lookups/yahoo.rb +88 -0
  53. data/lib/geocoder/lookups/yandex.rb +54 -0
  54. data/lib/geocoder/models/active_record.rb +50 -0
  55. data/lib/geocoder/models/base.rb +39 -0
  56. data/lib/geocoder/models/mongo_base.rb +64 -0
  57. data/lib/geocoder/models/mongo_mapper.rb +26 -0
  58. data/lib/geocoder/models/mongoid.rb +32 -0
  59. data/lib/geocoder/query.rb +111 -0
  60. data/lib/geocoder/railtie.rb +26 -0
  61. data/lib/geocoder/request.rb +25 -0
  62. data/lib/geocoder/results/baidu.rb +79 -0
  63. data/lib/geocoder/results/baidu_ip.rb +62 -0
  64. data/lib/geocoder/results/base.rb +67 -0
  65. data/lib/geocoder/results/bing.rb +48 -0
  66. data/lib/geocoder/results/dstk.rb +6 -0
  67. data/lib/geocoder/results/esri.rb +51 -0
  68. data/lib/geocoder/results/freegeoip.rb +45 -0
  69. data/lib/geocoder/results/geocoder_ca.rb +60 -0
  70. data/lib/geocoder/results/geocoder_us.rb +39 -0
  71. data/lib/geocoder/results/geocodio.rb +66 -0
  72. data/lib/geocoder/results/google.rb +124 -0
  73. data/lib/geocoder/results/google_places_details.rb +35 -0
  74. data/lib/geocoder/results/google_premier.rb +6 -0
  75. data/lib/geocoder/results/here.rb +62 -0
  76. data/lib/geocoder/results/ip_address_labs.rb +78 -0
  77. data/lib/geocoder/results/mapquest.rb +51 -0
  78. data/lib/geocoder/results/maxmind.rb +135 -0
  79. data/lib/geocoder/results/maxmind_local.rb +49 -0
  80. data/lib/geocoder/results/nominatim.rb +94 -0
  81. data/lib/geocoder/results/okf.rb +106 -0
  82. data/lib/geocoder/results/opencagedata.rb +82 -0
  83. data/lib/geocoder/results/ovi.rb +62 -0
  84. data/lib/geocoder/results/pointpin.rb +44 -0
  85. data/lib/geocoder/results/smarty_streets.rb +106 -0
  86. data/lib/geocoder/results/telize.rb +45 -0
  87. data/lib/geocoder/results/test.rb +33 -0
  88. data/lib/geocoder/results/yahoo.rb +55 -0
  89. data/lib/geocoder/results/yandex.rb +84 -0
  90. data/lib/geocoder/sql.rb +107 -0
  91. data/lib/geocoder/stores/active_record.rb +278 -0
  92. data/lib/geocoder/stores/base.rb +127 -0
  93. data/lib/geocoder/stores/mongo_base.rb +89 -0
  94. data/lib/geocoder/stores/mongo_mapper.rb +13 -0
  95. data/lib/geocoder/stores/mongoid.rb +13 -0
  96. data/lib/geocoder/version.rb +3 -0
  97. data/lib/geocoder.rb +47 -0
  98. data/lib/hash_recursive_merge.rb +74 -0
  99. data/lib/maxmind_database.rb +109 -0
  100. data/lib/oauth_util.rb +112 -0
  101. data/lib/tasks/geocoder.rake +29 -0
  102. data/lib/tasks/maxmind.rake +73 -0
  103. data/test/fixtures/baidu_invalid_key +1 -0
  104. data/test/fixtures/baidu_ip_202_198_16_3 +19 -0
  105. data/test/fixtures/baidu_ip_invalid_key +1 -0
  106. data/test/fixtures/baidu_ip_no_results +1 -0
  107. data/test/fixtures/baidu_no_results +1 -0
  108. data/test/fixtures/baidu_reverse +1 -0
  109. data/test/fixtures/baidu_shanghai_pearl_tower +12 -0
  110. data/test/fixtures/bing_invalid_key +1 -0
  111. data/test/fixtures/bing_madison_square_garden +40 -0
  112. data/test/fixtures/bing_no_results +16 -0
  113. data/test/fixtures/bing_reverse +42 -0
  114. data/test/fixtures/cloudmade_invalid_key +1 -0
  115. data/test/fixtures/cloudmade_madison_square_garden +1 -0
  116. data/test/fixtures/cloudmade_no_results +1 -0
  117. data/test/fixtures/esri_madison_square_garden +59 -0
  118. data/test/fixtures/esri_no_results +8 -0
  119. data/test/fixtures/esri_reverse +21 -0
  120. data/test/fixtures/freegeoip_74_200_247_59 +12 -0
  121. data/test/fixtures/freegeoip_no_results +1 -0
  122. data/test/fixtures/geocoder_ca_madison_square_garden +1 -0
  123. data/test/fixtures/geocoder_ca_no_results +1 -0
  124. data/test/fixtures/geocoder_ca_reverse +34 -0
  125. data/test/fixtures/geocoder_us_madison_square_garden +1 -0
  126. data/test/fixtures/geocoder_us_no_results +1 -0
  127. data/test/fixtures/geocodio_1101_pennsylvania_ave +1 -0
  128. data/test/fixtures/geocodio_bad_api_key +3 -0
  129. data/test/fixtures/geocodio_invalid +4 -0
  130. data/test/fixtures/geocodio_no_results +1 -0
  131. data/test/fixtures/geocodio_over_query_limit +4 -0
  132. data/test/fixtures/google_garbage +456 -0
  133. data/test/fixtures/google_madison_square_garden +57 -0
  134. data/test/fixtures/google_no_city_data +44 -0
  135. data/test/fixtures/google_no_locality +51 -0
  136. data/test/fixtures/google_no_results +4 -0
  137. data/test/fixtures/google_over_limit +4 -0
  138. data/test/fixtures/google_places_details_invalid_request +4 -0
  139. data/test/fixtures/google_places_details_madison_square_garden +120 -0
  140. data/test/fixtures/google_places_details_no_results +4 -0
  141. data/test/fixtures/google_places_details_no_reviews +60 -0
  142. data/test/fixtures/google_places_details_no_types +66 -0
  143. data/test/fixtures/here_madison_square_garden +72 -0
  144. data/test/fixtures/here_no_results +8 -0
  145. data/test/fixtures/mapquest_error +16 -0
  146. data/test/fixtures/mapquest_invalid_api_key +16 -0
  147. data/test/fixtures/mapquest_invalid_request +16 -0
  148. data/test/fixtures/mapquest_madison_square_garden +52 -0
  149. data/test/fixtures/mapquest_no_results +16 -0
  150. data/test/fixtures/maxmind_24_24_24_21 +1 -0
  151. data/test/fixtures/maxmind_24_24_24_22 +1 -0
  152. data/test/fixtures/maxmind_24_24_24_23 +1 -0
  153. data/test/fixtures/maxmind_24_24_24_24 +1 -0
  154. data/test/fixtures/maxmind_74_200_247_59 +1 -0
  155. data/test/fixtures/maxmind_invalid_key +1 -0
  156. data/test/fixtures/maxmind_no_results +1 -0
  157. data/test/fixtures/nominatim_madison_square_garden +150 -0
  158. data/test/fixtures/nominatim_no_results +1 -0
  159. data/test/fixtures/nominatim_over_limit +1 -0
  160. data/test/fixtures/okf_kirstinmaki +67 -0
  161. data/test/fixtures/okf_no_results +4 -0
  162. data/test/fixtures/opencagedata_invalid_api_key +25 -0
  163. data/test/fixtures/opencagedata_invalid_request +26 -0
  164. data/test/fixtures/opencagedata_madison_square_garden +73 -0
  165. data/test/fixtures/opencagedata_no_results +29 -0
  166. data/test/fixtures/opencagedata_over_limit +31 -0
  167. data/test/fixtures/ovi_madison_square_garden +72 -0
  168. data/test/fixtures/ovi_no_results +8 -0
  169. data/test/fixtures/pointpin_10_10_10_10 +1 -0
  170. data/test/fixtures/pointpin_555_555_555_555 +1 -0
  171. data/test/fixtures/pointpin_80_111_555_555 +1 -0
  172. data/test/fixtures/pointpin_no_results +1 -0
  173. data/test/fixtures/smarty_streets_11211 +1 -0
  174. data/test/fixtures/smarty_streets_madison_square_garden +47 -0
  175. data/test/fixtures/smarty_streets_no_results +1 -0
  176. data/test/fixtures/telize_10_10_10_10 +1 -0
  177. data/test/fixtures/telize_555_555_555_555 +4 -0
  178. data/test/fixtures/telize_74_200_247_59 +1 -0
  179. data/test/fixtures/telize_no_results +1 -0
  180. data/test/fixtures/yahoo_error +1 -0
  181. data/test/fixtures/yahoo_invalid_key +2 -0
  182. data/test/fixtures/yahoo_madison_square_garden +52 -0
  183. data/test/fixtures/yahoo_no_results +10 -0
  184. data/test/fixtures/yahoo_over_limit +2 -0
  185. data/test/fixtures/yandex_canada_rue_dupuis_14 +446 -0
  186. data/test/fixtures/yandex_invalid_key +1 -0
  187. data/test/fixtures/yandex_kremlin +48 -0
  188. data/test/fixtures/yandex_new_york +1 -0
  189. data/test/fixtures/yandex_no_city_and_town +112 -0
  190. data/test/fixtures/yandex_no_results +16 -0
  191. data/test/integration/http_client_test.rb +31 -0
  192. data/test/mongoid_test_helper.rb +43 -0
  193. data/test/test_helper.rb +386 -0
  194. data/test/unit/active_record_test.rb +16 -0
  195. data/test/unit/cache_test.rb +37 -0
  196. data/test/unit/calculations_test.rb +220 -0
  197. data/test/unit/configuration_test.rb +55 -0
  198. data/test/unit/error_handling_test.rb +56 -0
  199. data/test/unit/geocoder_test.rb +78 -0
  200. data/test/unit/https_test.rb +17 -0
  201. data/test/unit/ip_address_test.rb +27 -0
  202. data/test/unit/lookup_test.rb +153 -0
  203. data/test/unit/lookups/bing_test.rb +68 -0
  204. data/test/unit/lookups/dstk_test.rb +26 -0
  205. data/test/unit/lookups/esri_test.rb +48 -0
  206. data/test/unit/lookups/freegeoip_test.rb +27 -0
  207. data/test/unit/lookups/geocoder_ca_test.rb +17 -0
  208. data/test/unit/lookups/geocodio_test.rb +55 -0
  209. data/test/unit/lookups/google_places_details_test.rb +122 -0
  210. data/test/unit/lookups/google_premier_test.rb +22 -0
  211. data/test/unit/lookups/google_test.rb +84 -0
  212. data/test/unit/lookups/mapquest_test.rb +60 -0
  213. data/test/unit/lookups/maxmind_local_test.rb +28 -0
  214. data/test/unit/lookups/maxmind_test.rb +63 -0
  215. data/test/unit/lookups/nominatim_test.rb +31 -0
  216. data/test/unit/lookups/okf_test.rb +38 -0
  217. data/test/unit/lookups/opencagedata_test.rb +64 -0
  218. data/test/unit/lookups/pointpin_test.rb +30 -0
  219. data/test/unit/lookups/smarty_streets_test.rb +71 -0
  220. data/test/unit/lookups/telize_test.rb +36 -0
  221. data/test/unit/lookups/yahoo_test.rb +35 -0
  222. data/test/unit/method_aliases_test.rb +26 -0
  223. data/test/unit/model_test.rb +38 -0
  224. data/test/unit/mongoid_test.rb +47 -0
  225. data/test/unit/near_test.rb +87 -0
  226. data/test/unit/oauth_util_test.rb +31 -0
  227. data/test/unit/proxy_test.rb +37 -0
  228. data/test/unit/query_test.rb +52 -0
  229. data/test/unit/rake_task_test.rb +21 -0
  230. data/test/unit/request_test.rb +35 -0
  231. data/test/unit/result_test.rb +72 -0
  232. data/test/unit/test_mode_test.rb +70 -0
  233. metadata +281 -0
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class DstkTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(lookup: :dstk)
9
+ end
10
+
11
+ def test_dstk_result_components
12
+ result = Geocoder.search("Madison Square Garden, New York, NY").first
13
+ assert_equal "Manhattan", result.address_components_of_type(:sublocality).first['long_name']
14
+ end
15
+
16
+ def test_dstk_query_url
17
+ query = Geocoder::Query.new("Madison Square Garden, New York, NY")
18
+ assert_equal "http://www.datasciencetoolkit.org/maps/api/geocode/json?address=Madison+Square+Garden%2C+New+York%2C+NY&language=en&sensor=false", query.url
19
+ end
20
+
21
+ def test_dstk_query_url_with_custom_host
22
+ Geocoder.configure(dstk: {host: 'NOT_AN_ACTUAL_HOST'})
23
+ query = Geocoder::Query.new("Madison Square Garden, New York, NY")
24
+ assert_equal "http://NOT_AN_ACTUAL_HOST/maps/api/geocode/json?address=Madison+Square+Garden%2C+New+York%2C+NY&language=en&sensor=false", query.url
25
+ end
26
+ end
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class EsriTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(lookup: :esri)
9
+ end
10
+
11
+ def test_query_for_geocode
12
+ query = Geocoder::Query.new("Bluffton, SC")
13
+ lookup = Geocoder::Lookup.get(:esri)
14
+ res = lookup.query_url(query)
15
+ assert_equal "http://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/find?f=pjson&outFields=%2A&text=Bluffton%2C+SC",
16
+ res
17
+ end
18
+
19
+ def test_query_for_reverse_geocode
20
+ query = Geocoder::Query.new([45.423733, -75.676333])
21
+ lookup = Geocoder::Lookup.get(:esri)
22
+ res = lookup.query_url(query)
23
+ assert_equal "http://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/reverseGeocode?f=pjson&location=-75.676333%2C45.423733&outFields=%2A",
24
+ res
25
+ end
26
+
27
+ def test_results_component
28
+ result = Geocoder.search("Madison Square Garden, New York, NY").first
29
+ assert_equal "10001", result.postal_code
30
+ assert_equal "USA", result.country
31
+ assert_equal "Madison Square Garden", result.address
32
+ assert_equal "New York", result.city
33
+ assert_equal "New York", result.state
34
+ assert_equal(40.75004981300049, result.coordinates[0])
35
+ assert_equal(-73.99423889799965, result.coordinates[1])
36
+ end
37
+
38
+ def test_results_component_when_reverse_geocoding
39
+ result = Geocoder.search([45.423733, -75.676333]).first
40
+ assert_equal "75007", result.postal_code
41
+ assert_equal "FRA", result.country
42
+ assert_equal "4 Avenue Gustave Eiffel", result.address
43
+ assert_equal "Paris", result.city
44
+ assert_equal "Île-de-France", result.state
45
+ assert_equal(48.858129997357558, result.coordinates[0])
46
+ assert_equal(2.2956200048981574, result.coordinates[1])
47
+ end
48
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class FreegeoipTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(ip_lookup: :freegeoip)
9
+ end
10
+
11
+ def test_result_on_ip_address_search
12
+ result = Geocoder.search("74.200.247.59").first
13
+ assert result.is_a?(Geocoder::Result::Freegeoip)
14
+ end
15
+
16
+ def test_result_components
17
+ result = Geocoder.search("74.200.247.59").first
18
+ assert_equal "Plano, TX 75093, United States", result.address
19
+ end
20
+
21
+ def test_host_config
22
+ Geocoder.configure(freegeoip: {host: "local.com"})
23
+ lookup = Geocoder::Lookup::Freegeoip.new
24
+ query = Geocoder::Query.new("24.24.24.23")
25
+ assert_match %r(http://local\.com), lookup.query_url(query)
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class GeocoderCaTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(lookup: :geocoder_ca)
9
+ set_api_key!(:geocoder_ca)
10
+ end
11
+
12
+ def test_result_components
13
+ result = Geocoder.search([45.423733, -75.676333]).first
14
+ assert_equal "CA", result.country_code
15
+ assert_equal "289 Somerset ST E, Ottawa, ON K1N6W1, Canada", result.address
16
+ end
17
+ end
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class GeocodioTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(lookup: :geocodio)
9
+ set_api_key!(:geocodio)
10
+ end
11
+
12
+ def test_result_components
13
+ result = Geocoder.search("1101 Pennsylvania Ave NW, Washington DC").first
14
+ assert_equal 1.0, result.accuracy
15
+ assert_equal "1101", result.number
16
+ assert_equal "Ave", result.suffix
17
+ assert_equal "DC", result.state
18
+ assert_equal "20004", result.zip
19
+ assert_equal "NW", result.postdirectional
20
+ assert_equal "Washington", result.city
21
+ assert_equal "1101 Pennsylvania Ave NW, Washington DC, 20004", result.formatted_address
22
+ assert_equal({ "lat" => "38.895019", "lng" => "-77.028095" }, result.location)
23
+ end
24
+
25
+ def test_no_results
26
+ results = Geocoder.search("no results")
27
+ assert_equal 0, results.length
28
+ end
29
+
30
+ def test_geocodio_reverse_url
31
+ query = Geocoder::Query.new([45.423733, -75.676333])
32
+ assert_match /reverse/, query.url
33
+ end
34
+
35
+ def test_raises_invalid_request_exception
36
+ Geocoder.configure Geocoder.configure(:always_raise => [Geocoder::InvalidRequest])
37
+ assert_raises Geocoder::InvalidRequest do
38
+ Geocoder.search("invalid")
39
+ end
40
+ end
41
+
42
+ def test_raises_api_key_exception
43
+ Geocoder.configure Geocoder.configure(:always_raise => [Geocoder::InvalidApiKey])
44
+ assert_raises Geocoder::InvalidApiKey do
45
+ Geocoder.search("bad api key")
46
+ end
47
+ end
48
+
49
+ def test_raises_over_limit_exception
50
+ Geocoder.configure Geocoder.configure(:always_raise => [Geocoder::OverQueryLimitError])
51
+ assert_raises Geocoder::OverQueryLimitError do
52
+ Geocoder.search("over query limit")
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,122 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class GooglePlacesDetailsTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(lookup: :google_places_details)
9
+ set_api_key!(:google_places_details)
10
+ end
11
+
12
+ def test_google_places_details_result_components
13
+ assert_equal "Manhattan", madison_square_garden.address_components_of_type(:sublocality).first["long_name"]
14
+ end
15
+
16
+ def test_google_places_details_result_components_contains_route
17
+ assert_equal "Pennsylvania Plaza", madison_square_garden.address_components_of_type(:route).first["long_name"]
18
+ end
19
+
20
+ def test_google_places_details_result_components_contains_street_number
21
+ assert_equal "4", madison_square_garden.address_components_of_type(:street_number).first["long_name"]
22
+ end
23
+
24
+ def test_google_places_details_street_address_returns_formatted_street_address
25
+ assert_equal "4 Pennsylvania Plaza", madison_square_garden.street_address
26
+ end
27
+
28
+ def test_google_places_details_result_contains_place_id
29
+ assert_equal "ChIJhRwB-yFawokR5Phil-QQ3zM", madison_square_garden.place_id
30
+ end
31
+
32
+ def test_google_places_details_result_contains_latitude
33
+ assert_equal madison_square_garden.latitude, 40.750504
34
+ end
35
+
36
+ def test_google_places_details_result_contains_longitude
37
+ assert_equal madison_square_garden.longitude, -73.993439
38
+ end
39
+
40
+ def test_google_places_details_result_contains_rating
41
+ assert_equal 4.4, madison_square_garden.rating
42
+ end
43
+
44
+ def test_google_places_details_result_contains_rating_count
45
+ assert_equal 382, madison_square_garden.rating_count
46
+ end
47
+
48
+ def test_google_places_details_result_contains_reviews
49
+ reviews = madison_square_garden.reviews
50
+
51
+ assert_equal 2, reviews.size
52
+ assert_equal "John Smith", reviews.first["author_name"]
53
+ assert_equal 5, reviews.first["rating"]
54
+ assert_equal "It's nice.", reviews.first["text"]
55
+ assert_equal "en", reviews.first["language"]
56
+ end
57
+
58
+ def test_google_places_details_result_contains_types
59
+ assert_equal madison_square_garden.types, %w(stadium establishment)
60
+ end
61
+
62
+ def test_google_places_details_result_contains_website
63
+ assert_equal madison_square_garden.website, "http://www.thegarden.com/"
64
+ end
65
+
66
+ def test_google_places_details_result_contains_phone_number
67
+ assert_equal madison_square_garden.phone_number, "+1 212-465-6741"
68
+ end
69
+
70
+ def test_google_places_details_query_url_contains_placeid
71
+ url = lookup.query_url(Geocoder::Query.new("some-place-id"))
72
+ assert_match(/placeid=some-place-id/, url)
73
+ end
74
+
75
+ def test_google_places_details_query_url_contains_language
76
+ url = lookup.query_url(Geocoder::Query.new("some-place-id", language: "de"))
77
+ assert_match(/language=de/, url)
78
+ end
79
+
80
+ def test_google_places_details_query_url_always_uses_https
81
+ url = lookup.query_url(Geocoder::Query.new("some-place-id"))
82
+ assert_match(%r(^https://), url)
83
+ end
84
+
85
+ def test_google_places_details_result_with_no_reviews_shows_empty_reviews
86
+ assert_equal no_reviews_result.reviews, []
87
+ end
88
+
89
+ def test_google_places_details_result_with_no_types_shows_empty_types
90
+ assert_equal no_types_result.types, []
91
+ end
92
+
93
+ def test_google_places_details_result_with_invalid_place_id_empty
94
+ assert_equal Geocoder.search("invalid request"), []
95
+ end
96
+
97
+ def test_raises_exception_on_google_places_details_invalid_request
98
+ Geocoder.configure(always_raise: [Geocoder::InvalidRequest])
99
+ assert_raises Geocoder::InvalidRequest do
100
+ Geocoder.search("invalid request")
101
+ end
102
+ end
103
+
104
+ private
105
+
106
+ def lookup
107
+ Geocoder::Lookup::GooglePlacesDetails.new
108
+ end
109
+
110
+ def madison_square_garden
111
+ Geocoder.search("ChIJhRwB-yFawokR5Phil-QQ3zM").first
112
+ end
113
+
114
+ def no_reviews_result
115
+ Geocoder.search("no reviews").first
116
+ end
117
+
118
+ def no_types_result
119
+ Geocoder.search("no types").first
120
+ end
121
+
122
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class GooglePremierTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(lookup: :google_premier)
9
+ set_api_key!(:google_premier)
10
+ end
11
+
12
+ def test_result_components
13
+ result = Geocoder.search("Madison Square Garden, New York, NY").first
14
+ assert_equal "Manhattan", result.address_components_of_type(:sublocality).first['long_name']
15
+ end
16
+
17
+ def test_query_url
18
+ Geocoder.configure(google_premier: {api_key: ["deadbeef", "gme-test", "test-dev"]})
19
+ query = Geocoder::Query.new("Madison Square Garden, New York, NY")
20
+ 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=", query.url
21
+ end
22
+ end
@@ -0,0 +1,84 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class GoogleTest < GeocoderTestCase
6
+
7
+ def test_google_result_components
8
+ result = Geocoder.search("Madison Square Garden, New York, NY").first
9
+ assert_equal "Manhattan",
10
+ result.address_components_of_type(:sublocality).first['long_name']
11
+ end
12
+
13
+ def test_google_result_components_contains_route
14
+ result = Geocoder.search("Madison Square Garden, New York, NY").first
15
+ assert_equal "Penn Plaza",
16
+ result.address_components_of_type(:route).first['long_name']
17
+ end
18
+
19
+ def test_google_result_components_contains_street_number
20
+ result = Geocoder.search("Madison Square Garden, New York, NY").first
21
+ assert_equal "4",
22
+ result.address_components_of_type(:street_number).first['long_name']
23
+ end
24
+
25
+ def test_google_returns_city_when_no_locality_in_result
26
+ result = Geocoder.search("no locality").first
27
+ assert_equal "Haram", result.city
28
+ end
29
+
30
+ def test_google_city_results_returns_nil_if_no_matching_component_types
31
+ result = Geocoder.search("no city data").first
32
+ assert_equal nil, result.city
33
+ end
34
+
35
+ def test_google_street_address_returns_formatted_street_address
36
+ result = Geocoder.search("Madison Square Garden, New York, NY").first
37
+ assert_equal "4 Penn Plaza", result.street_address
38
+ end
39
+
40
+ def test_google_precision
41
+ result = Geocoder.search("Madison Square Garden, New York, NY").first
42
+ assert_equal "ROOFTOP",
43
+ result.precision
44
+ end
45
+
46
+ def test_google_query_url_contains_bounds
47
+ lookup = Geocoder::Lookup::Google.new
48
+ url = lookup.query_url(Geocoder::Query.new(
49
+ "Some Intersection",
50
+ :bounds => [[40.0, -120.0], [39.0, -121.0]]
51
+ ))
52
+ assert_match(/bounds=40.0+%2C-120.0+%7C39.0+%2C-121.0+/, url)
53
+ end
54
+
55
+ def test_google_query_url_contains_region
56
+ lookup = Geocoder::Lookup::Google.new
57
+ url = lookup.query_url(Geocoder::Query.new(
58
+ "Some Intersection",
59
+ :region => "gb"
60
+ ))
61
+ assert_match(/region=gb/, url)
62
+ end
63
+
64
+ def test_google_query_url_contains_components_when_given_as_string
65
+ lookup = Geocoder::Lookup::Google.new
66
+ url = lookup.query_url(Geocoder::Query.new(
67
+ "Some Intersection",
68
+ :components => "locality:ES"
69
+ ))
70
+ formatted = "components=" + CGI.escape("locality:ES")
71
+ assert url.include?(formatted), "Expected #{formatted} to be included in #{url}"
72
+ end
73
+
74
+ def test_google_query_url_contains_components_when_given_as_array
75
+ lookup = Geocoder::Lookup::Google.new
76
+ url = lookup.query_url(Geocoder::Query.new(
77
+ "Some Intersection",
78
+ :components => ["country:ES", "locality:ES"]
79
+ ))
80
+ formatted = "components=" + CGI.escape("country:ES|locality:ES")
81
+ assert url.include?(formatted), "Expected #{formatted} to be included in #{url}"
82
+ end
83
+
84
+ end
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class MapquestTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(lookup: :mapquest)
9
+ set_api_key!(:mapquest)
10
+ end
11
+
12
+ def test_url_contains_api_key
13
+ Geocoder.configure(mapquest: {api_key: "abc123"})
14
+ query = Geocoder::Query.new("Bluffton, SC")
15
+ assert_equal "http://www.mapquestapi.com/geocoding/v1/address?key=abc123&location=Bluffton%2C+SC", query.url
16
+ end
17
+
18
+ def test_url_for_version_2
19
+ Geocoder.configure(mapquest: {api_key: "abc123", version: 2})
20
+ query = Geocoder::Query.new("Bluffton, SC")
21
+ assert_equal "http://www.mapquestapi.com/geocoding/v2/address?key=abc123&location=Bluffton%2C+SC", query.url
22
+ end
23
+
24
+ def test_url_for_open_street_maps
25
+ Geocoder.configure(mapquest: {api_key: "abc123", open: true})
26
+ query = Geocoder::Query.new("Bluffton, SC")
27
+ assert_equal "http://open.mapquestapi.com/geocoding/v1/address?key=abc123&location=Bluffton%2C+SC", query.url
28
+ end
29
+
30
+ def test_result_components
31
+ result = Geocoder.search("Madison Square Garden, New York, NY").first
32
+ assert_equal "10001", result.postal_code
33
+ assert_equal "46 West 31st Street, New York, NY, 10001, US", result.address
34
+ end
35
+
36
+ def test_no_results
37
+ assert_equal [], Geocoder.search("no results")
38
+ end
39
+
40
+ def test_raises_exception_when_invalid_request
41
+ Geocoder.configure(always_raise: [Geocoder::InvalidRequest])
42
+ assert_raises Geocoder::InvalidRequest do
43
+ Geocoder.search("invalid request")
44
+ end
45
+ end
46
+
47
+ def test_raises_exception_when_invalid_api_key
48
+ Geocoder.configure(always_raise: [Geocoder::InvalidApiKey])
49
+ assert_raises Geocoder::InvalidApiKey do
50
+ Geocoder.search("invalid api key")
51
+ end
52
+ end
53
+
54
+ def test_raises_exception_when_error
55
+ Geocoder.configure(always_raise: [Geocoder::Error])
56
+ assert_raises Geocoder::Error do
57
+ Geocoder.search("error")
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class MaxmindLocalTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(ip_lookup: :maxmind_local)
9
+ end
10
+
11
+ def test_result_attributes
12
+ result = Geocoder.search('8.8.8.8').first
13
+ assert_equal 'Mountain View, CA 94043, United States', result.address
14
+ assert_equal 'Mountain View', result.city
15
+ assert_equal 'CA', result.state
16
+ assert_equal 'United States', result.country
17
+ assert_equal 'US', result.country_code
18
+ assert_equal '94043', result.postal_code
19
+ assert_equal 37.41919999999999, result.latitude
20
+ assert_equal -122.0574, result.longitude
21
+ assert_equal [37.41919999999999, -122.0574], result.coordinates
22
+ end
23
+
24
+ def test_loopback
25
+ results = Geocoder.search('127.0.0.1')
26
+ assert_equal [], results
27
+ end
28
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class MaxmindTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(ip_lookup: :maxmind)
9
+ end
10
+
11
+ def test_maxmind_result_on_ip_address_search
12
+ Geocoder.configure(maxmind: {service: :city_isp_org})
13
+ result = Geocoder.search("74.200.247.59").first
14
+ assert result.is_a?(Geocoder::Result::Maxmind)
15
+ end
16
+
17
+ def test_maxmind_result_knows_country_service_name
18
+ Geocoder.configure(maxmind: {service: :country})
19
+ assert_equal :country, Geocoder.search("24.24.24.21").first.service_name
20
+ end
21
+
22
+ def test_maxmind_result_knows_city_service_name
23
+ Geocoder.configure(maxmind: {service: :city})
24
+ assert_equal :city, Geocoder.search("24.24.24.22").first.service_name
25
+ end
26
+
27
+ def test_maxmind_result_knows_city_isp_org_service_name
28
+ Geocoder.configure(maxmind: {service: :city_isp_org})
29
+ assert_equal :city_isp_org, Geocoder.search("24.24.24.23").first.service_name
30
+ end
31
+
32
+ def test_maxmind_result_knows_omni_service_name
33
+ Geocoder.configure(maxmind: {service: :omni})
34
+ assert_equal :omni, Geocoder.search("24.24.24.24").first.service_name
35
+ end
36
+
37
+ def test_maxmind_special_result_components
38
+ Geocoder.configure(maxmind: {service: :omni})
39
+ result = Geocoder.search("24.24.24.24").first
40
+ assert_equal "Road Runner", result.isp_name
41
+ assert_equal "Cable/DSL", result.netspeed
42
+ assert_equal "rr.com", result.domain
43
+ end
44
+
45
+ def test_maxmind_raises_exception_when_service_not_configured
46
+ Geocoder.configure(maxmind: {service: nil})
47
+ assert_raises Geocoder::ConfigurationError do
48
+ Geocoder::Query.new("24.24.24.24").url
49
+ end
50
+ end
51
+
52
+ def test_maxmind_works_when_loopback_address_on_omni
53
+ Geocoder.configure(maxmind: {service: :omni})
54
+ result = Geocoder.search("127.0.0.1").first
55
+ assert_equal "", result.country_code
56
+ end
57
+
58
+ def test_maxmind_works_when_loopback_address_on_country
59
+ Geocoder.configure(maxmind: {service: :country})
60
+ result = Geocoder.search("127.0.0.1").first
61
+ assert_equal "", result.country_code
62
+ end
63
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class NominatimTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(lookup: :nominatim)
9
+ set_api_key!(:nominatim)
10
+ end
11
+
12
+ def test_result_components
13
+ result = Geocoder.search("Madison Square Garden, New York, NY").first
14
+ assert_equal "10001", result.postal_code
15
+ assert_equal "Madison Square Garden, West 31st Street, Long Island City, New York City, New York, 10001, United States of America", result.address
16
+ end
17
+
18
+ def test_host_configuration
19
+ Geocoder.configure(nominatim: {host: "local.com"})
20
+ query = Geocoder::Query.new("Bluffton, SC")
21
+ assert_match %r(http://local\.com), query.url
22
+ end
23
+
24
+ def test_raises_exception_when_over_query_limit
25
+ Geocoder.configure(:always_raise => [Geocoder::OverQueryLimitError])
26
+ l = Geocoder::Lookup.get(:nominatim)
27
+ assert_raises Geocoder::OverQueryLimitError do
28
+ l.send(:results, Geocoder::Query.new("over limit"))
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class OkfTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(lookup: :okf)
9
+ end
10
+
11
+ def test_okf_result_components
12
+ result = Geocoder.search("Kirstinmäki 11b28").first
13
+ assert_equal "Espoo",
14
+ result.address_components_of_type(:administrative_area_level_3).first['long_name']
15
+ end
16
+
17
+ def test_okf_result_components_contains_route
18
+ result = Geocoder.search("Kirstinmäki 11b28").first
19
+ assert_equal "Kirstinmäki",
20
+ result.address_components_of_type(:route).first['long_name']
21
+ end
22
+
23
+ def test_okf_result_components_contains_street_number
24
+ result = Geocoder.search("Kirstinmäki 11b28").first
25
+ assert_equal "1",
26
+ result.address_components_of_type(:street_number).first['long_name']
27
+ end
28
+
29
+ def test_okf_street_address_returns_formatted_street_address
30
+ result = Geocoder.search("Kirstinmäki 11b28").first
31
+ assert_equal "Kirstinmäki 1", result.street_address
32
+ end
33
+
34
+ def test_okf_precision
35
+ result = Geocoder.search("Kirstinmäki 11b28").first
36
+ assert_equal "RANGE_INTERPOLATED", result.precision
37
+ end
38
+ end