test_models.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. from unittest import mock
  2. from django.conf.global_settings import PASSWORD_HASHERS
  3. from django.contrib.auth import get_user_model
  4. from django.contrib.auth.base_user import AbstractBaseUser
  5. from django.contrib.auth.hashers import get_hasher
  6. from django.contrib.auth.models import (
  7. AbstractUser, Group, Permission, User, UserManager,
  8. )
  9. from django.contrib.contenttypes.models import ContentType
  10. from django.core import mail
  11. from django.db.models.signals import post_save
  12. from django.test import TestCase, override_settings
  13. from .models.with_custom_email_field import CustomEmailField
  14. class NaturalKeysTestCase(TestCase):
  15. def test_user_natural_key(self):
  16. staff_user = User.objects.create_user(username='staff')
  17. self.assertEqual(User.objects.get_by_natural_key('staff'), staff_user)
  18. self.assertEqual(staff_user.natural_key(), ('staff',))
  19. def test_group_natural_key(self):
  20. users_group = Group.objects.create(name='users')
  21. self.assertEqual(Group.objects.get_by_natural_key('users'), users_group)
  22. class LoadDataWithoutNaturalKeysTestCase(TestCase):
  23. fixtures = ['regular.json']
  24. def test_user_is_created_and_added_to_group(self):
  25. user = User.objects.get(username='my_username')
  26. group = Group.objects.get(name='my_group')
  27. self.assertEqual(group, user.groups.get())
  28. class LoadDataWithNaturalKeysTestCase(TestCase):
  29. fixtures = ['natural.json']
  30. def test_user_is_created_and_added_to_group(self):
  31. user = User.objects.get(username='my_username')
  32. group = Group.objects.get(name='my_group')
  33. self.assertEqual(group, user.groups.get())
  34. class LoadDataWithNaturalKeysAndMultipleDatabasesTestCase(TestCase):
  35. multi_db = True
  36. def test_load_data_with_user_permissions(self):
  37. # Create test contenttypes for both databases
  38. default_objects = [
  39. ContentType.objects.db_manager('default').create(
  40. model='examplemodela',
  41. app_label='app_a',
  42. ),
  43. ContentType.objects.db_manager('default').create(
  44. model='examplemodelb',
  45. app_label='app_b',
  46. ),
  47. ]
  48. other_objects = [
  49. ContentType.objects.db_manager('other').create(
  50. model='examplemodelb',
  51. app_label='app_b',
  52. ),
  53. ContentType.objects.db_manager('other').create(
  54. model='examplemodela',
  55. app_label='app_a',
  56. ),
  57. ]
  58. # Now we create the test UserPermission
  59. Permission.objects.db_manager("default").create(
  60. name="Can delete example model b",
  61. codename="delete_examplemodelb",
  62. content_type=default_objects[1],
  63. )
  64. Permission.objects.db_manager("other").create(
  65. name="Can delete example model b",
  66. codename="delete_examplemodelb",
  67. content_type=other_objects[0],
  68. )
  69. perm_default = Permission.objects.get_by_natural_key(
  70. 'delete_examplemodelb',
  71. 'app_b',
  72. 'examplemodelb',
  73. )
  74. perm_other = Permission.objects.db_manager('other').get_by_natural_key(
  75. 'delete_examplemodelb',
  76. 'app_b',
  77. 'examplemodelb',
  78. )
  79. self.assertEqual(perm_default.content_type_id, default_objects[1].id)
  80. self.assertEqual(perm_other.content_type_id, other_objects[0].id)
  81. class UserManagerTestCase(TestCase):
  82. def test_create_user(self):
  83. email_lowercase = 'normal@normal.com'
  84. user = User.objects.create_user('user', email_lowercase)
  85. self.assertEqual(user.email, email_lowercase)
  86. self.assertEqual(user.username, 'user')
  87. self.assertFalse(user.has_usable_password())
  88. def test_create_user_email_domain_normalize_rfc3696(self):
  89. # According to http://tools.ietf.org/html/rfc3696#section-3
  90. # the "@" symbol can be part of the local part of an email address
  91. returned = UserManager.normalize_email(r'Abc\@DEF@EXAMPLE.com')
  92. self.assertEqual(returned, r'Abc\@DEF@example.com')
  93. def test_create_user_email_domain_normalize(self):
  94. returned = UserManager.normalize_email('normal@DOMAIN.COM')
  95. self.assertEqual(returned, 'normal@domain.com')
  96. def test_create_user_email_domain_normalize_with_whitespace(self):
  97. returned = UserManager.normalize_email(r'email\ with_whitespace@D.COM')
  98. self.assertEqual(returned, r'email\ with_whitespace@d.com')
  99. def test_empty_username(self):
  100. with self.assertRaisesMessage(ValueError, 'The given username must be set'):
  101. User.objects.create_user(username='')
  102. def test_create_user_is_staff(self):
  103. email = 'normal@normal.com'
  104. user = User.objects.create_user('user', email, is_staff=True)
  105. self.assertEqual(user.email, email)
  106. self.assertEqual(user.username, 'user')
  107. self.assertTrue(user.is_staff)
  108. def test_create_super_user_raises_error_on_false_is_superuser(self):
  109. with self.assertRaisesMessage(ValueError, 'Superuser must have is_superuser=True.'):
  110. User.objects.create_superuser(
  111. username='test', email='test@test.com',
  112. password='test', is_superuser=False,
  113. )
  114. def test_create_superuser_raises_error_on_false_is_staff(self):
  115. with self.assertRaisesMessage(ValueError, 'Superuser must have is_staff=True.'):
  116. User.objects.create_superuser(
  117. username='test', email='test@test.com',
  118. password='test', is_staff=False,
  119. )
  120. class AbstractBaseUserTests(TestCase):
  121. def test_clean_normalize_username(self):
  122. # The normalization happens in AbstractBaseUser.clean()
  123. ohm_username = 'iamtheΩ' # U+2126 OHM SIGN
  124. for model in ('auth.User', 'auth_tests.CustomUser'):
  125. with self.settings(AUTH_USER_MODEL=model):
  126. User = get_user_model()
  127. user = User(**{User.USERNAME_FIELD: ohm_username, 'password': 'foo'})
  128. user.clean()
  129. username = user.get_username()
  130. self.assertNotEqual(username, ohm_username)
  131. self.assertEqual(username, 'iamtheΩ') # U+03A9 GREEK CAPITAL LETTER OMEGA
  132. def test_default_email(self):
  133. user = AbstractBaseUser()
  134. self.assertEqual(user.get_email_field_name(), 'email')
  135. def test_custom_email(self):
  136. user = CustomEmailField()
  137. self.assertEqual(user.get_email_field_name(), 'email_address')
  138. class AbstractUserTestCase(TestCase):
  139. def test_email_user(self):
  140. # valid send_mail parameters
  141. kwargs = {
  142. "fail_silently": False,
  143. "auth_user": None,
  144. "auth_password": None,
  145. "connection": None,
  146. "html_message": None,
  147. }
  148. abstract_user = AbstractUser(email='foo@bar.com')
  149. abstract_user.email_user(
  150. subject="Subject here",
  151. message="This is a message",
  152. from_email="from@domain.com",
  153. **kwargs
  154. )
  155. self.assertEqual(len(mail.outbox), 1)
  156. message = mail.outbox[0]
  157. self.assertEqual(message.subject, "Subject here")
  158. self.assertEqual(message.body, "This is a message")
  159. self.assertEqual(message.from_email, "from@domain.com")
  160. self.assertEqual(message.to, [abstract_user.email])
  161. def test_last_login_default(self):
  162. user1 = User.objects.create(username='user1')
  163. self.assertIsNone(user1.last_login)
  164. user2 = User.objects.create_user(username='user2')
  165. self.assertIsNone(user2.last_login)
  166. def test_user_clean_normalize_email(self):
  167. user = User(username='user', password='foo', email='foo@BAR.com')
  168. user.clean()
  169. self.assertEqual(user.email, 'foo@bar.com')
  170. def test_user_double_save(self):
  171. """
  172. Calling user.save() twice should trigger password_changed() once.
  173. """
  174. user = User.objects.create_user(username='user', password='foo')
  175. user.set_password('bar')
  176. with mock.patch('django.contrib.auth.password_validation.password_changed') as pw_changed:
  177. user.save()
  178. self.assertEqual(pw_changed.call_count, 1)
  179. user.save()
  180. self.assertEqual(pw_changed.call_count, 1)
  181. @override_settings(PASSWORD_HASHERS=PASSWORD_HASHERS)
  182. def test_check_password_upgrade(self):
  183. """
  184. password_changed() shouldn't be called if User.check_password()
  185. triggers a hash iteration upgrade.
  186. """
  187. user = User.objects.create_user(username='user', password='foo')
  188. initial_password = user.password
  189. self.assertTrue(user.check_password('foo'))
  190. hasher = get_hasher('default')
  191. self.assertEqual('pbkdf2_sha256', hasher.algorithm)
  192. old_iterations = hasher.iterations
  193. try:
  194. # Upgrade the password iterations
  195. hasher.iterations = old_iterations + 1
  196. with mock.patch('django.contrib.auth.password_validation.password_changed') as pw_changed:
  197. user.check_password('foo')
  198. self.assertEqual(pw_changed.call_count, 0)
  199. self.assertNotEqual(initial_password, user.password)
  200. finally:
  201. hasher.iterations = old_iterations
  202. class IsActiveTestCase(TestCase):
  203. """
  204. Tests the behavior of the guaranteed is_active attribute
  205. """
  206. def test_builtin_user_isactive(self):
  207. user = User.objects.create(username='foo', email='foo@bar.com')
  208. # is_active is true by default
  209. self.assertIs(user.is_active, True)
  210. user.is_active = False
  211. user.save()
  212. user_fetched = User.objects.get(pk=user.pk)
  213. # the is_active flag is saved
  214. self.assertFalse(user_fetched.is_active)
  215. @override_settings(AUTH_USER_MODEL='auth_tests.IsActiveTestUser1')
  216. def test_is_active_field_default(self):
  217. """
  218. tests that the default value for is_active is provided
  219. """
  220. UserModel = get_user_model()
  221. user = UserModel(username='foo')
  222. self.assertIs(user.is_active, True)
  223. # you can set the attribute - but it will not save
  224. user.is_active = False
  225. # there should be no problem saving - but the attribute is not saved
  226. user.save()
  227. user_fetched = UserModel._default_manager.get(pk=user.pk)
  228. # the attribute is always true for newly retrieved instance
  229. self.assertIs(user_fetched.is_active, True)
  230. class TestCreateSuperUserSignals(TestCase):
  231. """
  232. Simple test case for ticket #20541
  233. """
  234. def post_save_listener(self, *args, **kwargs):
  235. self.signals_count += 1
  236. def setUp(self):
  237. self.signals_count = 0
  238. post_save.connect(self.post_save_listener, sender=User)
  239. def tearDown(self):
  240. post_save.disconnect(self.post_save_listener, sender=User)
  241. def test_create_user(self):
  242. User.objects.create_user("JohnDoe")
  243. self.assertEqual(self.signals_count, 1)
  244. def test_create_superuser(self):
  245. User.objects.create_superuser("JohnDoe", "mail@example.com", "1")
  246. self.assertEqual(self.signals_count, 1)