test_basic.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. from asgiref.sync import sync_to_async
  2. from django.conf import settings
  3. from django.contrib.auth import aget_user, get_user, get_user_model
  4. from django.contrib.auth.models import AnonymousUser, User
  5. from django.core.exceptions import ImproperlyConfigured
  6. from django.db import IntegrityError
  7. from django.http import HttpRequest
  8. from django.test import TestCase, override_settings
  9. from django.utils import translation
  10. from .models import CustomUser
  11. class BasicTestCase(TestCase):
  12. def test_user(self):
  13. "Users can be created and can set their password"
  14. u = User.objects.create_user("testuser", "test@example.com", "testpw")
  15. self.assertTrue(u.has_usable_password())
  16. self.assertFalse(u.check_password("bad"))
  17. self.assertTrue(u.check_password("testpw"))
  18. # Check we can manually set an unusable password
  19. u.set_unusable_password()
  20. u.save()
  21. self.assertFalse(u.check_password("testpw"))
  22. self.assertFalse(u.has_usable_password())
  23. u.set_password("testpw")
  24. self.assertTrue(u.check_password("testpw"))
  25. u.set_password(None)
  26. self.assertFalse(u.has_usable_password())
  27. # Check username getter
  28. self.assertEqual(u.get_username(), "testuser")
  29. # Check authentication/permissions
  30. self.assertFalse(u.is_anonymous)
  31. self.assertTrue(u.is_authenticated)
  32. self.assertFalse(u.is_staff)
  33. self.assertTrue(u.is_active)
  34. self.assertFalse(u.is_superuser)
  35. # Check API-based user creation with no password
  36. u2 = User.objects.create_user("testuser2", "test2@example.com")
  37. self.assertFalse(u2.has_usable_password())
  38. def test_unicode_username(self):
  39. User.objects.create_user("jörg")
  40. User.objects.create_user("Григорий")
  41. # Two equivalent Unicode normalized usernames are duplicates.
  42. omega_username = "iamtheΩ" # U+03A9 GREEK CAPITAL LETTER OMEGA
  43. ohm_username = "iamtheΩ" # U+2126 OHM SIGN
  44. User.objects.create_user(ohm_username)
  45. with self.assertRaises(IntegrityError):
  46. User.objects.create_user(omega_username)
  47. def test_user_no_email(self):
  48. "Users can be created without an email"
  49. cases = [
  50. {},
  51. {"email": ""},
  52. {"email": None},
  53. ]
  54. for i, kwargs in enumerate(cases):
  55. with self.subTest(**kwargs):
  56. u = User.objects.create_user("testuser{}".format(i), **kwargs)
  57. self.assertEqual(u.email, "")
  58. def test_superuser(self):
  59. "Check the creation and properties of a superuser"
  60. super = User.objects.create_superuser("super", "super@example.com", "super")
  61. self.assertTrue(super.is_superuser)
  62. self.assertTrue(super.is_active)
  63. self.assertTrue(super.is_staff)
  64. def test_superuser_no_email_or_password(self):
  65. cases = [
  66. {},
  67. {"email": ""},
  68. {"email": None},
  69. {"password": None},
  70. ]
  71. for i, kwargs in enumerate(cases):
  72. with self.subTest(**kwargs):
  73. superuser = User.objects.create_superuser("super{}".format(i), **kwargs)
  74. self.assertEqual(superuser.email, "")
  75. self.assertFalse(superuser.has_usable_password())
  76. def test_get_user_model(self):
  77. "The current user model can be retrieved"
  78. self.assertEqual(get_user_model(), User)
  79. @override_settings(AUTH_USER_MODEL="auth_tests.CustomUser")
  80. def test_swappable_user(self):
  81. "The current user model can be swapped out for another"
  82. self.assertEqual(get_user_model(), CustomUser)
  83. with self.assertRaises(AttributeError):
  84. User.objects.all()
  85. @override_settings(AUTH_USER_MODEL="badsetting")
  86. def test_swappable_user_bad_setting(self):
  87. "The alternate user setting must point to something in the format app.model"
  88. msg = "AUTH_USER_MODEL must be of the form 'app_label.model_name'"
  89. with self.assertRaisesMessage(ImproperlyConfigured, msg):
  90. get_user_model()
  91. @override_settings(AUTH_USER_MODEL="thismodel.doesntexist")
  92. def test_swappable_user_nonexistent_model(self):
  93. "The current user model must point to an installed model"
  94. msg = (
  95. "AUTH_USER_MODEL refers to model 'thismodel.doesntexist' "
  96. "that has not been installed"
  97. )
  98. with self.assertRaisesMessage(ImproperlyConfigured, msg):
  99. get_user_model()
  100. def test_user_verbose_names_translatable(self):
  101. "Default User model verbose names are translatable (#19945)"
  102. with translation.override("en"):
  103. self.assertEqual(User._meta.verbose_name, "user")
  104. self.assertEqual(User._meta.verbose_name_plural, "users")
  105. with translation.override("es"):
  106. self.assertEqual(User._meta.verbose_name, "usuario")
  107. self.assertEqual(User._meta.verbose_name_plural, "usuarios")
  108. class TestGetUser(TestCase):
  109. def test_get_user_anonymous(self):
  110. request = HttpRequest()
  111. request.session = self.client.session
  112. user = get_user(request)
  113. self.assertIsInstance(user, AnonymousUser)
  114. async def test_aget_user_anonymous(self):
  115. request = HttpRequest()
  116. request.session = await self.client.asession()
  117. user = await aget_user(request)
  118. self.assertIsInstance(user, AnonymousUser)
  119. def test_get_user(self):
  120. created_user = User.objects.create_user(
  121. "testuser", "test@example.com", "testpw"
  122. )
  123. self.client.login(username="testuser", password="testpw")
  124. request = HttpRequest()
  125. request.session = self.client.session
  126. user = get_user(request)
  127. self.assertIsInstance(user, User)
  128. self.assertEqual(user.username, created_user.username)
  129. def test_get_user_fallback_secret(self):
  130. created_user = User.objects.create_user(
  131. "testuser", "test@example.com", "testpw"
  132. )
  133. self.client.login(username="testuser", password="testpw")
  134. request = HttpRequest()
  135. request.session = self.client.session
  136. prev_session_key = request.session.session_key
  137. with override_settings(
  138. SECRET_KEY="newsecret",
  139. SECRET_KEY_FALLBACKS=[settings.SECRET_KEY],
  140. ):
  141. user = get_user(request)
  142. self.assertIsInstance(user, User)
  143. self.assertEqual(user.username, created_user.username)
  144. self.assertNotEqual(request.session.session_key, prev_session_key)
  145. # Remove the fallback secret.
  146. # The session hash should be updated using the current secret.
  147. with override_settings(SECRET_KEY="newsecret"):
  148. user = get_user(request)
  149. self.assertIsInstance(user, User)
  150. self.assertEqual(user.username, created_user.username)
  151. async def test_aget_user(self):
  152. created_user = await sync_to_async(User.objects.create_user)(
  153. "testuser", "test@example.com", "testpw"
  154. )
  155. await self.client.alogin(username="testuser", password="testpw")
  156. request = HttpRequest()
  157. request.session = await self.client.asession()
  158. user = await aget_user(request)
  159. self.assertIsInstance(user, User)
  160. self.assertEqual(user.username, created_user.username)