diff --git a/Appraisals b/Appraisals index 55b47f0..e9d2e21 100644 --- a/Appraisals +++ b/Appraisals @@ -37,3 +37,22 @@ appraise "connection_pool_dalli" do gem "connection_pool", "~> 2.2" gem "dalli", "~> 2.7" end + +appraise "active_support_redis_cache_store" do + gem "activesupport", "~> 5.2.0" + gem "redis", "~> 4.0" +end + +appraise "active_support_redis_cache_store_pooled" do + gem "activesupport", "~> 5.2.0" + gem "connection_pool", "~> 2.2" + gem "redis", "~> 4.0" +end + +appraise "redis_store" do + gem "redis-store", "~> 1.5" +end + +appraise "active_support_redis_store" do + gem "redis-activesupport", "~> 5.0" +end diff --git a/gemfiles/active_support_redis_cache_store.gemfile b/gemfiles/active_support_redis_cache_store.gemfile new file mode 100644 index 0000000..30e1e38 --- /dev/null +++ b/gemfiles/active_support_redis_cache_store.gemfile @@ -0,0 +1,8 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "activesupport", "~> 5.2.0" +gem "redis", "~> 4.0" + +gemspec path: "../" diff --git a/gemfiles/active_support_redis_cache_store_pooled.gemfile b/gemfiles/active_support_redis_cache_store_pooled.gemfile new file mode 100644 index 0000000..9232a9b --- /dev/null +++ b/gemfiles/active_support_redis_cache_store_pooled.gemfile @@ -0,0 +1,9 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "activesupport", "~> 5.2.0" +gem "connection_pool", "~> 2.2" +gem "redis", "~> 4.0" + +gemspec path: "../" diff --git a/gemfiles/active_support_redis_store.gemfile b/gemfiles/active_support_redis_store.gemfile new file mode 100644 index 0000000..517c70f --- /dev/null +++ b/gemfiles/active_support_redis_store.gemfile @@ -0,0 +1,7 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "redis-activesupport", "~> 5.0" + +gemspec path: "../" diff --git a/gemfiles/redis_store.gemfile b/gemfiles/redis_store.gemfile new file mode 100644 index 0000000..8aafc6d --- /dev/null +++ b/gemfiles/redis_store.gemfile @@ -0,0 +1,7 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "redis-store", "~> 1.5" + +gemspec path: "../" diff --git a/rack-attack.gemspec b/rack-attack.gemspec index 59ba7df..c1180c7 100644 --- a/rack-attack.gemspec +++ b/rack-attack.gemspec @@ -48,5 +48,4 @@ Gem::Specification.new do |s| # which rack-attack uses only for testing compatibility in test suite. s.add_development_dependency 'actionpack', '>= 3.0.0' s.add_development_dependency 'activesupport', '>= 3.0.0' - s.add_development_dependency 'redis-activesupport' end diff --git a/spec/acceptance/stores/active_support_redis_cache_store_pooled_spec.rb b/spec/acceptance/stores/active_support_redis_cache_store_pooled_spec.rb index 3447981..5295ba5 100644 --- a/spec/acceptance/stores/active_support_redis_cache_store_pooled_spec.rb +++ b/spec/acceptance/stores/active_support_redis_cache_store_pooled_spec.rb @@ -1,42 +1,40 @@ require_relative "../../spec_helper" -if defined?(::ConnectionPool) +if defined?(::ConnectionPool) && defined?(::Redis) && defined?(::ActiveSupport::Cache::RedisCacheStore) require_relative "../../support/cache_store_helper" require "timecop" - if ActiveSupport.version >= Gem::Version.new("5.2.0") - describe "ActiveSupport::Cache::RedisCacheStore (pooled) as a cache backend" do - before do - Rack::Attack.cache.store = ActiveSupport::Cache::RedisCacheStore.new(pool_size: 2) + describe "ActiveSupport::Cache::RedisCacheStore (pooled) as a cache backend" do + before do + Rack::Attack.cache.store = ActiveSupport::Cache::RedisCacheStore.new(pool_size: 2) + end + + after do + Rack::Attack.cache.store.clear + end + + it_works_for_cache_backed_features + + it "doesn't leak keys" do + Rack::Attack.throttle("by ip", limit: 1, period: 1) do |request| + request.ip end - after do - Rack::Attack.cache.store.clear + key = nil + + # Freeze time during these statement to be sure that the key used by rack attack is the same + # we pre-calculate in local variable `key` + Timecop.freeze do + key = "rack::attack:#{Time.now.to_i}:by ip:1.2.3.4" + + get "/", {}, "REMOTE_ADDR" => "1.2.3.4" end - it_works_for_cache_backed_features + assert Rack::Attack.cache.store.fetch(key) - it "doesn't leak keys" do - Rack::Attack.throttle("by ip", limit: 1, period: 1) do |request| - request.ip - end + sleep 2.1 - key = nil - - # Freeze time during these statement to be sure that the key used by rack attack is the same - # we pre-calculate in local variable `key` - Timecop.freeze do - key = "rack::attack:#{Time.now.to_i}:by ip:1.2.3.4" - - get "/", {}, "REMOTE_ADDR" => "1.2.3.4" - end - - assert Rack::Attack.cache.store.fetch(key) - - sleep 2.1 - - assert_nil Rack::Attack.cache.store.fetch(key) - end + assert_nil Rack::Attack.cache.store.fetch(key) end end end diff --git a/spec/acceptance/stores/active_support_redis_cache_store_spec.rb b/spec/acceptance/stores/active_support_redis_cache_store_spec.rb index 495a6a2..e6ecdda 100644 --- a/spec/acceptance/stores/active_support_redis_cache_store_spec.rb +++ b/spec/acceptance/stores/active_support_redis_cache_store_spec.rb @@ -1,9 +1,9 @@ require_relative "../../spec_helper" -require_relative "../../support/cache_store_helper" -require "timecop" +if defined?(::Redis) && defined?(::ActiveSupport::Cache::RedisCacheStore) + require_relative "../../support/cache_store_helper" + require "timecop" -if ActiveSupport.version >= Gem::Version.new("5.2.0") describe "ActiveSupport::Cache::RedisCacheStore as a cache backend" do before do Rack::Attack.cache.store = ActiveSupport::Cache::RedisCacheStore.new diff --git a/spec/acceptance/stores/active_support_redis_store_spec.rb b/spec/acceptance/stores/active_support_redis_store_spec.rb index 0b446e4..840a7d4 100644 --- a/spec/acceptance/stores/active_support_redis_store_spec.rb +++ b/spec/acceptance/stores/active_support_redis_store_spec.rb @@ -1,39 +1,40 @@ require_relative "../../spec_helper" -require_relative "../../support/cache_store_helper" -require "redis-activesupport" -require "timecop" +if defined?(::ActiveSupport::Cache::RedisStore) + require_relative "../../support/cache_store_helper" + require "timecop" -describe "ActiveSupport::Cache::RedisStore as a cache backend" do - before do - Rack::Attack.cache.store = ActiveSupport::Cache::RedisStore.new - end - - after do - Rack::Attack.cache.store.flushdb - end - - it_works_for_cache_backed_features - - it "doesn't leak keys" do - Rack::Attack.throttle("by ip", limit: 1, period: 1) do |request| - request.ip + describe "ActiveSupport::Cache::RedisStore as a cache backend" do + before do + Rack::Attack.cache.store = ActiveSupport::Cache::RedisStore.new end - key = nil - - # Freeze time during these statement to be sure that the key used by rack attack is the same - # we pre-calculate in local variable `key` - Timecop.freeze do - key = "rack::attack:#{Time.now.to_i}:by ip:1.2.3.4" - - get "/", {}, "REMOTE_ADDR" => "1.2.3.4" + after do + Rack::Attack.cache.store.flushdb end - assert Rack::Attack.cache.store.read(key) + it_works_for_cache_backed_features - sleep 2.1 + it "doesn't leak keys" do + Rack::Attack.throttle("by ip", limit: 1, period: 1) do |request| + request.ip + end - assert_nil Rack::Attack.cache.store.read(key) + key = nil + + # Freeze time during these statement to be sure that the key used by rack attack is the same + # we pre-calculate in local variable `key` + Timecop.freeze do + key = "rack::attack:#{Time.now.to_i}:by ip:1.2.3.4" + + get "/", {}, "REMOTE_ADDR" => "1.2.3.4" + end + + assert Rack::Attack.cache.store.read(key) + + sleep 2.1 + + assert_nil Rack::Attack.cache.store.read(key) + end end end diff --git a/spec/acceptance/stores/redis_store_spec.rb b/spec/acceptance/stores/redis_store_spec.rb index 17e5a0a..9c9fba5 100644 --- a/spec/acceptance/stores/redis_store_spec.rb +++ b/spec/acceptance/stores/redis_store_spec.rb @@ -1,39 +1,40 @@ require_relative "../../spec_helper" require_relative "../../support/cache_store_helper" -require "redis-store" -require "timecop" +if defined?(::Redis::Store) + require "timecop" -describe "ActiveSupport::Cache::RedisStore as a cache backend" do - before do - Rack::Attack.cache.store = ::Redis::Store.new - end - - after do - Rack::Attack.cache.store.flushdb - end - - it_works_for_cache_backed_features - - it "doesn't leak keys" do - Rack::Attack.throttle("by ip", limit: 1, period: 1) do |request| - request.ip + describe "ActiveSupport::Cache::RedisStore as a cache backend" do + before do + Rack::Attack.cache.store = ::Redis::Store.new end - key = nil - - # Freeze time during these statement to be sure that the key used by rack attack is the same - # we pre-calculate in local variable `key` - Timecop.freeze do - key = "rack::attack:#{Time.now.to_i}:by ip:1.2.3.4" - - get "/", {}, "REMOTE_ADDR" => "1.2.3.4" + after do + Rack::Attack.cache.store.flushdb end - assert Rack::Attack.cache.store.read(key) + it_works_for_cache_backed_features - sleep 2.1 + it "doesn't leak keys" do + Rack::Attack.throttle("by ip", limit: 1, period: 1) do |request| + request.ip + end - assert_nil Rack::Attack.cache.store.read(key) + key = nil + + # Freeze time during these statement to be sure that the key used by rack attack is the same + # we pre-calculate in local variable `key` + Timecop.freeze do + key = "rack::attack:#{Time.now.to_i}:by ip:1.2.3.4" + + get "/", {}, "REMOTE_ADDR" => "1.2.3.4" + end + + assert Rack::Attack.cache.store.read(key) + + sleep 2.1 + + assert_nil Rack::Attack.cache.store.read(key) + end end end diff --git a/spec/integration/offline_spec.rb b/spec/integration/offline_spec.rb index 8d1f670..6a6e925 100644 --- a/spec/integration/offline_spec.rb +++ b/spec/integration/offline_spec.rb @@ -1,5 +1,4 @@ require 'active_support/cache' -require 'redis-activesupport' require_relative '../spec_helper' OfflineExamples = Minitest::SharedExamples.new do @@ -16,13 +15,15 @@ OfflineExamples = Minitest::SharedExamples.new do end end -describe 'when Redis is offline' do - include OfflineExamples +if defined?(::ActiveSupport::Cache::RedisStore) + describe 'when Redis is offline' do + include OfflineExamples - before do - @cache = Rack::Attack::Cache.new - # Use presumably unused port for Redis client - @cache.store = ActiveSupport::Cache::RedisStore.new(:host => '127.0.0.1', :port => 3333) + before do + @cache = Rack::Attack::Cache.new + # Use presumably unused port for Redis client + @cache.store = ActiveSupport::Cache::RedisStore.new(:host => '127.0.0.1', :port => 3333) + end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4bac5f8..420f193 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -23,6 +23,21 @@ begin rescue LoadError end +begin + require "redis" +rescue LoadError +end + +begin + require "redis-activesupport" +rescue LoadError +end + +begin + require "redis-store" +rescue LoadError +end + class MiniTest::Spec include Rack::Test::Methods