diff options
| author | Xavier Ordoquy | 2014-05-01 08:01:38 +0200 | 
|---|---|---|
| committer | Xavier Ordoquy | 2014-05-01 08:01:38 +0200 | 
| commit | 7b4463f73983e36f228e6af0ff8c921d4698a9b3 (patch) | |
| tree | c26fd01425a3754e65a0b2c48694ca734278745f /tests/test_throttling.py | |
| parent | 2aca69a94601858a462060bc55154c812f70fb91 (diff) | |
| parent | c9e6f31166ebccc5c3bf2f27e12a6d6c87f5cf22 (diff) | |
| download | django-rest-framework-7b4463f73983e36f228e6af0ff8c921d4698a9b3.tar.bz2 | |
Merge remote-tracking branch 'reference/2.4.0' into feature/pytest
Conflicts:
	rest_framework/runtests/urls.py
	tests/test_response.py
	tox.ini
Diffstat (limited to 'tests/test_throttling.py')
| -rw-r--r-- | tests/test_throttling.py | 66 | 
1 files changed, 66 insertions, 0 deletions
| diff --git a/tests/test_throttling.py b/tests/test_throttling.py index 41bff692..8c5eefe9 100644 --- a/tests/test_throttling.py +++ b/tests/test_throttling.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals  from django.test import TestCase  from django.contrib.auth.models import User  from django.core.cache import cache +from rest_framework.settings import api_settings  from rest_framework.test import APIRequestFactory  from rest_framework.views import APIView  from rest_framework.throttling import BaseThrottle, UserRateThrottle, ScopedRateThrottle @@ -275,3 +276,68 @@ class ScopedRateThrottleTests(TestCase):              self.increment_timer()              response = self.unscoped_view(request)              self.assertEqual(200, response.status_code) + + +class XffTestingBase(TestCase): +    def setUp(self): + +        class Throttle(ScopedRateThrottle): +            THROTTLE_RATES = {'test_limit': '1/day'} +            TIMER_SECONDS = 0 +            timer = lambda self: self.TIMER_SECONDS + +        class View(APIView): +            throttle_classes = (Throttle,) +            throttle_scope = 'test_limit' + +            def get(self, request): +                return Response('test_limit') + +        cache.clear() +        self.throttle = Throttle() +        self.view = View.as_view() +        self.request = APIRequestFactory().get('/some_uri') +        self.request.META['REMOTE_ADDR'] = '3.3.3.3' +        self.request.META['HTTP_X_FORWARDED_FOR'] = '0.0.0.0, 1.1.1.1, 2.2.2.2' + +    def config_proxy(self, num_proxies): +        setattr(api_settings, 'NUM_PROXIES', num_proxies) + + +class IdWithXffBasicTests(XffTestingBase): +    def test_accepts_request_under_limit(self): +        self.config_proxy(0) +        self.assertEqual(200, self.view(self.request).status_code) + +    def test_denies_request_over_limit(self): +        self.config_proxy(0) +        self.view(self.request) +        self.assertEqual(429, self.view(self.request).status_code) + + +class XffSpoofingTests(XffTestingBase): +    def test_xff_spoofing_doesnt_change_machine_id_with_one_app_proxy(self): +        self.config_proxy(1) +        self.view(self.request) +        self.request.META['HTTP_X_FORWARDED_FOR'] = '4.4.4.4, 5.5.5.5, 2.2.2.2' +        self.assertEqual(429, self.view(self.request).status_code) + +    def test_xff_spoofing_doesnt_change_machine_id_with_two_app_proxies(self): +        self.config_proxy(2) +        self.view(self.request) +        self.request.META['HTTP_X_FORWARDED_FOR'] = '4.4.4.4, 1.1.1.1, 2.2.2.2' +        self.assertEqual(429, self.view(self.request).status_code) + + +class XffUniqueMachinesTest(XffTestingBase): +    def test_unique_clients_are_counted_independently_with_one_proxy(self): +        self.config_proxy(1) +        self.view(self.request) +        self.request.META['HTTP_X_FORWARDED_FOR'] = '0.0.0.0, 1.1.1.1, 7.7.7.7' +        self.assertEqual(200, self.view(self.request).status_code) + +    def test_unique_clients_are_counted_independently_with_two_proxies(self): +        self.config_proxy(2) +        self.view(self.request) +        self.request.META['HTTP_X_FORWARDED_FOR'] = '0.0.0.0, 7.7.7.7, 2.2.2.2' +        self.assertEqual(200, self.view(self.request).status_code) | 
