99
1010import json
1111
12+ from django .contrib .auth .models import Group
1213from django .core .cache import cache
1314from rest_framework .test import APIClient
1415from rest_framework .test import APITestCase
1516
1617from vulnerabilities .models import ApiUser
1718
1819
19- class ThrottleApiTests (APITestCase ):
20+ class GroupUserRateThrottleApiTests (APITestCase ):
2021 def setUp (self ):
2122 # Reset the api throttling to properly test the rate limit on anon users.
2223 # DRF stores throttling state in cache, clear cache to reset throttling.
2324 # See https://www.django-rest-framework.org/api-guide/throttling/#setting-up-the-cache
2425 cache .clear ()
2526
26- # create a basic user
27- self .user = ApiUser .objects .create_api_user (username = "e@mail.com" )
28- self .auth = f"Token { self .user .auth_token .key } "
29- self .csrf_client = APIClient (enforce_csrf_checks = True )
30- self .csrf_client .credentials (HTTP_AUTHORIZATION = self .auth )
27+ # User in bronze group
28+ self .bronze_user = ApiUser .objects .create_api_user (username = "bronze@mail.com" )
29+ bronze , _ = Group .objects .get_or_create (name = "bronze" )
30+ self .bronze_user .groups .clear ()
31+ self .bronze_user .groups .add (bronze )
32+ self .bronze_auth = f"Token { self .bronze_user .auth_token .key } "
33+ self .bronze_user_csrf_client = APIClient (enforce_csrf_checks = True )
34+ self .bronze_user_csrf_client .credentials (HTTP_AUTHORIZATION = self .bronze_auth )
35+
36+ # User in silver group (default group for api user)
37+ self .silver_user = ApiUser .objects .create_api_user (username = "silver@mail.com" )
38+ self .silver_auth = f"Token { self .silver_user .auth_token .key } "
39+ self .silver_user_csrf_client = APIClient (enforce_csrf_checks = True )
40+ self .silver_user_csrf_client .credentials (HTTP_AUTHORIZATION = self .silver_auth )
41+
42+ # User in gold group
43+ self .gold_user = ApiUser .objects .create_api_user (username = "gold@mail.com" )
44+ gold , _ = Group .objects .get_or_create (name = "gold" )
45+ self .gold_user .groups .add (gold )
46+ self .gold_auth = f"Token { self .gold_user .auth_token .key } "
47+ self .gold_user_csrf_client = APIClient (enforce_csrf_checks = True )
48+ self .gold_user_csrf_client .credentials (HTTP_AUTHORIZATION = self .gold_auth )
3149
3250 # create a staff user
3351 self .staff_user = ApiUser .objects .create_api_user (username = "staff@mail.com" , is_staff = True )
@@ -39,16 +57,34 @@ def setUp(self):
3957 self .csrf_client_anon_1 = APIClient (enforce_csrf_checks = True )
4058
4159 def test_package_endpoint_throttling (self ):
42- for i in range (0 , 20 ):
43- response = self .csrf_client .get ("/api/packages" )
60+ for i in range (0 , 15 ):
61+ response = self .bronze_user_csrf_client .get ("/api/packages" )
4462 self .assertEqual (response .status_code , 200 )
45- response = self .staff_csrf_client .get ("/api/packages" )
63+
64+ response = self .bronze_user_csrf_client .get ("/api/packages" )
65+ # 429 - too many requests for bronze user
66+ self .assertEqual (response .status_code , 429 )
67+
68+ for i in range (0 , 20 ):
69+ response = self .silver_user_csrf_client .get ("/api/packages" )
4670 self .assertEqual (response .status_code , 200 )
4771
48- response = self .csrf_client .get ("/api/packages" )
49- # 429 - too many requests for basic user
72+ response = self .silver_user_csrf_client .get ("/api/packages" )
73+ # 429 - too many requests for silver user
5074 self .assertEqual (response .status_code , 429 )
5175
76+ for i in range (0 , 30 ):
77+ response = self .gold_user_csrf_client .get ("/api/packages" )
78+ self .assertEqual (response .status_code , 200 )
79+
80+ response = self .gold_user_csrf_client .get ("/api/packages" , format = "json" )
81+ # 200 - gold user can access API unlimited times
82+ self .assertEqual (response .status_code , 200 )
83+
84+ for i in range (0 , 30 ):
85+ response = self .staff_csrf_client .get ("/api/packages" )
86+ self .assertEqual (response .status_code , 200 )
87+
5288 response = self .staff_csrf_client .get ("/api/packages" , format = "json" )
5389 # 200 - staff user can access API unlimited times
5490 self .assertEqual (response .status_code , 200 )
0 commit comments