Skip to content

Commit 01170df

Browse files
authored
test: Add test for api.ietf_utils (#8965)
* test: Add test for api.ietf_utils * test: Use ietf.utils.test_utils instead of django.test * test: Add test case for request without a token * test: Test for misconfigured endpoint * test: Improve tests * test: Add test for a API call without X_API_KEY header
1 parent 5afea62 commit 01170df

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

ietf/api/tests_ietf_utils.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# Copyright The IETF Trust 2025, All Rights Reserved
2+
3+
from django.test import RequestFactory
4+
from django.test.utils import override_settings
5+
6+
from ietf.api.ietf_utils import is_valid_token, requires_api_token
7+
from ietf.utils.test_utils import TestCase
8+
9+
10+
class IetfUtilsTests(TestCase):
11+
@override_settings(
12+
APP_API_TOKENS={
13+
"ietf.api.foobar": ["valid-token"],
14+
"ietf.api.misconfigured": "valid-token", # misconfigured
15+
}
16+
)
17+
def test_is_valid_token(self):
18+
self.assertFalse(is_valid_token("ietf.fake.endpoint", "valid-token"))
19+
self.assertFalse(is_valid_token("ietf.api.foobar", "invalid-token"))
20+
self.assertFalse(is_valid_token("ietf.api.foobar", None))
21+
self.assertTrue(is_valid_token("ietf.api.foobar", "valid-token"))
22+
23+
# misconfiguration
24+
self.assertFalse(is_valid_token("ietf.api.misconfigured", "v"))
25+
self.assertFalse(is_valid_token("ietf.api.misconfigured", None))
26+
self.assertTrue(is_valid_token("ietf.api.misconfigured", "valid-token"))
27+
28+
@override_settings(
29+
APP_API_TOKENS={
30+
"ietf.api.foo": ["valid-token"],
31+
"ietf.api.bar": ["another-token"],
32+
"ietf.api.misconfigured": "valid-token", # misconfigured
33+
}
34+
)
35+
def test_requires_api_token(self):
36+
@requires_api_token("ietf.api.foo")
37+
def protected_function(request):
38+
return f"Access granted: {request.method}"
39+
40+
# request with a valid token
41+
request = RequestFactory().get(
42+
"/some/url", headers={"X_API_KEY": "valid-token"}
43+
)
44+
result = protected_function(request)
45+
self.assertEqual(result, "Access granted: GET")
46+
47+
# request with an invalid token
48+
request = RequestFactory().get(
49+
"/some/url", headers={"X_API_KEY": "invalid-token"}
50+
)
51+
result = protected_function(request)
52+
self.assertEqual(result.status_code, 403)
53+
54+
# request without a token
55+
request = RequestFactory().get("/some/url", headers={"X_API_KEY": ""})
56+
result = protected_function(request)
57+
self.assertEqual(result.status_code, 403)
58+
59+
# request without a X_API_KEY token
60+
request = RequestFactory().get("/some/url")
61+
result = protected_function(request)
62+
self.assertEqual(result.status_code, 403)
63+
64+
# request with a valid token for another API endpoint
65+
request = RequestFactory().get(
66+
"/some/url", headers={"X_API_KEY": "another-token"}
67+
)
68+
result = protected_function(request)
69+
self.assertEqual(result.status_code, 403)
70+
71+
# requests for a misconfigured endpoint
72+
@requires_api_token("ietf.api.misconfigured")
73+
def another_protected_function(request):
74+
return f"Access granted: {request.method}"
75+
76+
# request with valid token
77+
request = RequestFactory().get(
78+
"/some/url", headers={"X_API_KEY": "valid-token"}
79+
)
80+
result = another_protected_function(request)
81+
self.assertEqual(result, "Access granted: GET")
82+
83+
# request with invalid token with the correct initial character
84+
request = RequestFactory().get("/some/url", headers={"X_API_KEY": "v"})
85+
result = another_protected_function(request)
86+
self.assertEqual(result.status_code, 403)

0 commit comments

Comments
 (0)