rack-attack/spec/rack_attack_cache_spec.rb
Will Kimeria 87f628d0c1 If redis client throws exception, don't raise it
For throttling, when the redis client throws an exception, the request
ends up getting rate limited. Modify this to be similar to how
ActiveSupport.MemCacheStore functions (the read, write and increment
methods do not raise exceptions)
2014-03-14 11:50:59 -07:00

112 lines
3.2 KiB
Ruby

require_relative 'spec_helper'
if ENV['TEST_INTEGRATION']
describe Rack::Attack::Cache do
def delete(key)
if @cache.store.respond_to?(:delete)
@cache.store.delete(key)
else
@cache.store.del(key)
end
end
require 'active_support/cache/dalli_store'
require 'active_support/cache/redis_store'
cache_stores = [
ActiveSupport::Cache::MemoryStore.new,
ActiveSupport::Cache::DalliStore.new("localhost"),
ActiveSupport::Cache::RedisStore.new("localhost"),
Redis::Store.new
]
cache_stores.each do |store|
store = Rack::Attack::StoreProxy.build(store)
describe "with #{store.class}" do
before {
@cache ||= Rack::Attack::Cache.new
@key = "rack::attack:cache-test-key"
@expires_in = 1
@cache.store = store
delete(@key)
}
after { delete(@key) }
describe "do_count once" do
it "should be 1" do
@cache.send(:do_count, @key, @expires_in).must_equal 1
end
end
describe "do_count twice" do
it "must be 2" do
@cache.send(:do_count, @key, @expires_in)
@cache.send(:do_count, @key, @expires_in).must_equal 2
end
end
describe "do_count after expires_in" do
it "must be 1" do
@cache.send(:do_count, @key, @expires_in)
sleep @expires_in # sigh
@cache.send(:do_count, @key, @expires_in).must_equal 1
end
end
describe "write" do
it "should write a value to the store with prefix" do
@cache.write("cache-test-key", "foobar", 1)
store.read(@key).must_equal "foobar"
end
end
describe "write after expiry" do
it "must not have a value" do
@cache.write("cache-test-key", "foobar", @expires_in)
sleep @expires_in # tick... tick... tick...
store.read(@key).must_be :nil?
end
end
describe "read" do
it "must read the value with a prefix" do
store.write(@key, "foobar", :expires_in => @expires_in)
@cache.read("cache-test-key").must_equal "foobar"
end
end
end
end
describe "should not error if redis is not running" do
before {
@cache = Rack::Attack::Cache.new
@key = "rack::attack:cache-test-key"
@expires_in = 1
# Use ip reserved for documentation to ensure it does not exist
# http://tools.ietf.org/html/rfc5737
@cache.store = ActiveSupport::Cache::RedisStore.new(:host => '203.0.113.0', :port => 3333)
}
describe "write" do
it "should not raise exception" do
@cache.write("cache-test-key", "foobar", 1)
end
end
describe "read" do
it "should not raise exception" do
@cache.read("cache-test-key")
end
end
describe "do_count" do
it "should not raise exception" do
@cache.send(:do_count, @key, @expires_in)
end
end
end
end
else
puts 'Skipping cache store integration tests (set ENV["TEST_INTEGRATION"] to enable)'
end