geocoder-kb 1.2.6

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 (248) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.travis.yml +31 -0
  4. data/CHANGELOG.md +384 -0
  5. data/LICENSE +20 -0
  6. data/README.md +1085 -0
  7. data/Rakefile +25 -0
  8. data/bin/geocode +5 -0
  9. data/examples/autoexpire_cache_dalli.rb +62 -0
  10. data/examples/autoexpire_cache_redis.rb +28 -0
  11. data/examples/cache_bypass.rb +48 -0
  12. data/examples/sidekiq_worker.rb +16 -0
  13. data/gemfiles/Gemfile.mongoid-2.4.x +16 -0
  14. data/lib/generators/geocoder/config/config_generator.rb +14 -0
  15. data/lib/generators/geocoder/config/templates/initializer.rb +21 -0
  16. data/lib/generators/geocoder/maxmind/geolite_city_generator.rb +28 -0
  17. data/lib/generators/geocoder/maxmind/geolite_country_generator.rb +28 -0
  18. data/lib/generators/geocoder/maxmind/templates/migration/geolite_city.rb +30 -0
  19. data/lib/generators/geocoder/maxmind/templates/migration/geolite_country.rb +17 -0
  20. data/lib/geocoder.rb +47 -0
  21. data/lib/geocoder/cache.rb +90 -0
  22. data/lib/geocoder/calculations.rb +428 -0
  23. data/lib/geocoder/cli.rb +121 -0
  24. data/lib/geocoder/configuration.rb +124 -0
  25. data/lib/geocoder/configuration_hash.rb +11 -0
  26. data/lib/geocoder/exceptions.rb +21 -0
  27. data/lib/geocoder/ip_address.rb +21 -0
  28. data/lib/geocoder/lookup.rb +102 -0
  29. data/lib/geocoder/lookups/amap.rb +55 -0
  30. data/lib/geocoder/lookups/baidu.rb +55 -0
  31. data/lib/geocoder/lookups/baidu_ip.rb +54 -0
  32. data/lib/geocoder/lookups/base.rb +302 -0
  33. data/lib/geocoder/lookups/bing.rb +59 -0
  34. data/lib/geocoder/lookups/dstk.rb +20 -0
  35. data/lib/geocoder/lookups/esri.rb +48 -0
  36. data/lib/geocoder/lookups/freegeoip.rb +47 -0
  37. data/lib/geocoder/lookups/geocoder_ca.rb +54 -0
  38. data/lib/geocoder/lookups/geocoder_us.rb +39 -0
  39. data/lib/geocoder/lookups/geocodio.rb +42 -0
  40. data/lib/geocoder/lookups/geoip2.rb +40 -0
  41. data/lib/geocoder/lookups/google.rb +67 -0
  42. data/lib/geocoder/lookups/google_places_details.rb +50 -0
  43. data/lib/geocoder/lookups/google_premier.rb +47 -0
  44. data/lib/geocoder/lookups/here.rb +62 -0
  45. data/lib/geocoder/lookups/mapquest.rb +60 -0
  46. data/lib/geocoder/lookups/maxmind.rb +90 -0
  47. data/lib/geocoder/lookups/maxmind_local.rb +58 -0
  48. data/lib/geocoder/lookups/nominatim.rb +52 -0
  49. data/lib/geocoder/lookups/okf.rb +43 -0
  50. data/lib/geocoder/lookups/opencagedata.rb +58 -0
  51. data/lib/geocoder/lookups/ovi.rb +62 -0
  52. data/lib/geocoder/lookups/pointpin.rb +68 -0
  53. data/lib/geocoder/lookups/postcode_anywhere_uk.rb +51 -0
  54. data/lib/geocoder/lookups/smarty_streets.rb +45 -0
  55. data/lib/geocoder/lookups/telize.rb +40 -0
  56. data/lib/geocoder/lookups/test.rb +44 -0
  57. data/lib/geocoder/lookups/yahoo.rb +88 -0
  58. data/lib/geocoder/lookups/yandex.rb +54 -0
  59. data/lib/geocoder/models/active_record.rb +50 -0
  60. data/lib/geocoder/models/base.rb +39 -0
  61. data/lib/geocoder/models/mongo_base.rb +64 -0
  62. data/lib/geocoder/models/mongo_mapper.rb +26 -0
  63. data/lib/geocoder/models/mongoid.rb +32 -0
  64. data/lib/geocoder/query.rb +111 -0
  65. data/lib/geocoder/railtie.rb +26 -0
  66. data/lib/geocoder/request.rb +25 -0
  67. data/lib/geocoder/results/amap.rb +85 -0
  68. data/lib/geocoder/results/baidu.rb +79 -0
  69. data/lib/geocoder/results/baidu_ip.rb +62 -0
  70. data/lib/geocoder/results/base.rb +67 -0
  71. data/lib/geocoder/results/bing.rb +48 -0
  72. data/lib/geocoder/results/dstk.rb +6 -0
  73. data/lib/geocoder/results/esri.rb +51 -0
  74. data/lib/geocoder/results/freegeoip.rb +45 -0
  75. data/lib/geocoder/results/geocoder_ca.rb +60 -0
  76. data/lib/geocoder/results/geocoder_us.rb +39 -0
  77. data/lib/geocoder/results/geocodio.rb +66 -0
  78. data/lib/geocoder/results/geoip2.rb +64 -0
  79. data/lib/geocoder/results/google.rb +124 -0
  80. data/lib/geocoder/results/google_places_details.rb +35 -0
  81. data/lib/geocoder/results/google_premier.rb +6 -0
  82. data/lib/geocoder/results/here.rb +62 -0
  83. data/lib/geocoder/results/mapquest.rb +51 -0
  84. data/lib/geocoder/results/maxmind.rb +135 -0
  85. data/lib/geocoder/results/maxmind_local.rb +49 -0
  86. data/lib/geocoder/results/nominatim.rb +94 -0
  87. data/lib/geocoder/results/okf.rb +106 -0
  88. data/lib/geocoder/results/opencagedata.rb +82 -0
  89. data/lib/geocoder/results/ovi.rb +62 -0
  90. data/lib/geocoder/results/pointpin.rb +44 -0
  91. data/lib/geocoder/results/postcode_anywhere_uk.rb +42 -0
  92. data/lib/geocoder/results/smarty_streets.rb +106 -0
  93. data/lib/geocoder/results/telize.rb +45 -0
  94. data/lib/geocoder/results/test.rb +33 -0
  95. data/lib/geocoder/results/yahoo.rb +55 -0
  96. data/lib/geocoder/results/yandex.rb +84 -0
  97. data/lib/geocoder/sql.rb +107 -0
  98. data/lib/geocoder/stores/active_record.rb +289 -0
  99. data/lib/geocoder/stores/base.rb +127 -0
  100. data/lib/geocoder/stores/mongo_base.rb +89 -0
  101. data/lib/geocoder/stores/mongo_mapper.rb +13 -0
  102. data/lib/geocoder/stores/mongoid.rb +13 -0
  103. data/lib/geocoder/version.rb +3 -0
  104. data/lib/hash_recursive_merge.rb +74 -0
  105. data/lib/maxmind_database.rb +109 -0
  106. data/lib/oauth_util.rb +112 -0
  107. data/lib/tasks/geocoder.rake +29 -0
  108. data/lib/tasks/maxmind.rake +73 -0
  109. data/test/fixtures/baidu_invalid_key +1 -0
  110. data/test/fixtures/baidu_ip_202_198_16_3 +19 -0
  111. data/test/fixtures/baidu_ip_invalid_key +1 -0
  112. data/test/fixtures/baidu_ip_no_results +1 -0
  113. data/test/fixtures/baidu_no_results +1 -0
  114. data/test/fixtures/baidu_reverse +1 -0
  115. data/test/fixtures/baidu_shanghai_pearl_tower +12 -0
  116. data/test/fixtures/bing_invalid_key +1 -0
  117. data/test/fixtures/bing_madison_square_garden +40 -0
  118. data/test/fixtures/bing_no_results +16 -0
  119. data/test/fixtures/bing_reverse +42 -0
  120. data/test/fixtures/cloudmade_invalid_key +1 -0
  121. data/test/fixtures/cloudmade_madison_square_garden +1 -0
  122. data/test/fixtures/cloudmade_no_results +1 -0
  123. data/test/fixtures/esri_madison_square_garden +59 -0
  124. data/test/fixtures/esri_no_results +8 -0
  125. data/test/fixtures/esri_reverse +21 -0
  126. data/test/fixtures/freegeoip_74_200_247_59 +12 -0
  127. data/test/fixtures/freegeoip_no_results +1 -0
  128. data/test/fixtures/geocoder_ca_madison_square_garden +1 -0
  129. data/test/fixtures/geocoder_ca_no_results +1 -0
  130. data/test/fixtures/geocoder_ca_reverse +34 -0
  131. data/test/fixtures/geocoder_us_madison_square_garden +1 -0
  132. data/test/fixtures/geocoder_us_no_results +1 -0
  133. data/test/fixtures/geocodio_1101_pennsylvania_ave +1 -0
  134. data/test/fixtures/geocodio_bad_api_key +3 -0
  135. data/test/fixtures/geocodio_invalid +4 -0
  136. data/test/fixtures/geocodio_no_results +1 -0
  137. data/test/fixtures/geocodio_over_query_limit +4 -0
  138. data/test/fixtures/google_garbage +456 -0
  139. data/test/fixtures/google_madison_square_garden +57 -0
  140. data/test/fixtures/google_no_city_data +44 -0
  141. data/test/fixtures/google_no_locality +51 -0
  142. data/test/fixtures/google_no_results +4 -0
  143. data/test/fixtures/google_over_limit +4 -0
  144. data/test/fixtures/google_places_details_invalid_request +4 -0
  145. data/test/fixtures/google_places_details_madison_square_garden +120 -0
  146. data/test/fixtures/google_places_details_no_results +4 -0
  147. data/test/fixtures/google_places_details_no_reviews +60 -0
  148. data/test/fixtures/google_places_details_no_types +66 -0
  149. data/test/fixtures/here_madison_square_garden +72 -0
  150. data/test/fixtures/here_no_results +8 -0
  151. data/test/fixtures/mapquest_error +16 -0
  152. data/test/fixtures/mapquest_invalid_api_key +16 -0
  153. data/test/fixtures/mapquest_invalid_request +16 -0
  154. data/test/fixtures/mapquest_madison_square_garden +52 -0
  155. data/test/fixtures/mapquest_no_results +16 -0
  156. data/test/fixtures/maxmind_24_24_24_21 +1 -0
  157. data/test/fixtures/maxmind_24_24_24_22 +1 -0
  158. data/test/fixtures/maxmind_24_24_24_23 +1 -0
  159. data/test/fixtures/maxmind_24_24_24_24 +1 -0
  160. data/test/fixtures/maxmind_74_200_247_59 +1 -0
  161. data/test/fixtures/maxmind_invalid_key +1 -0
  162. data/test/fixtures/maxmind_no_results +1 -0
  163. data/test/fixtures/nominatim_madison_square_garden +150 -0
  164. data/test/fixtures/nominatim_no_results +1 -0
  165. data/test/fixtures/nominatim_over_limit +1 -0
  166. data/test/fixtures/okf_kirstinmaki +67 -0
  167. data/test/fixtures/okf_no_results +4 -0
  168. data/test/fixtures/opencagedata_invalid_api_key +25 -0
  169. data/test/fixtures/opencagedata_invalid_request +26 -0
  170. data/test/fixtures/opencagedata_madison_square_garden +73 -0
  171. data/test/fixtures/opencagedata_no_results +29 -0
  172. data/test/fixtures/opencagedata_over_limit +31 -0
  173. data/test/fixtures/ovi_madison_square_garden +72 -0
  174. data/test/fixtures/ovi_no_results +8 -0
  175. data/test/fixtures/pointpin_10_10_10_10 +1 -0
  176. data/test/fixtures/pointpin_555_555_555_555 +1 -0
  177. data/test/fixtures/pointpin_80_111_555_555 +1 -0
  178. data/test/fixtures/pointpin_no_results +1 -0
  179. data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_WR26NJ +1 -0
  180. data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_generic_error +1 -0
  181. data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_hampshire +1 -0
  182. data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_key_limit_exceeded +1 -0
  183. data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_no_results +1 -0
  184. data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_romsey +1 -0
  185. data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_unknown_key +1 -0
  186. data/test/fixtures/smarty_streets_11211 +1 -0
  187. data/test/fixtures/smarty_streets_madison_square_garden +47 -0
  188. data/test/fixtures/smarty_streets_no_results +1 -0
  189. data/test/fixtures/telize_10_10_10_10 +1 -0
  190. data/test/fixtures/telize_555_555_555_555 +4 -0
  191. data/test/fixtures/telize_74_200_247_59 +1 -0
  192. data/test/fixtures/telize_no_results +1 -0
  193. data/test/fixtures/yahoo_error +1 -0
  194. data/test/fixtures/yahoo_invalid_key +2 -0
  195. data/test/fixtures/yahoo_madison_square_garden +52 -0
  196. data/test/fixtures/yahoo_no_results +10 -0
  197. data/test/fixtures/yahoo_over_limit +2 -0
  198. data/test/fixtures/yandex_canada_rue_dupuis_14 +446 -0
  199. data/test/fixtures/yandex_invalid_key +1 -0
  200. data/test/fixtures/yandex_kremlin +48 -0
  201. data/test/fixtures/yandex_new_york +1 -0
  202. data/test/fixtures/yandex_no_city_and_town +112 -0
  203. data/test/fixtures/yandex_no_results +16 -0
  204. data/test/integration/http_client_test.rb +31 -0
  205. data/test/mongoid_test_helper.rb +43 -0
  206. data/test/test_helper.rb +416 -0
  207. data/test/unit/active_record_test.rb +16 -0
  208. data/test/unit/cache_test.rb +37 -0
  209. data/test/unit/calculations_test.rb +220 -0
  210. data/test/unit/configuration_test.rb +55 -0
  211. data/test/unit/error_handling_test.rb +56 -0
  212. data/test/unit/geocoder_test.rb +78 -0
  213. data/test/unit/https_test.rb +17 -0
  214. data/test/unit/ip_address_test.rb +27 -0
  215. data/test/unit/lookup_test.rb +153 -0
  216. data/test/unit/lookups/bing_test.rb +68 -0
  217. data/test/unit/lookups/dstk_test.rb +26 -0
  218. data/test/unit/lookups/esri_test.rb +48 -0
  219. data/test/unit/lookups/freegeoip_test.rb +27 -0
  220. data/test/unit/lookups/geocoder_ca_test.rb +17 -0
  221. data/test/unit/lookups/geocodio_test.rb +55 -0
  222. data/test/unit/lookups/geoip2_test.rb +27 -0
  223. data/test/unit/lookups/google_places_details_test.rb +122 -0
  224. data/test/unit/lookups/google_premier_test.rb +22 -0
  225. data/test/unit/lookups/google_test.rb +84 -0
  226. data/test/unit/lookups/mapquest_test.rb +60 -0
  227. data/test/unit/lookups/maxmind_local_test.rb +28 -0
  228. data/test/unit/lookups/maxmind_test.rb +63 -0
  229. data/test/unit/lookups/nominatim_test.rb +31 -0
  230. data/test/unit/lookups/okf_test.rb +38 -0
  231. data/test/unit/lookups/opencagedata_test.rb +64 -0
  232. data/test/unit/lookups/pointpin_test.rb +30 -0
  233. data/test/unit/lookups/postcode_anywhere_uk_test.rb +70 -0
  234. data/test/unit/lookups/smarty_streets_test.rb +71 -0
  235. data/test/unit/lookups/telize_test.rb +36 -0
  236. data/test/unit/lookups/yahoo_test.rb +35 -0
  237. data/test/unit/method_aliases_test.rb +26 -0
  238. data/test/unit/model_test.rb +38 -0
  239. data/test/unit/mongoid_test.rb +47 -0
  240. data/test/unit/near_test.rb +87 -0
  241. data/test/unit/oauth_util_test.rb +31 -0
  242. data/test/unit/proxy_test.rb +37 -0
  243. data/test/unit/query_test.rb +52 -0
  244. data/test/unit/rake_task_test.rb +21 -0
  245. data/test/unit/request_test.rb +35 -0
  246. data/test/unit/result_test.rb +72 -0
  247. data/test/unit/test_mode_test.rb +70 -0
  248. metadata +294 -0
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..")
3
+ require 'test_helper'
4
+
5
+ class HttpsTest < GeocoderTestCase
6
+
7
+ def test_uses_https_for_secure_query
8
+ Geocoder.configure(:use_https => true)
9
+ g = Geocoder::Lookup::Google.new
10
+ assert_match(/^https:/, g.query_url(Geocoder::Query.new("test")))
11
+ end
12
+
13
+ def test_uses_http_by_default
14
+ g = Geocoder::Lookup::Google.new
15
+ assert_match(/^http:/, g.query_url(Geocoder::Query.new("test")))
16
+ end
17
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..")
3
+ require 'test_helper'
4
+
5
+ class IpAddressTest < GeocoderTestCase
6
+
7
+ def test_valid
8
+ assert Geocoder::IpAddress.new("232.65.123.94").valid?
9
+ assert Geocoder::IpAddress.new("666.65.123.94").valid? # technically invalid
10
+ assert Geocoder::IpAddress.new("::ffff:12.34.56.78").valid?
11
+ assert Geocoder::IpAddress.new("3ffe:0b00:0000:0000:0001:0000:0000:000a").valid?
12
+ assert Geocoder::IpAddress.new("::1").valid?
13
+ assert !Geocoder::IpAddress.new("232.65.123.94.43").valid?
14
+ assert !Geocoder::IpAddress.new("232.65.123").valid?
15
+ assert !Geocoder::IpAddress.new("::ffff:123.456.789").valid?
16
+ assert !Geocoder::IpAddress.new("Test\n232.65.123.94").valid?
17
+ end
18
+
19
+ def test_loopback
20
+ assert Geocoder::IpAddress.new("0.0.0.0").loopback?
21
+ assert Geocoder::IpAddress.new("127.0.0.1").loopback?
22
+ assert Geocoder::IpAddress.new("::1").loopback?
23
+ assert !Geocoder::IpAddress.new("232.65.123.234").loopback?
24
+ assert !Geocoder::IpAddress.new("127 Main St.").loopback?
25
+ assert !Geocoder::IpAddress.new("John Doe\n127 Main St.\nAnywhere, USA").loopback?
26
+ end
27
+ end
@@ -0,0 +1,153 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..")
3
+ require 'test_helper'
4
+
5
+ class LookupTest < GeocoderTestCase
6
+
7
+ def test_responds_to_name_method
8
+ Geocoder::Lookup.all_services.each do |l|
9
+ lookup = Geocoder::Lookup.get(l)
10
+ assert lookup.respond_to?(:name),
11
+ "Lookup #{l} does not respond to #name method."
12
+ end
13
+ end
14
+
15
+ def test_search_returns_empty_array_when_no_results
16
+ Geocoder::Lookup.all_services_except_test.each do |l|
17
+ lookup = Geocoder::Lookup.get(l)
18
+ set_api_key!(l)
19
+ assert_equal [], lookup.send(:results, Geocoder::Query.new("no results")),
20
+ "Lookup #{l} does not return empty array when no results."
21
+ end
22
+ end
23
+
24
+ def test_query_url_contains_values_in_params_hash
25
+ Geocoder::Lookup.all_services_except_test.each do |l|
26
+ next if [:freegeoip, :maxmind_local, :telize, :pointpin, :geoip2].include? l # does not use query string
27
+ set_api_key!(l)
28
+ url = Geocoder::Lookup.get(l).query_url(Geocoder::Query.new(
29
+ "test", :params => {:one_in_the_hand => "two in the bush"}
30
+ ))
31
+ # should be "+"s for all lookups except Yahoo
32
+ assert_match(/one_in_the_hand=two(%20|\+)in(%20|\+)the(%20|\+)bush/, url,
33
+ "Lookup #{l} does not appear to support arbitrary params in URL")
34
+ end
35
+ end
36
+
37
+ {
38
+ :esri => :l,
39
+ :bing => :key,
40
+ :geocoder_ca => :auth,
41
+ :google => :language,
42
+ :google_premier => :language,
43
+ :mapquest => :key,
44
+ :maxmind => :l,
45
+ :nominatim => :"accept-language",
46
+ :yahoo => :locale,
47
+ :yandex => :plng
48
+ }.each do |l,p|
49
+ define_method "test_passing_param_to_#{l}_query_overrides_configuration_value" do
50
+ set_api_key!(l)
51
+ url = Geocoder::Lookup.get(l).query_url(Geocoder::Query.new(
52
+ "test", :params => {p => "xxxx"}
53
+ ))
54
+ assert_match(/#{p}=xxxx/, url,
55
+ "Param passed to #{l} lookup does not override configuration value")
56
+ end
57
+ end
58
+
59
+ {
60
+ :google => :language,
61
+ :google_premier => :language,
62
+ :nominatim => :"accept-language",
63
+ :yahoo => :locale,
64
+ :yandex => :plng
65
+ }.each do |l,p|
66
+ define_method "test_passing_language_to_#{l}_query_overrides_configuration_value" do
67
+ set_api_key!(l)
68
+ url = Geocoder::Lookup.get(l).query_url(Geocoder::Query.new(
69
+ "test", :language => 'xxxx'
70
+ ))
71
+ assert_match(/#{p}=xxxx/, url,
72
+ "Param passed to #{l} lookup does not override configuration value")
73
+ end
74
+ end
75
+
76
+ def test_raises_exception_on_invalid_key
77
+ Geocoder.configure(:always_raise => [Geocoder::InvalidApiKey])
78
+ #Geocoder::Lookup.all_services_except_test.each do |l|
79
+ [:bing, :yahoo, :yandex, :maxmind, :baidu, :baidu_ip].each do |l|
80
+ lookup = Geocoder::Lookup.get(l)
81
+ assert_raises Geocoder::InvalidApiKey do
82
+ lookup.send(:results, Geocoder::Query.new("invalid key"))
83
+ end
84
+ end
85
+ end
86
+
87
+ def test_returns_empty_array_on_invalid_key
88
+ silence_warnings do
89
+ #Geocoder::Lookup.all_services_except_test.each do |l|
90
+ [:bing, :yahoo, :yandex, :maxmind, :baidu, :baidu_ip].each do |l|
91
+ Geocoder.configure(:lookup => l)
92
+ set_api_key!(l)
93
+ assert_equal [], Geocoder.search("invalid key")
94
+ end
95
+ end
96
+ end
97
+
98
+ def test_does_not_choke_on_nil_address
99
+ Geocoder::Lookup.all_services.each do |l|
100
+ Geocoder.configure(:lookup => l)
101
+ assert_nothing_raised { Place.new("Place", nil).geocode }
102
+ end
103
+ end
104
+
105
+ def test_hash_to_query
106
+ g = Geocoder::Lookup::Google.new
107
+ assert_equal "a=1&b=2", g.send(:hash_to_query, {:a => 1, :b => 2})
108
+ end
109
+
110
+ def test_baidu_api_key
111
+ Geocoder.configure(:api_key => "MY_KEY")
112
+ g = Geocoder::Lookup::BaiduIp.new
113
+ assert_match "ak=MY_KEY", g.query_url(Geocoder::Query.new("232.65.123.94"))
114
+ end
115
+
116
+ def test_baidu_ip_api_key
117
+ Geocoder.configure(:api_key => "MY_KEY")
118
+ g = Geocoder::Lookup::Baidu.new
119
+ assert_match "ak=MY_KEY", g.query_url(Geocoder::Query.new("Madison Square Garden, New York, NY 10001, United States"))
120
+ end
121
+
122
+ def test_pointpin_api_key
123
+ Geocoder.configure(:api_key => "MY_KEY")
124
+ g = Geocoder::Lookup::Pointpin.new
125
+ assert_match "/MY_KEY/", g.query_url(Geocoder::Query.new("232.65.123.94"))
126
+ end
127
+
128
+ def test_google_api_key
129
+ Geocoder.configure(:api_key => "MY_KEY")
130
+ g = Geocoder::Lookup::Google.new
131
+ assert_match "key=MY_KEY", g.query_url(Geocoder::Query.new("Madison Square Garden, New York, NY 10001, United States"))
132
+ end
133
+
134
+ def test_geocoder_ca_showpostal
135
+ Geocoder.configure(:api_key => "MY_KEY")
136
+ g = Geocoder::Lookup::GeocoderCa.new
137
+ assert_match "showpostal=1", g.query_url(Geocoder::Query.new("Madison Square Garden, New York, NY 10001, United States"))
138
+ end
139
+
140
+ def test_raises_configuration_error_on_missing_key
141
+ [:bing, :baidu].each do |l|
142
+ assert_raises Geocoder::ConfigurationError do
143
+ Geocoder.configure(:lookup => l, :api_key => nil)
144
+ Geocoder.search("Madison Square Garden, New York, NY 10001, United States")
145
+ end
146
+ end
147
+ end
148
+
149
+ def test_handle
150
+ assert_equal :google, Geocoder::Lookup::Google.new.handle
151
+ assert_equal :geocoder_ca, Geocoder::Lookup::GeocoderCa.new.handle
152
+ end
153
+ end
@@ -0,0 +1,68 @@
1
+ # encoding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), "..", "..")
3
+ require 'test_helper'
4
+
5
+ class BingTest < GeocoderTestCase
6
+
7
+ def setup
8
+ Geocoder.configure(lookup: :bing)
9
+ set_api_key!(:bing)
10
+ end
11
+
12
+ def test_query_for_reverse_geocode
13
+ lookup = Geocoder::Lookup::Bing.new
14
+ url = lookup.query_url(Geocoder::Query.new([45.423733, -75.676333]))
15
+ assert_match(/Locations\/45.423733/, url)
16
+ end
17
+
18
+ def test_result_components
19
+ result = Geocoder.search("Madison Square Garden, New York, NY").first
20
+ assert_equal "Madison Square Garden, NY", result.address
21
+ assert_equal "NY", result.state
22
+ assert_equal "New York", result.city
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_query_url_contains_region
31
+ lookup = Geocoder::Lookup::Bing.new
32
+ url = lookup.query_url(Geocoder::Query.new(
33
+ "manchester",
34
+ :region => "uk"
35
+ ))
36
+ assert_match(/Locations\/uk\?q=manchester/, url)
37
+ assert_no_match(/query/, url)
38
+ end
39
+
40
+ def test_query_url_without_region
41
+ lookup = Geocoder::Lookup::Bing.new
42
+ url = lookup.query_url(Geocoder::Query.new(
43
+ "manchester"
44
+ ))
45
+ assert_match(/Locations\?q=manchester/, url)
46
+ assert_no_match(/query/, url)
47
+ end
48
+
49
+ def test_query_url_contains_address_with_spaces
50
+ lookup = Geocoder::Lookup::Bing.new
51
+ url = lookup.query_url(Geocoder::Query.new(
52
+ "manchester, lancashire",
53
+ :region => "uk"
54
+ ))
55
+ assert_match(/Locations\/uk\?q=manchester,%20lancashire/, url)
56
+ assert_no_match(/query/, url)
57
+ end
58
+
59
+ def test_query_url_contains_address_with_trailing_and_leading_spaces
60
+ lookup = Geocoder::Lookup::Bing.new
61
+ url = lookup.query_url(Geocoder::Query.new(
62
+ " manchester, lancashire ",
63
+ :region => "uk"
64
+ ))
65
+ assert_match(/Locations\/uk\?q=manchester,%20lancashire/, url)
66
+ assert_no_match(/query/, url)
67
+ end
68
+ end
@@ -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