From 00d6322fd61e3f4002ee3d4eb25be7e896d25661 Mon Sep 17 00:00:00 2001 From: Michael Guterl <michael@diminishing.org> Date: Sun, 27 Nov 2011 17:48:17 -0500 Subject: [PATCH] Initial implementation of test mode for easier stubbing --- lib/geocoder.rb | 2 +- lib/geocoder/configuration.rb | 25 ++++++++++++++++ lib/geocoder/lookups/test.rb | 16 +++++++++++ lib/geocoder/results/test.rb | 29 +++++++++++++++++++ test/test_mode_test.rb | 54 +++++++++++++++++++++++++++++++++++ 5 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 lib/geocoder/lookups/test.rb create mode 100644 lib/geocoder/results/test.rb create mode 100644 test/test_mode_test.rb diff --git a/lib/geocoder.rb b/lib/geocoder.rb index b73e6e9c..fb0df849 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 44baabee..9ab57b46 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 00000000..c9aed395 --- /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 00000000..d029d1a7 --- /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 00000000..51d3371f --- /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 -- GitLab