Newer
Older
require 'rubygems'
require 'test/unit'
$LOAD_PATH.unshift(File.dirname(__FILE__))
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
Alex Reisner
committed
if ENV['DB']
require 'rails'
require 'active_record'
# Establish a database connection
configs = YAML.load_file('test/database.yml')
ActiveRecord::Base.configurations = configs
Steve Lawson
committed
db_name = ENV['DB']
ActiveRecord::Base.establish_connection(db_name)
ActiveRecord::Base.default_timezone = :utc
else
class MysqlConnection
def adapter_name
"mysql"
end
end
Alex Reisner
committed
##
# Simulate enough of ActiveRecord::Base that objects can be used for testing.
#
module ActiveRecord
class Base
def initialize
@attributes = {}
end
def read_attribute(attr_name)
@attributes[attr_name.to_sym]
end
def write_attribute(attr_name, value)
@attributes[attr_name.to_sym] = value
end
def update_attribute(attr_name, value)
write_attribute(attr_name.to_sym, value)
end
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
def self.scope(*args); end
def self.connection
MysqlConnection.new
end
def method_missing(name, *args, &block)
if name.to_s[-1..-1] == "="
write_attribute name.to_s[0...-1], *args
else
read_attribute name
end
end
class << self
def table_name
'test_table_name'
end
def primary_key
:id
end
end
end
end
# simulate Rails module so Railtie gets loaded
module Rails
end
end
# Require Geocoder after ActiveRecord simulator.
require 'geocoder'
require 'geocoder/lookups/base'
# and initialize Railtie manually (since Rails::Railtie doesn't exist)
Geocoder::Railtie.insert
Alex Reisner
committed
##
Alex Reisner
committed
#
module Geocoder
private
def fixture_exists?(filename)
File.exist?(File.join("test", "fixtures", filename))
end
filepath = File.join("test", "fixtures", file)
s = File.read(filepath).strip.gsub(/\n\s*/, "")
MockHttpResponse.new(body: s, code: "200")
##
# Fixture to use if none match the given query.
#
def default_fixture_filename
"#{fixture_prefix}_madison_square_garden"
def fixture_for_query(query)
label = query.reverse_geocode? ? "reverse" : query.text.gsub(/[ \.]/, "_")
filename = "#{fixture_prefix}_#{label}"
fixture_exists?(filename) ? filename : default_fixture_filename
end
raise TimeoutError if query.text == "timeout"
raise SocketError if query.text == "socket_error"
raise Errno::ECONNREFUSED if query.text == "connection_refused"
if query.text == "invalid_json"
return MockHttpResponse.new(:body => 'invalid json', :code => 200)
end
read_fixture fixture_for_query(query)
class Bing
private
def read_fixture(file)
if file == "bing_service_unavailable"
filepath = File.join("test", "fixtures", file)
s = File.read(filepath).strip.gsub(/\n\s*/, "")
MockHttpResponse.new(body: s, code: "200", headers: {'x-ms-bm-ws-info' => "1"})
else
super
end
end
end
class GooglePremier
private
def fixture_prefix
"google"
class GooglePlacesDetails
private
def fixture_prefix
"google_places_details"
end
end
Eric Hayes
committed
class Dstk
private
def fixture_prefix
"google"
end
end
class Yandex
private
def default_fixture_filename
"yandex_kremlin"
class Freegeoip
private
def default_fixture_filename
"freegeoip_74_200_247_59"
private
remove_method(:results)
def results(query)
return [] if query.to_s == 'no results'
return [] if query.to_s == '127.0.0.1'
[{'city'=>{'names'=>{'en'=>'Mountain View'}},'country'=>{'iso_code'=>'US','names'=>
{'en'=>'United States'}},'location'=>{'latitude'=>37.41919999999999,
'longitude'=>-122.0574},'postal'=>{'code'=>'94043'},'subdivisions'=>[{
'iso_code'=>'CA','names'=>{'en'=>'California'}}]}]
end
def default_fixture_filename
class Telize
private
def default_fixture_filename
"telize_74_200_247_59"
end
end
class Pointpin
private
def default_fixture_filename
"pointpin_80_111_555_555"
end
end
class Maxmind
private
def default_fixture_filename
"maxmind_74_200_247_59"
class MaxmindGeoip2
private
def default_fixture_filename
"maxmind_geoip2_1_2_3_4"
end
end
class MaxmindLocal
private
def results query
return [] if query.to_s == "no results"
if query.to_s == '127.0.0.1'
[]
else
[{:request=>"8.8.8.8", :ip=>"8.8.8.8", :country_code2=>"US", :country_code3=>"USA", :country_name=>"United States", :continent_code=>"NA", :region_name=>"CA", :city_name=>"Mountain View", :postal_code=>"94043", :latitude=>37.41919999999999, :longitude=>-122.0574, :dma_code=>807, :area_code=>650, :timezone=>"America/Los_Angeles"}]
end
class Baidu
private
def default_fixture_filename
"baidu_shanghai_pearl_tower"
end
end
private
def default_fixture_filename
Alex Reisner
committed
class Geocodio
private
def default_fixture_filename
"geocodio_1101_pennsylvania_ave"
end
end
class Okf
private
def default_fixture_filename
"okf_kirstinmaki"
end
end
class PostcodeAnywhereUk
private
def fixture_prefix
'postcode_anywhere_uk_geocode_v2_00'
def default_fixture_filename
"#{fixture_prefix}_romsey"
end
Alex Reisner
committed
end
end
##
# Geocoded model.
#
class Place < ActiveRecord::Base
Alex Reisner
committed
geocoded_by :address
Alex Reisner
committed
def initialize(name, address)
super()
write_attribute :name, name
write_attribute :address, address
end
end
Steve Lawson
committed
##
# Geocoded model.
# - Has user-defined primary key (not just 'id')
#
class PlaceWithCustomPrimaryKey < Place
Steve Lawson
committed
class << self
def primary_key
:custom_primary_key_id
end
end
end
class PlaceReverseGeocoded < ActiveRecord::Base
reverse_geocoded_by :latitude, :longitude
def initialize(name, latitude, longitude)
super()
write_attribute :name, name
write_attribute :latitude, latitude
write_attribute :longitude, longitude
end
class PlaceWithCustomResultsHandling < ActiveRecord::Base
geocoded_by :address do |obj,results|
if result = results.first
obj.coords_string = "#{result.latitude},#{result.longitude}"
else
obj.coords_string = "NOT FOUND"
end
end
def initialize(name, address)
super()
write_attribute :name, name
write_attribute :address, address
class PlaceReverseGeocodedWithCustomResultsHandling < ActiveRecord::Base
reverse_geocoded_by :latitude, :longitude do |obj,results|
if result = results.first
obj.country = result.country_code
end
end
def initialize(name, latitude, longitude)
super()
write_attribute :name, name
write_attribute :latitude, latitude
write_attribute :longitude, longitude
end
end
class PlaceWithForwardAndReverseGeocoding < ActiveRecord::Base
geocoded_by :address, :latitude => :lat, :longitude => :lon
reverse_geocoded_by :lat, :lon, :address => :location
def initialize(name)
super()
write_attribute :name, name
end
end
class PlaceWithCustomLookup < ActiveRecord::Base
geocoded_by :address, :lookup => :nominatim do |obj,results|
if result = results.first
obj.result_class = result.class
end
end
def initialize(name, address)
super()
write_attribute :name, name
write_attribute :address, address
end
end
class PlaceWithCustomLookupProc < ActiveRecord::Base
geocoded_by :address, :lookup => lambda{|obj| obj.custom_lookup } do |obj,results|
if result = results.first
obj.result_class = result.class
end
end
def custom_lookup
:nominatim
end
def initialize(name, address)
super()
write_attribute :name, name
write_attribute :address, address
end
end
class PlaceReverseGeocodedWithCustomLookup < ActiveRecord::Base
reverse_geocoded_by :latitude, :longitude, :lookup => :nominatim do |obj,results|
if result = results.first
obj.result_class = result.class
end
end
def initialize(name, latitude, longitude)
super()
write_attribute :name, name
write_attribute :latitude, latitude
write_attribute :longitude, longitude
end
end
class GeocoderTestCase < Test::Unit::TestCase
Geocoder::Configuration.instance.set_defaults
Geocoder.configure(
:maxmind => {:service => :city_isp_org},
:maxmind_geoip2 => {:service => :insights, :basic_auth => {:user => "user", :password => "password"}})
def geocoded_object_params(abbrev)
Alex Reisner
committed
{
:msg => ["Madison Square Garden", "4 Penn Plaza, New York, NY"]
}[abbrev]
end
def reverse_geocoded_object_params(abbrev)
{
:msg => ["Madison Square Garden", 40.750354, -73.993371]
}[abbrev]
end
lookup = Geocoder::Lookup.get(lookup_name)
if lookup.required_api_key_parts.size == 1
key = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
elsif lookup.required_api_key_parts.size > 1
key = lookup.required_api_key_parts
Geocoder.configure(:api_key => key)
attr_reader :code, :body
def initialize(options = {})
@code = options[:code].to_s
@body = options[:body]
@headers = options[:headers] || {}
def [](key)
@headers[key]