diff --git a/.travis.yml b/.travis.yml index 5456a02..c55040c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,3 +11,7 @@ rvm: gemfile: - gemfiles/activesupport3.2 - gemfiles/activesupport4.0 + +services: + - redis + - memcached diff --git a/Rakefile b/Rakefile index 3c19db8..0475689 100644 --- a/Rakefile +++ b/Rakefile @@ -2,8 +2,17 @@ require "rubygems" require "bundler/setup" require 'rake/testtask' -Rake::TestTask.new do |t| - t.pattern = "spec/*_spec.rb" +namespace :test do + Rake::TestTask.new(:units) do |t| + t.pattern = "spec/*_spec.rb" + end + + Rake::TestTask.new(:integration) do |t| + t.pattern = "spec/integration/*_spec.rb" + end end +desc 'Run tests' +task :test => %w[test:units test:integration] + task :default => :test diff --git a/spec/integration/rack_attack_cache_spec.rb b/spec/integration/rack_attack_cache_spec.rb new file mode 100644 index 0000000..d2f3721 --- /dev/null +++ b/spec/integration/rack_attack_cache_spec.rb @@ -0,0 +1,108 @@ +require_relative '../spec_helper' + +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 diff --git a/spec/rack_attack_cache_spec.rb b/spec/rack_attack_cache_spec.rb deleted file mode 100644 index 0016ff9..0000000 --- a/spec/rack_attack_cache_spec.rb +++ /dev/null @@ -1,112 +0,0 @@ -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