Testing Geocoding Cache Implementation in alexreisner/geocoder
This test suite validates the caching functionality of the Geocoder gem, focusing on cache hits, error handling, and cache management across different geocoding service providers.
Test Coverage Overview
Implementation Analysis
Technical Details
Best Practices Demonstrated
alexreisner/geocoder
test/unit/cache_test.rb
# encoding: utf-8
require 'test_helper'
class CacheTest < GeocoderTestCase
def setup
@tempfile = Tempfile.new("log")
@logger = Logger.new(@tempfile.path)
Geocoder.configure(logger: @logger)
end
def teardown
Geocoder.configure(logger: :kernel)
@logger.close
@tempfile.close
end
def test_second_occurrence_of_request_is_cache_hit
Geocoder.configure(:cache => {})
Geocoder::Lookup.all_services_except_test.each do |l|
next if
# local, does not use cache
l == :maxmind_local ||
l == :geoip2 ||
l == :ip2location_lite ||
# uses the AWS gem, not HTTP requests with caching
l == :amazon_location_service
Geocoder.configure(:lookup => l)
set_api_key!(l)
results = Geocoder.search("Madison Square Garden")
assert !results.first.cache_hit,
"Lookup #{l} returned erroneously cached result."
results = Geocoder.search("Madison Square Garden")
assert results.first.cache_hit,
"Lookup #{l} did not return cached result."
end
end
def test_google_over_query_limit_does_not_hit_cache
Geocoder.configure(:cache => {})
Geocoder.configure(:lookup => :google)
set_api_key!(:google)
Geocoder.configure(:always_raise => :all)
assert_raises Geocoder::OverQueryLimitError do
Geocoder.search("over limit")
end
lookup = Geocoder::Lookup.get(:google)
assert_equal false, lookup.instance_variable_get(:@cache_hit)
assert_raises Geocoder::OverQueryLimitError do
Geocoder.search("over limit")
end
assert_equal false, lookup.instance_variable_get(:@cache_hit)
end
def test_bing_service_unavailable_without_raising_does_not_hit_cache
Geocoder.configure(cache: {}, lookup: :bing, always_raise: [])
set_api_key!(:bing)
lookup = Geocoder::Lookup.get(:bing)
Geocoder.search("service unavailable")
assert_false lookup.instance_variable_get(:@cache_hit)
Geocoder.search("service unavailable")
assert_false lookup.instance_variable_get(:@cache_hit)
end
def test_expire_all_urls
Geocoder.configure(cache: {}, cache_options: {prefix: "geocoder:"})
lookup = Geocoder::Lookup.get(:nominatim)
lookup.cache['http://api.nominatim.com/'] = 'data'
assert_operator 0, :<, lookup.cache.send(:keys).size
lookup.cache.expire(:all)
assert_equal 0, lookup.cache.send(:keys).size
end
end