2015-10-11 10:41:23 +01:00
require 'rails_helper'
2013-02-05 14:16:51 -05:00
require 'rate_limiter'
describe RateLimiter do
let ( :user ) { Fabricate ( :user ) }
let ( :rate_limiter ) { RateLimiter . new ( user , " peppermint-butler " , 2 , 60 ) }
context 'disabled' do
before do
RateLimiter . stubs ( :disabled? ) . returns ( true )
rate_limiter . performed!
2013-02-25 19:42:20 +03:00
rate_limiter . performed!
2013-02-05 14:16:51 -05:00
end
it " returns true for can_perform? " do
2015-01-09 13:34:37 -03:00
expect ( rate_limiter . can_perform? ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
it " doesn't raise an error on performed! " do
2015-01-09 13:34:37 -03:00
expect { rate_limiter . performed! } . not_to raise_error
2013-02-05 14:16:51 -05:00
end
end
context 'enabled' do
before do
RateLimiter . stubs ( :disabled? ) . returns ( false )
2013-02-25 19:42:20 +03:00
rate_limiter . clear!
2013-02-05 14:16:51 -05:00
end
context 'never done' do
it " should perform right away " do
2015-01-09 13:34:37 -03:00
expect ( rate_limiter . can_perform? ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
it " performs without an error " do
2015-01-09 13:34:37 -03:00
expect { rate_limiter . performed! } . not_to raise_error
2013-02-05 14:16:51 -05:00
end
end
2016-03-18 11:17:51 -04:00
context " remaining " do
it " updates correctly " do
expect ( rate_limiter . remaining ) . to eq ( 2 )
rate_limiter . performed!
expect ( rate_limiter . remaining ) . to eq ( 1 )
rate_limiter . performed!
expect ( rate_limiter . remaining ) . to eq ( 0 )
end
end
2013-02-05 14:16:51 -05:00
context " multiple calls " do
before do
rate_limiter . performed!
rate_limiter . performed!
end
it " returns false for can_perform when the limit has been hit " do
2015-01-09 13:34:37 -03:00
expect ( rate_limiter . can_perform? ) . to eq ( false )
2016-03-18 11:17:51 -04:00
expect ( rate_limiter . remaining ) . to eq ( 0 )
2013-02-05 14:16:51 -05:00
end
it " raises an error the third time called " do
2015-01-09 13:34:37 -03:00
expect { rate_limiter . performed! } . to raise_error ( RateLimiter :: LimitExceeded )
2013-02-05 14:16:51 -05:00
end
context " as an admin/moderator " do
it " returns true for can_perform if the user is an admin " do
user . admin = true
2015-01-09 13:34:37 -03:00
expect ( rate_limiter . can_perform? ) . to eq ( true )
2016-03-18 11:17:51 -04:00
expect ( rate_limiter . remaining ) . to eq ( 2 )
2013-02-05 14:16:51 -05:00
end
it " doesn't raise an error when an admin performs the task " do
user . admin = true
2015-01-09 13:34:37 -03:00
expect { rate_limiter . performed! } . not_to raise_error
2013-02-05 14:16:51 -05:00
end
it " returns true for can_perform if the user is a mod " do
2013-03-19 21:05:19 -07:00
user . moderator = true
2015-01-09 13:34:37 -03:00
expect ( rate_limiter . can_perform? ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
it " doesn't raise an error when a moderator performs the task " do
2013-03-19 21:05:19 -07:00
user . moderator = true
2015-01-09 13:34:37 -03:00
expect { rate_limiter . performed! } . not_to raise_error
2013-02-05 14:16:51 -05:00
end
end
context " rollback! " do
before do
rate_limiter . rollback!
end
it " returns true for can_perform since there is now room " do
2015-01-09 13:34:37 -03:00
expect ( rate_limiter . can_perform? ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
it " raises no error now that there is room " do
2015-01-09 13:34:37 -03:00
expect { rate_limiter . performed! } . not_to raise_error
2013-02-05 14:16:51 -05:00
end
end
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
end