|
5 | 5 | from django.contrib.admin import site
|
6 | 6 | from django.contrib.auth.models import User
|
7 | 7 | from django.core.management import CommandError, call_command
|
| 8 | +from django.db import IntegrityError |
8 | 9 | from django.test import TestCase, modify_settings
|
9 | 10 |
|
10 | 11 | from rest_framework.authtoken.admin import TokenAdmin
|
@@ -48,6 +49,45 @@ def test_whitespace_in_password(self):
|
48 | 49 | self.user.save()
|
49 | 50 | assert AuthTokenSerializer(data=data).is_valid()
|
50 | 51 |
|
| 52 | + def test_token_creation_collision_raises_integrity_error(self): |
| 53 | + user2 = User.objects.create_user('user2', 'user2@example.com', 'p') |
| 54 | + existing_token = Token.objects.create(user=user2) |
| 55 | + |
| 56 | + # Try to create another token with the same key |
| 57 | + with self.assertRaises(IntegrityError): |
| 58 | + Token.objects.create(key=existing_token.key, user=self.user) |
| 59 | + |
| 60 | + def test_key_generated_on_save_when_cleared(self): |
| 61 | + # Create a new user for this test to avoid conflicts with setUp token |
| 62 | + user2 = User.objects.create_user('test_user2', 'test2@example.com', 'password') |
| 63 | + |
| 64 | + # Create a token without a key - it should generate one automatically |
| 65 | + token = Token(user=user2) |
| 66 | + token.key = "" # Explicitly clear the key |
| 67 | + token.save() |
| 68 | + |
| 69 | + # Verify the key was generated |
| 70 | + self.assertEqual(len(token.key), 40) |
| 71 | + self.assertEqual(token.user, user2) |
| 72 | + |
| 73 | + def test_clearing_key_on_existing_token_raises_integrity_error(self): |
| 74 | + """Test that clearing the key on an existing token raises IntegrityError.""" |
| 75 | + user = User.objects.create_user('test_user3', 'test3@example.com', 'password') |
| 76 | + token = Token.objects.create(user=user) |
| 77 | + token.key = "" |
| 78 | + |
| 79 | + # This should raise IntegrityError because: |
| 80 | + # 1. We're trying to update a record with an empty primary key |
| 81 | + # 2. The OneToOneField constraint would be violated |
| 82 | + with self.assertRaises(Exception): # Could be IntegrityError or DatabaseError |
| 83 | + token.save() |
| 84 | + |
| 85 | + def test_saving_existing_token_without_changes_does_not_alter_key(self): |
| 86 | + original_key = self.token.key |
| 87 | + |
| 88 | + self.token.save() |
| 89 | + self.assertEqual(self.token.key, original_key) |
| 90 | + |
51 | 91 |
|
52 | 92 | class AuthTokenCommandTests(TestCase):
|
53 | 93 |
|
|
0 commit comments