# 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(:use_https => false)
    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
