diff --git a/Rakefile b/Rakefile index 475bece..52b39f2 100644 --- a/Rakefile +++ b/Rakefile @@ -13,7 +13,7 @@ namespace :test do end Rake::TestTask.new(:acceptance) do |t| - t.pattern = "spec/acceptance/*_spec.rb" + t.pattern = "spec/acceptance/**/*_spec.rb" end end diff --git a/spec/acceptance/stores/redis_cache_store_spec.rb b/spec/acceptance/stores/redis_cache_store_spec.rb new file mode 100644 index 0000000..4e47126 --- /dev/null +++ b/spec/acceptance/stores/redis_cache_store_spec.rb @@ -0,0 +1,70 @@ +require_relative "../../spec_helper" + +if ActiveSupport.version >= Gem::Version.new("5.2.0") + describe "RedisCacheStore as a cache backend" do + before do + Rack::Attack.cache.store = ActiveSupport::Cache::RedisCacheStore.new + end + + after do + Rack::Attack.cache.store.clear + end + + it "works for throttle" do + Rack::Attack.throttle("by ip", limit: 1, period: 60) do |request| + request.ip + end + + get "/", {}, "REMOTE_ADDR" => "1.2.3.4" + + assert_equal 200, last_response.status + + get "/", {}, "REMOTE_ADDR" => "1.2.3.4" + + assert_equal 429, last_response.status + end + + it "works for fail2ban" do + Rack::Attack.blocklist("fail2ban pentesters") do |request| + Rack::Attack::Fail2Ban.filter(request.ip, maxretry: 2, findtime: 30, bantime: 60) do + request.path.include?("private-place") + end + end + + get "/" + assert_equal 200, last_response.status + + get "/private-place" + assert_equal 403, last_response.status + + get "/private-place" + assert_equal 403, last_response.status + + get "/" + assert_equal 403, last_response.status + end + + it "works for allow2ban" do + Rack::Attack.blocklist("allow2ban pentesters") do |request| + Rack::Attack::Allow2Ban.filter(request.ip, maxretry: 2, findtime: 30, bantime: 60) do + request.path.include?("scarce-resource") + end + end + + get "/" + assert_equal 200, last_response.status + + get "/scarce-resource" + assert_equal 200, last_response.status + + get "/scarce-resource" + assert_equal 200, last_response.status + + get "/scarce-resource" + assert_equal 403, last_response.status + + get "/" + assert_equal 403, last_response.status + end + end +end