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)