geocoder2 0.1.0
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.
- data/.gitignore +5 -0
- data/.travis.yml +27 -0
- data/CHANGELOG.md +329 -0
- data/LICENSE +20 -0
- data/README.md +796 -0
- data/Rakefile +25 -0
- data/bin/geocode2 +5 -0
- data/examples/autoexpire_cache_dalli.rb +62 -0
- data/examples/autoexpire_cache_redis.rb +28 -0
- data/examples/cache_bypass.rb +48 -0
- data/gemfiles/Gemfile.mongoid-2.4.x +15 -0
- data/json?address=26+leonard+street%2C+Belmont&key=AIzaSyDoltU6YL8XeIQrSLFGk6ZfpKaWkPukwYQ&language=en +68 -0
- data/lib/generators/geocoder2/config/config_generator.rb +14 -0
- data/lib/generators/geocoder2/config/templates/initializer.rb +21 -0
- data/lib/geocoder2/cache.rb +89 -0
- data/lib/geocoder2/calculations.rb +389 -0
- data/lib/geocoder2/cli.rb +121 -0
- data/lib/geocoder2/configuration.rb +130 -0
- data/lib/geocoder2/configuration_hash.rb +11 -0
- data/lib/geocoder2/exceptions.rb +21 -0
- data/lib/geocoder2/lookup.rb +86 -0
- data/lib/geocoder2/lookups/baidu.rb +54 -0
- data/lib/geocoder2/lookups/base.rb +266 -0
- data/lib/geocoder2/lookups/bing.rb +47 -0
- data/lib/geocoder2/lookups/dstk.rb +20 -0
- data/lib/geocoder2/lookups/esri.rb +48 -0
- data/lib/geocoder2/lookups/freegeoip.rb +43 -0
- data/lib/geocoder2/lookups/geocoder_ca.rb +54 -0
- data/lib/geocoder2/lookups/geocoder_us.rb +39 -0
- data/lib/geocoder2/lookups/google.rb +69 -0
- data/lib/geocoder2/lookups/google_premier.rb +47 -0
- data/lib/geocoder2/lookups/mapquest.rb +59 -0
- data/lib/geocoder2/lookups/maxmind.rb +88 -0
- data/lib/geocoder2/lookups/nominatim.rb +44 -0
- data/lib/geocoder2/lookups/ovi.rb +62 -0
- data/lib/geocoder2/lookups/test.rb +44 -0
- data/lib/geocoder2/lookups/yahoo.rb +86 -0
- data/lib/geocoder2/lookups/yandex.rb +54 -0
- data/lib/geocoder2/models/active_record.rb +46 -0
- data/lib/geocoder2/models/base.rb +42 -0
- data/lib/geocoder2/models/mongo_base.rb +60 -0
- data/lib/geocoder2/models/mongo_mapper.rb +26 -0
- data/lib/geocoder2/models/mongoid.rb +32 -0
- data/lib/geocoder2/query.rb +107 -0
- data/lib/geocoder2/railtie.rb +26 -0
- data/lib/geocoder2/request.rb +23 -0
- data/lib/geocoder2/results/baidu.rb +79 -0
- data/lib/geocoder2/results/base.rb +67 -0
- data/lib/geocoder2/results/bing.rb +48 -0
- data/lib/geocoder2/results/dstk.rb +6 -0
- data/lib/geocoder2/results/esri.rb +51 -0
- data/lib/geocoder2/results/freegeoip.rb +45 -0
- data/lib/geocoder2/results/geocoder_ca.rb +60 -0
- data/lib/geocoder2/results/geocoder_us.rb +39 -0
- data/lib/geocoder2/results/google.rb +124 -0
- data/lib/geocoder2/results/google_premier.rb +6 -0
- data/lib/geocoder2/results/mapquest.rb +51 -0
- data/lib/geocoder2/results/maxmind.rb +135 -0
- data/lib/geocoder2/results/nominatim.rb +94 -0
- data/lib/geocoder2/results/ovi.rb +62 -0
- data/lib/geocoder2/results/test.rb +16 -0
- data/lib/geocoder2/results/yahoo.rb +55 -0
- data/lib/geocoder2/results/yandex.rb +80 -0
- data/lib/geocoder2/sql.rb +106 -0
- data/lib/geocoder2/stores/active_record.rb +272 -0
- data/lib/geocoder2/stores/base.rb +120 -0
- data/lib/geocoder2/stores/mongo_base.rb +89 -0
- data/lib/geocoder2/stores/mongo_mapper.rb +13 -0
- data/lib/geocoder2/stores/mongoid.rb +13 -0
- data/lib/geocoder2/version.rb +3 -0
- data/lib/geocoder2.rb +55 -0
- data/lib/hash_recursive_merge.rb +74 -0
- data/lib/oauth_util.rb +112 -0
- data/lib/tasks/geocoder2.rake +27 -0
- data/test/active_record_test.rb +15 -0
- data/test/cache_test.rb +35 -0
- data/test/calculations_test.rb +211 -0
- data/test/configuration_test.rb +78 -0
- data/test/custom_block_test.rb +32 -0
- data/test/error_handling_test.rb +43 -0
- data/test/fixtures/baidu_invalid_key +1 -0
- data/test/fixtures/baidu_no_results +1 -0
- data/test/fixtures/baidu_reverse +1 -0
- data/test/fixtures/baidu_shanghai_pearl_tower +12 -0
- data/test/fixtures/bing_invalid_key +1 -0
- data/test/fixtures/bing_madison_square_garden +40 -0
- data/test/fixtures/bing_no_results +16 -0
- data/test/fixtures/bing_reverse +42 -0
- data/test/fixtures/esri_madison_square_garden +59 -0
- data/test/fixtures/esri_no_results +8 -0
- data/test/fixtures/esri_reverse +21 -0
- data/test/fixtures/freegeoip_74_200_247_59 +12 -0
- data/test/fixtures/freegeoip_no_results +1 -0
- data/test/fixtures/geocoder_ca_madison_square_garden +1 -0
- data/test/fixtures/geocoder_ca_no_results +1 -0
- data/test/fixtures/geocoder_ca_reverse +34 -0
- data/test/fixtures/geocoder_us_madison_square_garden +1 -0
- data/test/fixtures/geocoder_us_no_results +1 -0
- data/test/fixtures/google_garbage +456 -0
- data/test/fixtures/google_madison_square_garden +57 -0
- data/test/fixtures/google_no_city_data +44 -0
- data/test/fixtures/google_no_locality +51 -0
- data/test/fixtures/google_no_results +4 -0
- data/test/fixtures/google_over_limit +4 -0
- data/test/fixtures/mapquest_error +16 -0
- data/test/fixtures/mapquest_invalid_api_key +16 -0
- data/test/fixtures/mapquest_invalid_request +16 -0
- data/test/fixtures/mapquest_madison_square_garden +52 -0
- data/test/fixtures/mapquest_no_results +16 -0
- data/test/fixtures/maxmind_24_24_24_21 +1 -0
- data/test/fixtures/maxmind_24_24_24_22 +1 -0
- data/test/fixtures/maxmind_24_24_24_23 +1 -0
- data/test/fixtures/maxmind_24_24_24_24 +1 -0
- data/test/fixtures/maxmind_74_200_247_59 +1 -0
- data/test/fixtures/maxmind_invalid_key +1 -0
- data/test/fixtures/maxmind_no_results +1 -0
- data/test/fixtures/nominatim_madison_square_garden +150 -0
- data/test/fixtures/nominatim_no_results +1 -0
- data/test/fixtures/ovi_madison_square_garden +72 -0
- data/test/fixtures/ovi_no_results +8 -0
- data/test/fixtures/yahoo_error +1 -0
- data/test/fixtures/yahoo_invalid_key +2 -0
- data/test/fixtures/yahoo_madison_square_garden +52 -0
- data/test/fixtures/yahoo_no_results +10 -0
- data/test/fixtures/yahoo_over_limit +2 -0
- data/test/fixtures/yandex_invalid_key +1 -0
- data/test/fixtures/yandex_kremlin +48 -0
- data/test/fixtures/yandex_no_city_and_town +112 -0
- data/test/fixtures/yandex_no_results +16 -0
- data/test/geocoder_test.rb +59 -0
- data/test/https_test.rb +16 -0
- data/test/integration/smoke_test.rb +26 -0
- data/test/lookup_test.rb +117 -0
- data/test/method_aliases_test.rb +25 -0
- data/test/mongoid_test.rb +46 -0
- data/test/mongoid_test_helper.rb +43 -0
- data/test/near_test.rb +61 -0
- data/test/oauth_util_test.rb +30 -0
- data/test/proxy_test.rb +36 -0
- data/test/query_test.rb +52 -0
- data/test/request_test.rb +29 -0
- data/test/result_test.rb +42 -0
- data/test/services_test.rb +393 -0
- data/test/test_helper.rb +289 -0
- data/test/test_mode_test.rb +59 -0
- metadata +213 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[ .. .. lib]))
|
|
2
|
+
require 'pathname'
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
require 'test/unit'
|
|
5
|
+
require 'geocoder2'
|
|
6
|
+
|
|
7
|
+
class SmokeTest < Test::Unit::TestCase
|
|
8
|
+
|
|
9
|
+
def test_simple_zip_code_search
|
|
10
|
+
result = Geocoder2.search "27701"
|
|
11
|
+
assert_not_nil (r = result.first)
|
|
12
|
+
assert_equal "Durham", r.city
|
|
13
|
+
assert_equal "North Carolina", r.state
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_simple_zip_code_search_with_ssl
|
|
17
|
+
Geocoder2.configure(:use_https => true)
|
|
18
|
+
result = Geocoder2.search "27701"
|
|
19
|
+
assert_not_nil (r = result.first)
|
|
20
|
+
assert_equal "Durham", r.city
|
|
21
|
+
assert_equal "North Carolina", r.state
|
|
22
|
+
ensure
|
|
23
|
+
Geocoder2.configure(:use_https => false)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
data/test/lookup_test.rb
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
class LookupTest < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
def test_responds_to_name_method
|
|
7
|
+
Geocoder2::Lookup.all_services.each do |l|
|
|
8
|
+
lookup = Geocoder2::Lookup.get(l)
|
|
9
|
+
assert lookup.respond_to?(:name),
|
|
10
|
+
"Lookup #{l} does not respond to #name method."
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_search_returns_empty_array_when_no_results
|
|
15
|
+
Geocoder2::Lookup.all_services_except_test.each do |l|
|
|
16
|
+
lookup = Geocoder2::Lookup.get(l)
|
|
17
|
+
set_api_key!(l)
|
|
18
|
+
assert_equal [], lookup.send(:results, Geocoder2::Query.new("no results")),
|
|
19
|
+
"Lookup #{l} does not return empty array when no results."
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_query_url_contains_values_in_params_hash
|
|
24
|
+
Geocoder2::Lookup.all_services_except_test.each do |l|
|
|
25
|
+
next if l == :freegeoip # does not use query string
|
|
26
|
+
set_api_key!(l)
|
|
27
|
+
url = Geocoder2::Lookup.get(l).query_url(Geocoder2::Query.new(
|
|
28
|
+
"test", :params => {:one_in_the_hand => "two in the bush"}
|
|
29
|
+
))
|
|
30
|
+
# should be "+"s for all lookups except Yahoo
|
|
31
|
+
assert_match /one_in_the_hand=two(%20|\+)in(%20|\+)the(%20|\+)bush/, url,
|
|
32
|
+
"Lookup #{l} does not appear to support arbitrary params in URL"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
{
|
|
37
|
+
:esri => :l,
|
|
38
|
+
:bing => :key,
|
|
39
|
+
:geocoder_ca => :auth,
|
|
40
|
+
:google => :language,
|
|
41
|
+
:google_premier => :language,
|
|
42
|
+
:mapquest => :key,
|
|
43
|
+
:maxmind => :l,
|
|
44
|
+
:nominatim => :"accept-language",
|
|
45
|
+
:yahoo => :locale,
|
|
46
|
+
:yandex => :plng
|
|
47
|
+
}.each do |l,p|
|
|
48
|
+
define_method "test_passing_param_to_#{l}_query_overrides_configuration_value" do
|
|
49
|
+
set_api_key!(l)
|
|
50
|
+
url = Geocoder2::Lookup.get(l).query_url(Geocoder2::Query.new(
|
|
51
|
+
"test", :params => {p => "xxxx"}
|
|
52
|
+
))
|
|
53
|
+
assert_match /#{p}=xxxx/, url,
|
|
54
|
+
"Param passed to #{l} lookup does not override configuration value"
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_raises_exception_on_invalid_key
|
|
59
|
+
Geocoder2.configure(:always_raise => [Geocoder2::InvalidApiKey])
|
|
60
|
+
#Geocoder2::Lookup.all_services_except_test.each do |l|
|
|
61
|
+
[:bing, :yahoo, :yandex, :maxmind].each do |l|
|
|
62
|
+
lookup = Geocoder2::Lookup.get(l)
|
|
63
|
+
assert_raises Geocoder2::InvalidApiKey do
|
|
64
|
+
lookup.send(:results, Geocoder2::Query.new("invalid key"))
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def test_returns_empty_array_on_invalid_key
|
|
70
|
+
# keep test output clean: suppress timeout warning
|
|
71
|
+
orig = $VERBOSE; $VERBOSE = nil
|
|
72
|
+
#Geocoder2::Lookup.all_services_except_test.each do |l|
|
|
73
|
+
[:bing, :yahoo, :yandex, :maxmind].each do |l|
|
|
74
|
+
Geocoder2.configure(:lookup => l)
|
|
75
|
+
set_api_key!(l)
|
|
76
|
+
assert_equal [], Geocoder2.search("invalid key")
|
|
77
|
+
end
|
|
78
|
+
ensure
|
|
79
|
+
$VERBOSE = orig
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_does_not_choke_on_nil_address
|
|
83
|
+
Geocoder2::Lookup.all_services.each do |l|
|
|
84
|
+
Geocoder2.configure(:lookup => l)
|
|
85
|
+
assert_nothing_raised { Venue.new("Venue", nil).geocode }
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def test_hash_to_query
|
|
90
|
+
g = Geocoder2::Lookup::Google.new
|
|
91
|
+
assert_equal "a=1&b=2", g.send(:hash_to_query, {:a => 1, :b => 2})
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_google_api_key
|
|
95
|
+
Geocoder2.configure(:api_key => "MY_KEY")
|
|
96
|
+
g = Geocoder2::Lookup::Google.new
|
|
97
|
+
assert_match "key=MY_KEY", g.query_url(Geocoder2::Query.new("Madison Square Garden, New York, NY 10001, United States"))
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_geocoder_ca_showpostal
|
|
101
|
+
Geocoder2.configure(:api_key => "MY_KEY")
|
|
102
|
+
g = Geocoder2::Lookup::GeocoderCa.new
|
|
103
|
+
assert_match "showpostal=1", g.query_url(Geocoder2::Query.new("Madison Square Garden, New York, NY 10001, United States"))
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_raises_configuration_error_on_missing_key
|
|
107
|
+
assert_raises Geocoder2::ConfigurationError do
|
|
108
|
+
Geocoder2.configure(:lookup => :bing, :api_key => nil)
|
|
109
|
+
Geocoder2.search("Madison Square Garden, New York, NY 10001, United States")
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def test_handle
|
|
114
|
+
assert_equal :google, Geocoder2::Lookup::Google.new.handle
|
|
115
|
+
assert_equal :geocoder_ca, Geocoder2::Lookup::GeocoderCa.new.handle
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
class MethodAliasesTest < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
def test_distance_from_is_alias_for_distance_to
|
|
7
|
+
v = Venue.new(*venue_params(:msg))
|
|
8
|
+
v.latitude, v.longitude = [40.750354, -73.993371]
|
|
9
|
+
assert_equal v.distance_from([30, -94]), v.distance_to([30, -94])
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_fetch_coordinates_is_alias_for_geocode
|
|
13
|
+
v = Venue.new(*venue_params(:msg))
|
|
14
|
+
coords = [40.750354, -73.993371]
|
|
15
|
+
assert_equal coords, v.fetch_coordinates
|
|
16
|
+
assert_equal coords, [v.latitude, v.longitude]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_fetch_address_is_alias_for_reverse_geocode
|
|
20
|
+
v = Landmark.new(*landmark_params(:msg))
|
|
21
|
+
address = "4 Penn Plaza, New York, NY 10001, USA"
|
|
22
|
+
assert_equal address, v.fetch_address
|
|
23
|
+
assert_equal address, v.address
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'mongoid_test_helper'
|
|
3
|
+
|
|
4
|
+
class MongoidTest < Test::Unit::TestCase
|
|
5
|
+
def test_geocoded_check
|
|
6
|
+
p = Place.new(*venue_params(:msg))
|
|
7
|
+
p.location = [40.750354, -73.993371]
|
|
8
|
+
assert p.geocoded?
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_distance_to_returns_float
|
|
12
|
+
p = Place.new(*venue_params(:msg))
|
|
13
|
+
p.location = [40.750354, -73.993371]
|
|
14
|
+
assert p.distance_to([30, -94]).is_a?(Float)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_custom_coordinate_field_near_scope
|
|
18
|
+
location = [40.750354, -73.993371]
|
|
19
|
+
p = Place.near(location)
|
|
20
|
+
key = Mongoid::VERSION >= "3" ? "location" : :location
|
|
21
|
+
assert_equal p.selector[key]['$nearSphere'], location.reverse
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_model_configuration
|
|
25
|
+
p = Place.new(*venue_params(:msg))
|
|
26
|
+
p.location = [0, 0]
|
|
27
|
+
|
|
28
|
+
Place.geocoded_by :address, :coordinates => :location, :units => :km
|
|
29
|
+
assert_equal 111, p.distance_to([0,1]).round
|
|
30
|
+
|
|
31
|
+
Place.geocoded_by :address, :coordinates => :location, :units => :mi
|
|
32
|
+
assert_equal 69, p.distance_to([0,1]).round
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_index_is_skipped_if_skip_option_flag
|
|
36
|
+
result = PlaceWithoutIndex.index_options.keys.flatten[0] == :coordinates
|
|
37
|
+
assert !result
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_nil_radius_omits_max_distance
|
|
41
|
+
location = [40.750354, -73.993371]
|
|
42
|
+
p = Place.near(location, nil)
|
|
43
|
+
key = Mongoid::VERSION >= "3" ? "location" : :location
|
|
44
|
+
assert_equal nil, p.selector[key]['$maxDistance']
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'test/unit'
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
require 'mongoid'
|
|
5
|
+
require 'geocoder2/models/mongoid'
|
|
6
|
+
|
|
7
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
8
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
9
|
+
|
|
10
|
+
if (::Mongoid::VERSION >= "3")
|
|
11
|
+
Mongoid.logger = Logger.new($stderr, :debug)
|
|
12
|
+
else
|
|
13
|
+
Mongoid.configure do |config|
|
|
14
|
+
config.logger = Logger.new($stderr, :debug)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
# Geocoded model.
|
|
20
|
+
#
|
|
21
|
+
class Place
|
|
22
|
+
include Mongoid::Document
|
|
23
|
+
include Geocoder2::Model::Mongoid
|
|
24
|
+
|
|
25
|
+
geocoded_by :address, :coordinates => :location
|
|
26
|
+
field :name
|
|
27
|
+
field :address
|
|
28
|
+
field :location, :type => Array
|
|
29
|
+
|
|
30
|
+
def initialize(name, address)
|
|
31
|
+
super()
|
|
32
|
+
write_attribute :name, name
|
|
33
|
+
write_attribute :address, address
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class PlaceWithoutIndex
|
|
38
|
+
include Mongoid::Document
|
|
39
|
+
include Geocoder2::Model::Mongoid
|
|
40
|
+
|
|
41
|
+
field :location, :type => Array
|
|
42
|
+
geocoded_by :location, :skip_index => true
|
|
43
|
+
end
|
data/test/near_test.rb
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class NearTest < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
def test_near_scope_options_without_sqlite_includes_bounding_box_condition
|
|
6
|
+
result = Event.send(:near_scope_options, 1.0, 2.0, 5)
|
|
7
|
+
|
|
8
|
+
assert_match /test_table_name.latitude BETWEEN 0.9276\d* AND 1.0723\d* AND test_table_name.longitude BETWEEN 1.9276\d* AND 2.0723\d* AND /,
|
|
9
|
+
result[:conditions][0]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_near_scope_options_with_defaults
|
|
13
|
+
result = Event.send(:near_scope_options, 1.0, 2.0, 5)
|
|
14
|
+
|
|
15
|
+
assert_match /AS distance/, result[:select]
|
|
16
|
+
assert_match /AS bearing/, result[:select]
|
|
17
|
+
assert_no_consecutive_comma(result[:select])
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_near_scope_options_with_no_distance
|
|
21
|
+
result = Event.send(:near_scope_options, 1.0, 2.0, 5, :select_distance => false)
|
|
22
|
+
|
|
23
|
+
assert_no_match /AS distance/, result[:select]
|
|
24
|
+
assert_match /AS bearing/, result[:select]
|
|
25
|
+
assert_no_match /distance/, result[:condition]
|
|
26
|
+
assert_no_match /distance/, result[:order]
|
|
27
|
+
assert_no_consecutive_comma(result[:select])
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_near_scope_options_with_no_bearing
|
|
31
|
+
result = Event.send(:near_scope_options, 1.0, 2.0, 5, :select_bearing => false)
|
|
32
|
+
|
|
33
|
+
assert_match /AS distance/, result[:select]
|
|
34
|
+
assert_no_match /AS bearing/, result[:select]
|
|
35
|
+
assert_no_consecutive_comma(result[:select])
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_near_scope_options_with_custom_distance_column
|
|
39
|
+
result = Event.send(:near_scope_options, 1.0, 2.0, 5, :distance_column => 'calculated_distance')
|
|
40
|
+
|
|
41
|
+
assert_no_match /AS distance/, result[:select]
|
|
42
|
+
assert_match /AS calculated_distance/, result[:select]
|
|
43
|
+
assert_no_match /\bdistance\b/, result[:order]
|
|
44
|
+
assert_match /calculated_distance/, result[:order]
|
|
45
|
+
assert_no_consecutive_comma(result[:select])
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_near_scope_options_with_custom_bearing_column
|
|
49
|
+
result = Event.send(:near_scope_options, 1.0, 2.0, 5, :bearing_column => 'calculated_bearing')
|
|
50
|
+
|
|
51
|
+
assert_no_match /AS bearing/, result[:select]
|
|
52
|
+
assert_match /AS calculated_bearing/, result[:select]
|
|
53
|
+
assert_no_consecutive_comma(result[:select])
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def assert_no_consecutive_comma(string)
|
|
59
|
+
assert_no_match /, *,/, string, "two consecutive commas"
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
require 'cgi'
|
|
4
|
+
require 'uri'
|
|
5
|
+
|
|
6
|
+
class OauthUtilTest < Test::Unit::TestCase
|
|
7
|
+
def test_query_string_escapes_single_quote
|
|
8
|
+
base_url = "http://example.com?location=d'iberville"
|
|
9
|
+
|
|
10
|
+
o = OauthUtil.new
|
|
11
|
+
o.consumer_key = 'consumer_key'
|
|
12
|
+
o.consumer_secret = 'consumer_secret'
|
|
13
|
+
|
|
14
|
+
query_string = o.sign(URI.parse(base_url)).query_string
|
|
15
|
+
|
|
16
|
+
assert_match "location=d%27iberville", query_string
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_query_string_sorts_url_keys
|
|
20
|
+
base_url = "http://example.com?a_param=a&z_param=b&b_param=c&n_param=d"
|
|
21
|
+
|
|
22
|
+
o = OauthUtil.new
|
|
23
|
+
o.consumer_key = 'consumer_key'
|
|
24
|
+
o.consumer_secret = 'consumer_secret'
|
|
25
|
+
|
|
26
|
+
query_string = o.sign(URI.parse(base_url)).query_string
|
|
27
|
+
|
|
28
|
+
assert_match /.*a_param=.*b_param=.*n_param=.*z_param=.*/, query_string
|
|
29
|
+
end
|
|
30
|
+
end
|
data/test/proxy_test.rb
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
class ProxyTest < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
def test_uses_proxy_when_specified
|
|
7
|
+
Geocoder2.configure(:http_proxy => 'localhost')
|
|
8
|
+
lookup = Geocoder2::Lookup::Google.new
|
|
9
|
+
assert lookup.send(:http_client).proxy_class?
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_doesnt_use_proxy_when_not_specified
|
|
13
|
+
lookup = Geocoder2::Lookup::Google.new
|
|
14
|
+
assert !lookup.send(:http_client).proxy_class?
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_exception_raised_on_bad_proxy_url
|
|
18
|
+
Geocoder2.configure(:http_proxy => ' \\_O< Quack Quack')
|
|
19
|
+
assert_raise Geocoder2::ConfigurationError do
|
|
20
|
+
Geocoder2::Lookup::Google.new.send(:http_client)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_accepts_proxy_with_http_protocol
|
|
25
|
+
Geocoder2.configure(:http_proxy => 'http://localhost')
|
|
26
|
+
lookup = Geocoder2::Lookup::Google.new
|
|
27
|
+
assert lookup.send(:http_client).proxy_class?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_accepts_proxy_with_https_protocol
|
|
31
|
+
Geocoder2.configure(:https_proxy => 'https://localhost')
|
|
32
|
+
Geocoder2.configure(:use_https => true)
|
|
33
|
+
lookup = Geocoder2::Lookup::Google.new
|
|
34
|
+
assert lookup.send(:http_client).proxy_class?
|
|
35
|
+
end
|
|
36
|
+
end
|
data/test/query_test.rb
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
class QueryTest < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
def test_ip_address_detection
|
|
7
|
+
assert Geocoder2::Query.new("232.65.123.94").ip_address?
|
|
8
|
+
assert Geocoder2::Query.new("666.65.123.94").ip_address? # technically invalid
|
|
9
|
+
assert Geocoder2::Query.new("::ffff:12.34.56.78").ip_address?
|
|
10
|
+
assert !Geocoder2::Query.new("232.65.123.94.43").ip_address?
|
|
11
|
+
assert !Geocoder2::Query.new("232.65.123").ip_address?
|
|
12
|
+
assert !Geocoder2::Query.new("::ffff:123.456.789").ip_address?
|
|
13
|
+
assert !Geocoder2::Query.new("Test\n232.65.123.94").ip_address?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_blank_query_detection
|
|
17
|
+
assert Geocoder2::Query.new(nil).blank?
|
|
18
|
+
assert Geocoder2::Query.new("").blank?
|
|
19
|
+
assert Geocoder2::Query.new("\t ").blank?
|
|
20
|
+
assert !Geocoder2::Query.new("a").blank?
|
|
21
|
+
assert !Geocoder2::Query.new("Москва").blank? # no ASCII characters
|
|
22
|
+
assert !Geocoder2::Query.new("\na").blank?
|
|
23
|
+
|
|
24
|
+
assert Geocoder2::Query.new(nil, :params => {}).blank?
|
|
25
|
+
assert !Geocoder2::Query.new(nil, :params => {:woeid => 1234567}).blank?
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_blank_query_detection_for_coordinates
|
|
29
|
+
assert Geocoder2::Query.new([nil,nil]).blank?
|
|
30
|
+
assert Geocoder2::Query.new([87,nil]).blank?
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_coordinates_detection
|
|
34
|
+
assert Geocoder2::Query.new("51.178844,5").coordinates?
|
|
35
|
+
assert Geocoder2::Query.new("51.178844, -1.826189").coordinates?
|
|
36
|
+
assert !Geocoder2::Query.new("232.65.123").coordinates?
|
|
37
|
+
assert !Geocoder2::Query.new("Test\n51.178844, -1.826189").coordinates?
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_loopback_ip_address
|
|
41
|
+
assert Geocoder2::Query.new("0.0.0.0").loopback_ip_address?
|
|
42
|
+
assert Geocoder2::Query.new("127.0.0.1").loopback_ip_address?
|
|
43
|
+
assert !Geocoder2::Query.new("232.65.123.234").loopback_ip_address?
|
|
44
|
+
assert !Geocoder2::Query.new("127 Main St.").loopback_ip_address?
|
|
45
|
+
assert !Geocoder2::Query.new("John Doe\n127 Main St.\nAnywhere, USA").loopback_ip_address?
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_sanitized_text_with_array
|
|
49
|
+
q = Geocoder2::Query.new([43.1313,11.3131])
|
|
50
|
+
assert_equal "43.1313,11.3131", q.sanitized_text
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
class RequestTest < Test::Unit::TestCase
|
|
5
|
+
class MockRequest
|
|
6
|
+
include Geocoder2::Request
|
|
7
|
+
attr_accessor :env, :ip
|
|
8
|
+
def initialize(env={}, ip="")
|
|
9
|
+
@env = env
|
|
10
|
+
@ip = ip
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
def test_http_x_real_ip
|
|
14
|
+
req = MockRequest.new({"HTTP_X_REAL_IP" => "74.200.247.59"})
|
|
15
|
+
assert req.location.is_a?(Geocoder2::Result::Freegeoip)
|
|
16
|
+
end
|
|
17
|
+
def test_http_x_forwarded_for_without_proxy
|
|
18
|
+
req = MockRequest.new({"HTTP_X_FORWARDED_FOR" => "74.200.247.59"})
|
|
19
|
+
assert req.location.is_a?(Geocoder2::Result::Freegeoip)
|
|
20
|
+
end
|
|
21
|
+
def test_http_x_forwarded_for_with_proxy
|
|
22
|
+
req = MockRequest.new({"HTTP_X_FORWARDED_FOR" => "74.200.247.59, 74.200.247.59"})
|
|
23
|
+
assert req.location.is_a?(Geocoder2::Result::Freegeoip)
|
|
24
|
+
end
|
|
25
|
+
def test_with_request_ip
|
|
26
|
+
req = MockRequest.new({}, "74.200.247.59")
|
|
27
|
+
assert req.location.is_a?(Geocoder2::Result::Freegeoip)
|
|
28
|
+
end
|
|
29
|
+
end
|
data/test/result_test.rb
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
class ResultTest < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
def test_result_has_required_attributes
|
|
7
|
+
Geocoder2::Lookup.all_services_except_test.each do |l|
|
|
8
|
+
Geocoder2.configure(:lookup => l)
|
|
9
|
+
set_api_key!(l)
|
|
10
|
+
result = Geocoder2.search([45.423733, -75.676333]).first
|
|
11
|
+
assert_result_has_required_attributes(result)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_yandex_result_without_city_does_not_raise_exception
|
|
16
|
+
assert_nothing_raised do
|
|
17
|
+
Geocoder2.configure(:lookup => :yandex)
|
|
18
|
+
set_api_key!(:yandex)
|
|
19
|
+
result = Geocoder2.search("no city and town").first
|
|
20
|
+
assert_equal "", result.city
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
private # ------------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
def assert_result_has_required_attributes(result)
|
|
28
|
+
m = "Lookup #{Geocoder2.config.lookup} does not support %s attribute."
|
|
29
|
+
assert result.coordinates.is_a?(Array), m % "coordinates"
|
|
30
|
+
assert result.latitude.is_a?(Float), m % "latitude"
|
|
31
|
+
assert result.longitude.is_a?(Float), m % "longitude"
|
|
32
|
+
assert result.city.is_a?(String), m % "city"
|
|
33
|
+
assert result.state.is_a?(String), m % "state"
|
|
34
|
+
assert result.state_code.is_a?(String), m % "state_code"
|
|
35
|
+
assert result.province.is_a?(String), m % "province"
|
|
36
|
+
assert result.province_code.is_a?(String), m % "province_code"
|
|
37
|
+
assert result.postal_code.is_a?(String), m % "postal_code"
|
|
38
|
+
assert result.country.is_a?(String), m % "country"
|
|
39
|
+
assert result.country_code.is_a?(String), m % "country_code"
|
|
40
|
+
assert_not_nil result.address, m % "address"
|
|
41
|
+
end
|
|
42
|
+
end
|