def test_ratelimit(self): """ Validates whether the rate limiter behaves correctly """ from api.oauth2.decorators import limit, auto_response @auto_response() @limit(amount=2, per=2, timeout=2) def the_function(input_value, *args, **kwargs): """ Decorated function """ _ = args, kwargs output['value'] = input_value return input_value output = {'value': None} request = self.factory.post('/') with self.assertRaises(KeyError): # Should raise a KeyError complaining about the HTTP_X_REAL_IP the_function(1, request) request.META['HTTP_X_REAL_IP'] = '127.0.0.1' response = the_function(2, request) self.assertEqual(output['value'], 2) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, '2') response = the_function(3, request) self.assertEqual(output['value'], 3) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, '3') with self.assertRaises(HttpTooManyRequestsException) as context: the_function(4, request) response = OVSMiddleware().process_exception(request, context.exception) self.assertEqual(output['value'], 3) self.assertEqual(response.status_code, 429) self.assertEqual( json.loads(response.content)['error'], 'rate_limit_reached') with self.assertRaises(HttpTooManyRequestsException) as context: the_function(5, request) response = OVSMiddleware().process_exception(request, context.exception) self.assertEqual(output['value'], 3) self.assertEqual(response.status_code, 429) self.assertEqual( json.loads(response.content)['error'], 'rate_limit_timeout') time.sleep(5) response = the_function(6, request) self.assertEqual(output['value'], 6) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, '6')
def _assert_failure(self, view, request, status_code, error_code, exception): middleware = OVSMiddleware() with self.assertRaises(exception) as context: view(request) response = middleware.process_exception(request, context.exception) self.assertEqual(response.status_code, status_code) data = json.loads(response.content) self.assertIn('error', data) self.assertEqual(data['error'], error_code)