def test_rate_limiter_first_time(self, sleep): # The first time we see a URL, there is no rate limiting. limiter = RateLimiter() message = FakeSoupMessage('friends.tests.data', 'twitter-home.dat') message.new('GET', 'http://example.com/') limiter.wait(message) sleep.assert_called_with(0)
def test_rate_limiter_second_time_with_query_on_request(self, time, sleep): # A query parameter on the original request is ignored. limiter = RateLimiter() message = FakeSoupMessage('friends.tests.data', 'twitter-home.dat', headers={ 'X-Rate-Limit-Reset': 1349382153 + 300, 'X-Rate-Limit-Remaining': 1, }) limiter.update(message.new('GET', 'http://example.com/foo?baz=7')) limiter.wait(message) sleep.assert_called_with(300)
def test_rate_limiter_second_time(self, time, sleep): # The second time we see the URL, we get rate limited. limiter = RateLimiter() message = FakeSoupMessage('friends.tests.data', 'twitter-home.dat', headers={ 'X-Rate-Limit-Reset': 1349382153 + 300, 'X-Rate-Limit-Remaining': 1, }) limiter.update(message.new('GET', 'http://example.com')) limiter.wait(message) sleep.assert_called_with(300)
def test_rate_limiter_unlimited(self, time, sleep): # With more than 5 calls remaining in this window, we don't rate # limit, even if we've already seen this url. limiter = RateLimiter() message = FakeSoupMessage('friends.tests.data', 'twitter-home.dat', headers={ 'X-Rate-Limit-Reset': 1349382153 + 300, 'X-Rate-Limit-Remaining': 10, }) limiter.update(message.new('GET', 'http://example.com/omega')) limiter.wait(message) sleep.assert_called_with(0)
def test_rate_limiter_medium(self, time, sleep): # With a few calls remaining this window, we time slice the remaining # time evenly between those remaining calls. limiter = RateLimiter() message = FakeSoupMessage('friends.tests.data', 'twitter-home.dat', headers={ 'X-Rate-Limit-Reset': 1349382153 + 300, 'X-Rate-Limit-Remaining': 3, }) limiter.update(message.new('GET', 'http://example.com/beta')) limiter.wait(message) sleep.assert_called_with(100.0)
def test_rate_limiter_until_end_of_window(self, time, sleep): # With no remaining calls left this window, we wait until the end of # the window. limiter = RateLimiter() message = FakeSoupMessage('friends.tests.data', 'twitter-home.dat', headers={ 'X-Rate-Limit-Reset': 1349382153 + 300, 'X-Rate-Limit-Remaining': 0, }) limiter.update(message.new('GET', 'http://example.com/alpha')) limiter.wait(message) sleep.assert_called_with(300)
def test_rate_limiter_maximum(self, time, sleep): # With one remaining call this window, we get rate limited to the # full amount of the remaining window. limiter = RateLimiter() message = FakeSoupMessage('friends.tests.data', 'twitter-home.dat', headers={ 'X-Rate-Limit-Reset': 1349382153 + 300, 'X-Rate-Limit-Remaining': 1, }) limiter.update(message.new('GET', 'http://example.com/alpha')) limiter.wait(message) sleep.assert_called_with(300)