diff --git a/lib/geocoder.rb b/lib/geocoder.rb index b73e6e9cf2d71eaabee62652f58751f5fbb88c04..fb0df8490bf1b87b9c62b3c0641d0c0fa35193c3 100644 --- a/lib/geocoder.rb +++ b/lib/geocoder.rb @@ -56,7 +56,7 @@ module Geocoder # All street address lookups, default first. # def street_lookups - [:google, :google_premier, :yahoo, :bing, :geocoder_ca, :yandex, :nominatim] + [:google, :google_premier, :yahoo, :bing, :geocoder_ca, :yandex, :nominatim, :test] end ## diff --git a/lib/geocoder/configuration.rb b/lib/geocoder/configuration.rb index 44baabeebf4547d063ee0798ce643a2d1aebfa86..9ab57b46a181dfd6a91495008ff857a47fb23a20 100644 --- a/lib/geocoder/configuration.rb +++ b/lib/geocoder/configuration.rb @@ -54,5 +54,30 @@ module Geocoder END end + + def self.test_mode=(test_mode) + if test_mode + @original_lookup = lookup + self.lookup = :test + else + self.lookup = @original_lookup + end + end + + def self.add_stub(query, results) + stubs[query] = results + end + + def self.read_stub(query) + stubs.fetch(query) { raise ArgumentError, "unknown stub request #{query}" } + end + + def self.stubs + @stubs ||= {} + end + + def self.reset_stubs + @stubs = {} + end end end diff --git a/lib/geocoder/lookups/test.rb b/lib/geocoder/lookups/test.rb new file mode 100644 index 0000000000000000000000000000000000000000..c9aed395c96f13c25e0deb46b6745149526f526b --- /dev/null +++ b/lib/geocoder/lookups/test.rb @@ -0,0 +1,16 @@ +require 'geocoder/lookups/base' +require 'geocoder/results/test' + +module Geocoder + module Lookup + class Test < Base + + private + + def results(query, reverse = false) + Geocoder::Configuration.read_stub(query) + end + + end + end +end diff --git a/lib/geocoder/results/test.rb b/lib/geocoder/results/test.rb new file mode 100644 index 0000000000000000000000000000000000000000..d029d1a71b5b8418a5fcf2d0eec6f3c08e565042 --- /dev/null +++ b/lib/geocoder/results/test.rb @@ -0,0 +1,29 @@ +require 'geocoder/results/base' + +module Geocoder + module Result + class Test < Base + + def address + @data['address'] + end + + def state + @data['state'] + end + + def state_code + @data['state_code'] + end + + def country + @data['country'] + end + + def country_code + @data['country_code'] + end + + end + end +end diff --git a/test/test_mode_test.rb b/test/test_mode_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..51d3371f8b07b7c88e1caada28f6e74e48750993 --- /dev/null +++ b/test/test_mode_test.rb @@ -0,0 +1,54 @@ +require 'test_helper' + +class TestModeTest < Test::Unit::TestCase + + def teardown + Geocoder::Configuration.reset_stubs + end + + def test_search_with_known_stub + Geocoder::Configuration.test_mode = true + attributes = { + 'latitude' => 40.7143528, + 'longitude' => -74.0059731, + 'address' => 'New York, NY, USA', + 'state' => 'New York', + 'state_code' => 'NY', + 'country' => 'United States', + 'country_code' => 'US', + } + coordinates = [attributes['latitude'], attributes['longitude']] + + Geocoder::Configuration.add_stub("New York, NY", [attributes]) + + results = Geocoder.search("New York, NY") + assert_equal 1, results.size + + result = results.first + assert_equal coordinates, result.coordinates + assert_equal attributes['latitude'], result.latitude + assert_equal attributes['longitude'], result.longitude + assert_equal attributes['address'], result.address + assert_equal attributes['state'], result.state + assert_equal attributes['state_code'], result.state_code + assert_equal attributes['country'], result.country + assert_equal attributes['country_code'], result.country_code + end + + def test_search_with_unknown_stub + Geocoder::Configuration.test_mode = true + + assert_raise ArgumentError do + Geocoder.search("New York, NY") + end + end + + def test_turning_off_test_mode_restores_lookup + original_lookup = Geocoder::Configuration.lookup + Geocoder::Configuration.test_mode = true + Geocoder::Configuration.test_mode = false + + assert_equal original_lookup, Geocoder::Configuration.lookup + end + +end