22
33from django .test import RequestFactory
44from exam import fixture
5+ from rest_framework .permissions import AllowAny
6+ from rest_framework .response import Response
57
8+ from sentry .api .base import Endpoint
9+ from sentry .middleware .ratelimit import RatelimitMiddleware
610from sentry .middleware .stats import RequestTimingMiddleware , add_request_metric_tags
711from sentry .testutils import TestCase
812from sentry .testutils .helpers .faux import Mock
13+ from sentry .types .ratelimit import RateLimit , RateLimitCategory
14+
15+
16+ class RateLimitedEndpoint (Endpoint ):
17+ permission_classes = (AllowAny ,)
18+
19+ enforce_rate_limit = True
20+ rate_limits = {"GET" : {RateLimitCategory .IP : RateLimit (0 , 10 )}}
21+
22+ def get (self ):
23+ return Response ({"ok" : True })
924
1025
1126class RequestTimingMiddlewareTest (TestCase ):
@@ -23,7 +38,35 @@ def test_records_default_api_metrics(self, incr):
2338 incr .assert_called_with (
2439 "view.response" ,
2540 instance = request ._view_path ,
26- tags = {"method" : "GET" , "status_code" : 200 , "ui_request" : False },
41+ tags = {
42+ "method" : "GET" ,
43+ "status_code" : 200 ,
44+ "ui_request" : False ,
45+ "rate_limit_type" : None ,
46+ },
47+ skip_internal = False ,
48+ )
49+
50+ @patch ("sentry.utils.metrics.incr" )
51+ def test_records_default_api_metrics_with_rate_limit_type (self , incr ):
52+ rate_limit_middleware = RatelimitMiddleware (None )
53+ test_endpoint = RateLimitedEndpoint .as_view ()
54+ request = self .factory .get ("/" )
55+ request ._view_path = "/"
56+ response = Mock (status_code = 429 )
57+
58+ rate_limit_middleware .process_view (request , test_endpoint , [], {})
59+ self .middleware .process_response (request , response )
60+
61+ incr .assert_called_with (
62+ "view.response" ,
63+ instance = request ._view_path ,
64+ tags = {
65+ "method" : "GET" ,
66+ "status_code" : 429 ,
67+ "ui_request" : False ,
68+ "rate_limit_type" : "fixed_window" ,
69+ },
2770 skip_internal = False ,
2871 )
2972
@@ -39,7 +82,7 @@ def test_records_ui_request(self, incr):
3982 incr .assert_called_with (
4083 "view.response" ,
4184 instance = request ._view_path ,
42- tags = {"method" : "GET" , "status_code" : 200 , "ui_request" : True },
85+ tags = {"method" : "GET" , "status_code" : 200 , "ui_request" : True , "rate_limit_type" : None },
4386 skip_internal = False ,
4487 )
4588
@@ -56,7 +99,13 @@ def test_records_endpoint_specific_metrics(self, incr):
5699 incr .assert_called_with (
57100 "view.response" ,
58101 instance = request ._view_path ,
59- tags = {"method" : "GET" , "status_code" : 200 , "ui_request" : False , "a" : "b" },
102+ tags = {
103+ "method" : "GET" ,
104+ "status_code" : 200 ,
105+ "ui_request" : False ,
106+ "a" : "b" ,
107+ "rate_limit_type" : None ,
108+ },
60109 skip_internal = False ,
61110 )
62111
@@ -74,6 +123,12 @@ def test_add_request_metric_tags(self, incr):
74123 incr .assert_called_with (
75124 "view.response" ,
76125 instance = request ._view_path ,
77- tags = {"method" : "GET" , "status_code" : 200 , "ui_request" : False , "foo" : "bar" },
126+ tags = {
127+ "method" : "GET" ,
128+ "status_code" : 200 ,
129+ "ui_request" : False ,
130+ "foo" : "bar" ,
131+ "rate_limit_type" : None ,
132+ },
78133 skip_internal = False ,
79134 )
0 commit comments