Skip to content

Commit e3b7bba

Browse files
committed
Add token authentication tests
1 parent a38a880 commit e3b7bba

File tree

1 file changed

+66
-1
lines changed

1 file changed

+66
-1
lines changed

netbox/netbox/tests/test_authentication.py

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import datetime
2+
13
from django.conf import settings
24
from django.contrib.auth.models import Group, User
35
from django.contrib.contenttypes.models import ContentType
@@ -8,10 +10,73 @@
810
from rest_framework.test import APIClient
911

1012
from dcim.models import Site
11-
from ipam.choices import PrefixStatusChoices
1213
from ipam.models import Prefix
1314
from users.models import ObjectPermission, Token
1415
from utilities.testing import TestCase
16+
from utilities.testing.api import APITestCase
17+
18+
19+
class TokenAuthenticationTestCase(APITestCase):
20+
21+
@override_settings(LOGIN_REQUIRED=True, EXEMPT_VIEW_PERMISSIONS=['*'])
22+
def test_token_authentication(self):
23+
url = reverse('dcim-api:site-list')
24+
25+
# Request without a token should return a 403
26+
response = self.client.get(url)
27+
self.assertEqual(response.status_code, 403)
28+
29+
# Valid token should return a 200
30+
token = Token.objects.create(user=self.user)
31+
response = self.client.get(url, HTTP_AUTHORIZATION=f'Token {token.key}')
32+
self.assertEqual(response.status_code, 200)
33+
34+
@override_settings(LOGIN_REQUIRED=True, EXEMPT_VIEW_PERMISSIONS=['*'])
35+
def test_token_expiration(self):
36+
url = reverse('dcim-api:site-list')
37+
38+
# Request without a non-expired token should succeed
39+
token = Token.objects.create(user=self.user)
40+
response = self.client.get(url, HTTP_AUTHORIZATION=f'Token {token.key}')
41+
self.assertEqual(response.status_code, 200)
42+
43+
# Request with an expired token should fail
44+
token.expires = datetime.datetime(2020, 1, 1, tzinfo=datetime.timezone.utc)
45+
token.save()
46+
response = self.client.get(url, HTTP_AUTHORIZATION=f'Token {token.key}')
47+
self.assertEqual(response.status_code, 403)
48+
49+
@override_settings(LOGIN_REQUIRED=True, EXEMPT_VIEW_PERMISSIONS=['*'])
50+
def test_token_write_enabled(self):
51+
url = reverse('dcim-api:site-list')
52+
data = {
53+
'name': 'Site 1',
54+
'slug': 'site-1',
55+
}
56+
57+
# Request with a write-disabled token should fail
58+
token = Token.objects.create(user=self.user, write_enabled=False)
59+
response = self.client.post(url, data, format='json', HTTP_AUTHORIZATION=f'Token {token.key}')
60+
self.assertEqual(response.status_code, 403)
61+
62+
# Request with a write-enabled token should succeed
63+
token.write_enabled = True
64+
token.save()
65+
response = self.client.post(url, data, format='json', HTTP_AUTHORIZATION=f'Token {token.key}')
66+
self.assertEqual(response.status_code, 403)
67+
68+
@override_settings(LOGIN_REQUIRED=True, EXEMPT_VIEW_PERMISSIONS=['*'])
69+
def test_token_allowed_ips(self):
70+
url = reverse('dcim-api:site-list')
71+
72+
# Request from a non-allowed client IP should fail
73+
token = Token.objects.create(user=self.user, allowed_ips=['192.0.2.0/24'])
74+
response = self.client.get(url, HTTP_AUTHORIZATION=f'Token {token.key}', REMOTE_ADDR='127.0.0.1')
75+
self.assertEqual(response.status_code, 403)
76+
77+
# Request with an expired token should fail
78+
response = self.client.get(url, HTTP_AUTHORIZATION=f'Token {token.key}', REMOTE_ADDR='192.0.2.1')
79+
self.assertEqual(response.status_code, 200)
1580

1681

1782
class ExternalAuthenticationTestCase(TestCase):

0 commit comments

Comments
 (0)