@@ -81,6 +81,7 @@ def put(self, request):
81
81
@override_settings (ROOT_URLCONF = __name__ )
82
82
class BasicAuthTests (TestCase ):
83
83
"""Basic authentication"""
84
+
84
85
def setUp (self ):
85
86
self .csrf_client = APIClient (enforce_csrf_checks = True )
86
87
self .username = 'john'
@@ -198,6 +199,7 @@ def test_decoding_of_utf8_credentials(self):
198
199
@override_settings (ROOT_URLCONF = __name__ )
199
200
class SessionAuthTests (TestCase ):
200
201
"""User session authentication"""
202
+
201
203
def setUp (self ):
202
204
self .csrf_client = APIClient (enforce_csrf_checks = True )
203
205
self .non_csrf_client = APIClient (enforce_csrf_checks = False )
@@ -418,6 +420,41 @@ def test_generate_key_accessible_as_classmethod(self):
418
420
key = self .model .generate_key ()
419
421
assert isinstance (key , str )
420
422
423
+ def test_generate_key_returns_valid_format (self ):
424
+ """Ensure generate_key returns a valid token format"""
425
+ key = self .model .generate_key ()
426
+ assert len (key ) == 40
427
+ # Should contain only valid hexadecimal characters
428
+ assert all (c in '0123456789abcdef' for c in key )
429
+
430
+ def test_generate_key_produces_unique_values (self ):
431
+ """Ensure generate_key produces unique values across multiple calls"""
432
+ keys = set ()
433
+ for _ in range (100 ):
434
+ key = self .model .generate_key ()
435
+ assert key not in keys , f"Duplicate key generated: { key } "
436
+ keys .add (key )
437
+
438
+ def test_generate_key_collision_resistance (self ):
439
+ """Test collision resistance with reasonable sample size"""
440
+ keys = set ()
441
+ for _ in range (500 ):
442
+ key = self .model .generate_key ()
443
+ assert key not in keys , f"Collision found: { key } "
444
+ keys .add (key )
445
+ assert len (keys ) == 500 , f"Expected 500 unique keys, got { len (keys )} "
446
+
447
+ def test_generate_key_randomness_quality (self ):
448
+ """Test basic randomness properties of generated keys"""
449
+ keys = [self .model .generate_key () for _ in range (10 )]
450
+ # Consecutive keys should be different
451
+ for i in range (len (keys ) - 1 ):
452
+ assert keys [i ] != keys [i + 1 ], "Consecutive keys should be different"
453
+ # Keys should not follow obvious patterns
454
+ for key in keys :
455
+ # Should not be all same character
456
+ assert not all (c == key [0 ] for c in key ), f"Key has all same characters: { key } "
457
+
421
458
def test_token_login_json (self ):
422
459
"""Ensure token login view using JSON POST works."""
423
460
client = APIClient (enforce_csrf_checks = True )
@@ -480,6 +517,7 @@ def test_incorrect_credentials(self):
480
517
authentication should run and error, even if no permissions
481
518
are set on the view.
482
519
"""
520
+
483
521
class IncorrectCredentialsAuth (BaseAuthentication ):
484
522
def authenticate (self , request ):
485
523
raise exceptions .AuthenticationFailed ('Bad credentials' )
@@ -571,6 +609,7 @@ def test_basic_authentication_raises_error_if_user_not_active(self):
571
609
572
610
class MockUser :
573
611
is_active = False
612
+
574
613
old_authenticate = authentication .authenticate
575
614
authentication .authenticate = lambda ** kwargs : MockUser ()
576
615
try :
0 commit comments