mirror of
https://github.com/samsonjs/rack-attack.git
synced 2026-03-25 09:25:49 +00:00
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)
112 lines
3.2 KiB
Ruby
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
|