Skip to content

Commit 677ff99

Browse files
committed
Add test for group based throttling
Signed-off-by: Keshav Priyadarshi <git@keshav.space>
1 parent 42673a7 commit 677ff99

File tree

3 files changed

+51
-15
lines changed

3 files changed

+51
-15
lines changed

vulnerabilities/tests/test_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ def add_aliases(vuln, aliases):
452452

453453
class APIPerformanceTest(TestCase):
454454
def setUp(self):
455-
self.user = ApiUser.objects.create_api_user(username="e@mail.com")
455+
self.user = ApiUser.objects.create_api_user(username="e@mail.com", is_staff=True)
456456
self.auth = f"Token {self.user.auth_token.key}"
457457
self.csrf_client = APIClient(enforce_csrf_checks=True)
458458
self.csrf_client.credentials(HTTP_AUTHORIZATION=self.auth)
@@ -572,7 +572,7 @@ def test_api_packages_bulk_lookup(self):
572572

573573
class APITestCasePackage(TestCase):
574574
def setUp(self):
575-
self.user = ApiUser.objects.create_api_user(username="e@mail.com")
575+
self.user = ApiUser.objects.create_api_user(username="e@mail.com", is_staff=True)
576576
self.auth = f"Token {self.user.auth_token.key}"
577577
self.csrf_client = APIClient(enforce_csrf_checks=True)
578578
self.csrf_client.credentials(HTTP_AUTHORIZATION=self.auth)

vulnerabilities/tests/test_api_v2.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def setUp(self):
6161
)
6262
self.reference2.vulnerabilities.add(self.vuln2)
6363

64-
self.user = ApiUser.objects.create_api_user(username="e@mail.com")
64+
self.user = ApiUser.objects.create_api_user(username="e@mail.com", is_staff=True)
6565
self.auth = f"Token {self.user.auth_token.key}"
6666
self.client = APIClient(enforce_csrf_checks=True)
6767
self.client.credentials(HTTP_AUTHORIZATION=self.auth)
@@ -210,7 +210,7 @@ def setUp(self):
210210
self.package1.affected_by_vulnerabilities.add(self.vuln1)
211211
self.package2.fixing_vulnerabilities.add(self.vuln2)
212212

213-
self.user = ApiUser.objects.create_api_user(username="e@mail.com")
213+
self.user = ApiUser.objects.create_api_user(username="e@mail.com", is_staff=True)
214214
self.auth = f"Token {self.user.auth_token.key}"
215215
self.client = APIClient(enforce_csrf_checks=True)
216216
self.client.credentials(HTTP_AUTHORIZATION=self.auth)

vulnerabilities/tests/test_throttling.py

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,43 @@
99

1010
import json
1111

12+
from django.contrib.auth.models import Group
1213
from django.core.cache import cache
1314
from rest_framework.test import APIClient
1415
from rest_framework.test import APITestCase
1516

1617
from 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

Comments
 (0)