Commit 7bed352e by markotibold

refactored and added new tests for per-user, per-view, and per-resource htrottling

parent f854bc90
...@@ -8,27 +8,25 @@ from django.core.cache import cache ...@@ -8,27 +8,25 @@ from django.core.cache import cache
from djangorestframework.compat import RequestFactory from djangorestframework.compat import RequestFactory
from djangorestframework.views import View from djangorestframework.views import View
from djangorestframework.permissions import PerUserThrottling, PerResourceThrottling from djangorestframework.permissions import PerUserThrottling, PerViewThrottling, PerResourceThrottling, ConfigurationException
from djangorestframework.resources import FormResource
class MockView(View): class MockView(View):
permissions = ( PerUserThrottling, ) permissions = ( PerUserThrottling, )
throttle = (3, 1) # 3 requests per second throttle = '3/sec' # 3 requests per second
def get(self, request): def get(self, request):
return 'foo' return 'foo'
class MockView1(View): class MockView1(MockView):
permissions = ( PerResourceThrottling, ) permissions = ( PerViewThrottling, )
throttle = (3, 1) # 3 requests per second
def get(self, request): class MockView2(MockView):
return 'foo' permissions = ( PerResourceThrottling, )
#No resource set
urlpatterns = patterns('', class MockView3(MockView2):
(r'^$', MockView.as_view()), resource = FormResource
(r'^1$', MockView1.as_view()),
)
class ThrottlingTests(TestCase): class ThrottlingTests(TestCase):
urls = 'djangorestframework.tests.throttling' urls = 'djangorestframework.tests.throttling'
...@@ -36,50 +34,51 @@ class ThrottlingTests(TestCase): ...@@ -36,50 +34,51 @@ class ThrottlingTests(TestCase):
def setUp(self): def setUp(self):
"""Reset the cache so that no throttles will be active""" """Reset the cache so that no throttles will be active"""
cache.clear() cache.clear()
self.factory = RequestFactory()
def test_requests_are_throttled(self): def test_requests_are_throttled(self):
"""Ensure request rate is limited""" """Ensure request rate is limited"""
request = self.factory.get('/')
for dummy in range(4):
response = MockView.as_view()(request)
self.assertEqual(503, response.status_code)
def test_request_throttling_expires(self):
"""Ensure request rate is limited for a limited duration only"""
request = self.factory.get('/')
for dummy in range(4):
response = MockView.as_view()(request)
self.assertEqual(503, response.status_code)
time.sleep(1)
response = MockView.as_view()(request)
self.assertEqual(200, response.status_code)
def ensure_is_throttled(self, view):
request = self.factory.get('/')
request.user = User.objects.create(username='a')
for dummy in range(3): for dummy in range(3):
response = self.client.get('/') response = view.as_view()(request)
response = self.client.get('/') request.user = User.objects.create(username='b')
response = view.as_view()(request)
self.assertEqual(503, response.status_code) self.assertEqual(503, response.status_code)
def test_request_throttling_is_per_user(self): def test_request_throttling_is_per_user(self):
"""Ensure request rate is only limited per user, not globally""" """Ensure request rate is only limited per user, not globally for PerUserTrottles"""
for username in ('testuser', 'another_testuser'): self.ensure_is_throttled(MockView)
user = User.objects.create(username=username)
user.set_password('test')
user.save()
self.assertTrue(self.client.login(username='testuser', password='test'), msg='Login Failed') def test_request_throttling_is_per_view(self):
for dummy in range(3): """Ensure request rate is limited globally per View for PerViewThrottles"""
response = self.client.get('/') self.ensure_is_throttled(MockView1)
self.client.logout()
self.assertTrue(self.client.login(username='another_testuser', password='test'), msg='Login failed')
response = self.client.get('/')
self.assertEqual(200, response.status_code)
def test_request_throttling_is_per_resource(self): def test_request_throttling_is_per_resource(self):
"""Ensure request rate is limited globally per View""" """Ensure request rate is limited globally per Resource for PerResourceThrottles"""
for username in ('testuser', 'another_testuser'): self.ensure_is_throttled(MockView3)
user = User.objects.create(username=username)
user.set_password('test') def test_raises_no_resource_found(self):
user.save() """Ensure an Exception is raised when someone sets at per-resource throttle
on a view with no resource set."""
request = self.factory.get('/')
view = MockView2.as_view()
self.assertRaises(ConfigurationException, view, request)
self.assertTrue(self.client.login(username='testuser', password='test'), msg='Login Failed')
for dummy in range(3):
response = self.client.get('/1')
self.client.logout()
self.assertTrue(self.client.login(username='another_testuser', password='test'), msg='Login failed')
response = self.client.get('/1')
self.assertEqual(503, response.status_code)
\ No newline at end of file
def test_request_throttling_expires(self):
"""Ensure request rate is limited for a limited duration only"""
for dummy in range(3):
response = self.client.get('/')
response = self.client.get('/')
self.assertEqual(503, response.status_code)
time.sleep(1)
response = self.client.get('/')
self.assertEqual(200, response.status_code)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment