1. from unittest import mock
    
  2. 
    
  3. from django.conf.global_settings import PASSWORD_HASHERS
    
  4. from django.contrib.auth import get_user_model
    
  5. from django.contrib.auth.backends import ModelBackend
    
  6. from django.contrib.auth.base_user import AbstractBaseUser
    
  7. from django.contrib.auth.hashers import get_hasher
    
  8. from django.contrib.auth.models import (
    
  9.     AnonymousUser,
    
  10.     Group,
    
  11.     Permission,
    
  12.     User,
    
  13.     UserManager,
    
  14. )
    
  15. from django.contrib.contenttypes.models import ContentType
    
  16. from django.core import mail
    
  17. from django.db import connection, migrations
    
  18. from django.db.migrations.state import ModelState, ProjectState
    
  19. from django.db.models.signals import post_save
    
  20. from django.test import SimpleTestCase, TestCase, TransactionTestCase, override_settings
    
  21. 
    
  22. from .models import CustomEmailField, IntegerUsernameUser
    
  23. 
    
  24. 
    
  25. class NaturalKeysTestCase(TestCase):
    
  26.     def test_user_natural_key(self):
    
  27.         staff_user = User.objects.create_user(username="staff")
    
  28.         self.assertEqual(User.objects.get_by_natural_key("staff"), staff_user)
    
  29.         self.assertEqual(staff_user.natural_key(), ("staff",))
    
  30. 
    
  31.     def test_group_natural_key(self):
    
  32.         users_group = Group.objects.create(name="users")
    
  33.         self.assertEqual(Group.objects.get_by_natural_key("users"), users_group)
    
  34. 
    
  35. 
    
  36. class LoadDataWithoutNaturalKeysTestCase(TestCase):
    
  37.     fixtures = ["regular.json"]
    
  38. 
    
  39.     def test_user_is_created_and_added_to_group(self):
    
  40.         user = User.objects.get(username="my_username")
    
  41.         group = Group.objects.get(name="my_group")
    
  42.         self.assertEqual(group, user.groups.get())
    
  43. 
    
  44. 
    
  45. class LoadDataWithNaturalKeysTestCase(TestCase):
    
  46.     fixtures = ["natural.json"]
    
  47. 
    
  48.     def test_user_is_created_and_added_to_group(self):
    
  49.         user = User.objects.get(username="my_username")
    
  50.         group = Group.objects.get(name="my_group")
    
  51.         self.assertEqual(group, user.groups.get())
    
  52. 
    
  53. 
    
  54. class LoadDataWithNaturalKeysAndMultipleDatabasesTestCase(TestCase):
    
  55.     databases = {"default", "other"}
    
  56. 
    
  57.     def test_load_data_with_user_permissions(self):
    
  58.         # Create test contenttypes for both databases
    
  59.         default_objects = [
    
  60.             ContentType.objects.db_manager("default").create(
    
  61.                 model="examplemodela",
    
  62.                 app_label="app_a",
    
  63.             ),
    
  64.             ContentType.objects.db_manager("default").create(
    
  65.                 model="examplemodelb",
    
  66.                 app_label="app_b",
    
  67.             ),
    
  68.         ]
    
  69.         other_objects = [
    
  70.             ContentType.objects.db_manager("other").create(
    
  71.                 model="examplemodelb",
    
  72.                 app_label="app_b",
    
  73.             ),
    
  74.             ContentType.objects.db_manager("other").create(
    
  75.                 model="examplemodela",
    
  76.                 app_label="app_a",
    
  77.             ),
    
  78.         ]
    
  79. 
    
  80.         # Now we create the test UserPermission
    
  81.         Permission.objects.db_manager("default").create(
    
  82.             name="Can delete example model b",
    
  83.             codename="delete_examplemodelb",
    
  84.             content_type=default_objects[1],
    
  85.         )
    
  86.         Permission.objects.db_manager("other").create(
    
  87.             name="Can delete example model b",
    
  88.             codename="delete_examplemodelb",
    
  89.             content_type=other_objects[0],
    
  90.         )
    
  91. 
    
  92.         perm_default = Permission.objects.get_by_natural_key(
    
  93.             "delete_examplemodelb",
    
  94.             "app_b",
    
  95.             "examplemodelb",
    
  96.         )
    
  97. 
    
  98.         perm_other = Permission.objects.db_manager("other").get_by_natural_key(
    
  99.             "delete_examplemodelb",
    
  100.             "app_b",
    
  101.             "examplemodelb",
    
  102.         )
    
  103. 
    
  104.         self.assertEqual(perm_default.content_type_id, default_objects[1].id)
    
  105.         self.assertEqual(perm_other.content_type_id, other_objects[0].id)
    
  106. 
    
  107. 
    
  108. class UserManagerTestCase(TransactionTestCase):
    
  109.     available_apps = [
    
  110.         "auth_tests",
    
  111.         "django.contrib.auth",
    
  112.         "django.contrib.contenttypes",
    
  113.     ]
    
  114. 
    
  115.     def test_create_user(self):
    
  116.         email_lowercase = "[email protected]"
    
  117.         user = User.objects.create_user("user", email_lowercase)
    
  118.         self.assertEqual(user.email, email_lowercase)
    
  119.         self.assertEqual(user.username, "user")
    
  120.         self.assertFalse(user.has_usable_password())
    
  121. 
    
  122.     def test_create_user_email_domain_normalize_rfc3696(self):
    
  123.         # According to https://tools.ietf.org/html/rfc3696#section-3
    
  124.         # the "@" symbol can be part of the local part of an email address
    
  125.         returned = UserManager.normalize_email(r"Abc\@DEF@EXAMPLE.com")
    
  126.         self.assertEqual(returned, r"Abc\@DEF@example.com")
    
  127. 
    
  128.     def test_create_user_email_domain_normalize(self):
    
  129.         returned = UserManager.normalize_email("[email protected]")
    
  130.         self.assertEqual(returned, "[email protected]")
    
  131. 
    
  132.     def test_create_user_email_domain_normalize_with_whitespace(self):
    
  133.         returned = UserManager.normalize_email(r"email\ with_whitespace@D.COM")
    
  134.         self.assertEqual(returned, r"email\ with_whitespace@d.com")
    
  135. 
    
  136.     def test_empty_username(self):
    
  137.         with self.assertRaisesMessage(ValueError, "The given username must be set"):
    
  138.             User.objects.create_user(username="")
    
  139. 
    
  140.     def test_create_user_is_staff(self):
    
  141.         email = "[email protected]"
    
  142.         user = User.objects.create_user("user", email, is_staff=True)
    
  143.         self.assertEqual(user.email, email)
    
  144.         self.assertEqual(user.username, "user")
    
  145.         self.assertTrue(user.is_staff)
    
  146. 
    
  147.     def test_create_super_user_raises_error_on_false_is_superuser(self):
    
  148.         with self.assertRaisesMessage(
    
  149.             ValueError, "Superuser must have is_superuser=True."
    
  150.         ):
    
  151.             User.objects.create_superuser(
    
  152.                 username="test",
    
  153.                 email="[email protected]",
    
  154.                 password="test",
    
  155.                 is_superuser=False,
    
  156.             )
    
  157. 
    
  158.     def test_create_superuser_raises_error_on_false_is_staff(self):
    
  159.         with self.assertRaisesMessage(ValueError, "Superuser must have is_staff=True."):
    
  160.             User.objects.create_superuser(
    
  161.                 username="test",
    
  162.                 email="[email protected]",
    
  163.                 password="test",
    
  164.                 is_staff=False,
    
  165.             )
    
  166. 
    
  167.     def test_make_random_password(self):
    
  168.         allowed_chars = "abcdefg"
    
  169.         password = UserManager().make_random_password(5, allowed_chars)
    
  170.         self.assertEqual(len(password), 5)
    
  171.         for char in password:
    
  172.             self.assertIn(char, allowed_chars)
    
  173. 
    
  174.     def test_runpython_manager_methods(self):
    
  175.         def forwards(apps, schema_editor):
    
  176.             UserModel = apps.get_model("auth", "User")
    
  177.             user = UserModel.objects.create_user("user1", password="secure")
    
  178.             self.assertIsInstance(user, UserModel)
    
  179. 
    
  180.         operation = migrations.RunPython(forwards, migrations.RunPython.noop)
    
  181.         project_state = ProjectState()
    
  182.         project_state.add_model(ModelState.from_model(User))
    
  183.         project_state.add_model(ModelState.from_model(Group))
    
  184.         project_state.add_model(ModelState.from_model(Permission))
    
  185.         project_state.add_model(ModelState.from_model(ContentType))
    
  186.         new_state = project_state.clone()
    
  187.         with connection.schema_editor() as editor:
    
  188.             operation.state_forwards("test_manager_methods", new_state)
    
  189.             operation.database_forwards(
    
  190.                 "test_manager_methods",
    
  191.                 editor,
    
  192.                 project_state,
    
  193.                 new_state,
    
  194.             )
    
  195.         user = User.objects.get(username="user1")
    
  196.         self.assertTrue(user.check_password("secure"))
    
  197. 
    
  198. 
    
  199. class AbstractBaseUserTests(SimpleTestCase):
    
  200.     def test_has_usable_password(self):
    
  201.         """
    
  202.         Passwords are usable even if they don't correspond to a hasher in
    
  203.         settings.PASSWORD_HASHERS.
    
  204.         """
    
  205.         self.assertIs(User(password="some-gibbberish").has_usable_password(), True)
    
  206. 
    
  207.     def test_normalize_username(self):
    
  208.         self.assertEqual(IntegerUsernameUser().normalize_username(123), 123)
    
  209. 
    
  210.     def test_clean_normalize_username(self):
    
  211.         # The normalization happens in AbstractBaseUser.clean()
    
  212.         ohm_username = "iamtheΩ"  # U+2126 OHM SIGN
    
  213.         for model in ("auth.User", "auth_tests.CustomUser"):
    
  214.             with self.subTest(model=model), self.settings(AUTH_USER_MODEL=model):
    
  215.                 User = get_user_model()
    
  216.                 user = User(**{User.USERNAME_FIELD: ohm_username, "password": "foo"})
    
  217.                 user.clean()
    
  218.                 username = user.get_username()
    
  219.                 self.assertNotEqual(username, ohm_username)
    
  220.                 self.assertEqual(
    
  221.                     username, "iamtheΩ"
    
  222.                 )  # U+03A9 GREEK CAPITAL LETTER OMEGA
    
  223. 
    
  224.     def test_default_email(self):
    
  225.         self.assertEqual(AbstractBaseUser.get_email_field_name(), "email")
    
  226. 
    
  227.     def test_custom_email(self):
    
  228.         user = CustomEmailField()
    
  229.         self.assertEqual(user.get_email_field_name(), "email_address")
    
  230. 
    
  231. 
    
  232. class AbstractUserTestCase(TestCase):
    
  233.     def test_email_user(self):
    
  234.         # valid send_mail parameters
    
  235.         kwargs = {
    
  236.             "fail_silently": False,
    
  237.             "auth_user": None,
    
  238.             "auth_password": None,
    
  239.             "connection": None,
    
  240.             "html_message": None,
    
  241.         }
    
  242.         user = User(email="[email protected]")
    
  243.         user.email_user(
    
  244.             subject="Subject here",
    
  245.             message="This is a message",
    
  246.             from_email="[email protected]",
    
  247.             **kwargs,
    
  248.         )
    
  249.         self.assertEqual(len(mail.outbox), 1)
    
  250.         message = mail.outbox[0]
    
  251.         self.assertEqual(message.subject, "Subject here")
    
  252.         self.assertEqual(message.body, "This is a message")
    
  253.         self.assertEqual(message.from_email, "[email protected]")
    
  254.         self.assertEqual(message.to, [user.email])
    
  255. 
    
  256.     def test_last_login_default(self):
    
  257.         user1 = User.objects.create(username="user1")
    
  258.         self.assertIsNone(user1.last_login)
    
  259. 
    
  260.         user2 = User.objects.create_user(username="user2")
    
  261.         self.assertIsNone(user2.last_login)
    
  262. 
    
  263.     def test_user_clean_normalize_email(self):
    
  264.         user = User(username="user", password="foo", email="[email protected]")
    
  265.         user.clean()
    
  266.         self.assertEqual(user.email, "[email protected]")
    
  267. 
    
  268.     def test_user_double_save(self):
    
  269.         """
    
  270.         Calling user.save() twice should trigger password_changed() once.
    
  271.         """
    
  272.         user = User.objects.create_user(username="user", password="foo")
    
  273.         user.set_password("bar")
    
  274.         with mock.patch(
    
  275.             "django.contrib.auth.password_validation.password_changed"
    
  276.         ) as pw_changed:
    
  277.             user.save()
    
  278.             self.assertEqual(pw_changed.call_count, 1)
    
  279.             user.save()
    
  280.             self.assertEqual(pw_changed.call_count, 1)
    
  281. 
    
  282.     @override_settings(PASSWORD_HASHERS=PASSWORD_HASHERS)
    
  283.     def test_check_password_upgrade(self):
    
  284.         """
    
  285.         password_changed() shouldn't be called if User.check_password()
    
  286.         triggers a hash iteration upgrade.
    
  287.         """
    
  288.         user = User.objects.create_user(username="user", password="foo")
    
  289.         initial_password = user.password
    
  290.         self.assertTrue(user.check_password("foo"))
    
  291.         hasher = get_hasher("default")
    
  292.         self.assertEqual("pbkdf2_sha256", hasher.algorithm)
    
  293. 
    
  294.         old_iterations = hasher.iterations
    
  295.         try:
    
  296.             # Upgrade the password iterations
    
  297.             hasher.iterations = old_iterations + 1
    
  298.             with mock.patch(
    
  299.                 "django.contrib.auth.password_validation.password_changed"
    
  300.             ) as pw_changed:
    
  301.                 user.check_password("foo")
    
  302.                 self.assertEqual(pw_changed.call_count, 0)
    
  303.             self.assertNotEqual(initial_password, user.password)
    
  304.         finally:
    
  305.             hasher.iterations = old_iterations
    
  306. 
    
  307. 
    
  308. class CustomModelBackend(ModelBackend):
    
  309.     def with_perm(
    
  310.         self, perm, is_active=True, include_superusers=True, backend=None, obj=None
    
  311.     ):
    
  312.         if obj is not None and obj.username == "charliebrown":
    
  313.             return User.objects.filter(pk=obj.pk)
    
  314.         return User.objects.filter(username__startswith="charlie")
    
  315. 
    
  316. 
    
  317. class UserWithPermTestCase(TestCase):
    
  318.     @classmethod
    
  319.     def setUpTestData(cls):
    
  320.         content_type = ContentType.objects.get_for_model(Group)
    
  321.         cls.permission = Permission.objects.create(
    
  322.             name="test",
    
  323.             content_type=content_type,
    
  324.             codename="test",
    
  325.         )
    
  326.         # User with permission.
    
  327.         cls.user1 = User.objects.create_user("user 1", "[email protected]")
    
  328.         cls.user1.user_permissions.add(cls.permission)
    
  329.         # User with group permission.
    
  330.         group1 = Group.objects.create(name="group 1")
    
  331.         group1.permissions.add(cls.permission)
    
  332.         group2 = Group.objects.create(name="group 2")
    
  333.         group2.permissions.add(cls.permission)
    
  334.         cls.user2 = User.objects.create_user("user 2", "[email protected]")
    
  335.         cls.user2.groups.add(group1, group2)
    
  336.         # Users without permissions.
    
  337.         cls.user_charlie = User.objects.create_user("charlie", "[email protected]")
    
  338.         cls.user_charlie_b = User.objects.create_user(
    
  339.             "charliebrown", "[email protected]"
    
  340.         )
    
  341.         # Superuser.
    
  342.         cls.superuser = User.objects.create_superuser(
    
  343.             "superuser",
    
  344.             "[email protected]",
    
  345.             "superpassword",
    
  346.         )
    
  347.         # Inactive user with permission.
    
  348.         cls.inactive_user = User.objects.create_user(
    
  349.             "inactive_user",
    
  350.             "[email protected]",
    
  351.             is_active=False,
    
  352.         )
    
  353.         cls.inactive_user.user_permissions.add(cls.permission)
    
  354. 
    
  355.     def test_invalid_permission_name(self):
    
  356.         msg = "Permission name should be in the form app_label.permission_codename."
    
  357.         for perm in ("nodots", "too.many.dots", "...", ""):
    
  358.             with self.subTest(perm), self.assertRaisesMessage(ValueError, msg):
    
  359.                 User.objects.with_perm(perm)
    
  360. 
    
  361.     def test_invalid_permission_type(self):
    
  362.         msg = "The `perm` argument must be a string or a permission instance."
    
  363.         for perm in (b"auth.test", object(), None):
    
  364.             with self.subTest(perm), self.assertRaisesMessage(TypeError, msg):
    
  365.                 User.objects.with_perm(perm)
    
  366. 
    
  367.     def test_invalid_backend_type(self):
    
  368.         msg = "backend must be a dotted import path string (got %r)."
    
  369.         for backend in (b"auth_tests.CustomModelBackend", object()):
    
  370.             with self.subTest(backend):
    
  371.                 with self.assertRaisesMessage(TypeError, msg % backend):
    
  372.                     User.objects.with_perm("auth.test", backend=backend)
    
  373. 
    
  374.     def test_basic(self):
    
  375.         active_users = [self.user1, self.user2]
    
  376.         tests = [
    
  377.             ({}, [*active_users, self.superuser]),
    
  378.             ({"obj": self.user1}, []),
    
  379.             # Only inactive users.
    
  380.             ({"is_active": False}, [self.inactive_user]),
    
  381.             # All users.
    
  382.             ({"is_active": None}, [*active_users, self.superuser, self.inactive_user]),
    
  383.             # Exclude superusers.
    
  384.             ({"include_superusers": False}, active_users),
    
  385.             (
    
  386.                 {"include_superusers": False, "is_active": False},
    
  387.                 [self.inactive_user],
    
  388.             ),
    
  389.             (
    
  390.                 {"include_superusers": False, "is_active": None},
    
  391.                 [*active_users, self.inactive_user],
    
  392.             ),
    
  393.         ]
    
  394.         for kwargs, expected_users in tests:
    
  395.             for perm in ("auth.test", self.permission):
    
  396.                 with self.subTest(perm=perm, **kwargs):
    
  397.                     self.assertCountEqual(
    
  398.                         User.objects.with_perm(perm, **kwargs),
    
  399.                         expected_users,
    
  400.                     )
    
  401. 
    
  402.     @override_settings(
    
  403.         AUTHENTICATION_BACKENDS=["django.contrib.auth.backends.BaseBackend"]
    
  404.     )
    
  405.     def test_backend_without_with_perm(self):
    
  406.         self.assertSequenceEqual(User.objects.with_perm("auth.test"), [])
    
  407. 
    
  408.     def test_nonexistent_permission(self):
    
  409.         self.assertSequenceEqual(User.objects.with_perm("auth.perm"), [self.superuser])
    
  410. 
    
  411.     def test_nonexistent_backend(self):
    
  412.         with self.assertRaises(ImportError):
    
  413.             User.objects.with_perm(
    
  414.                 "auth.test",
    
  415.                 backend="invalid.backend.CustomModelBackend",
    
  416.             )
    
  417. 
    
  418.     @override_settings(
    
  419.         AUTHENTICATION_BACKENDS=["auth_tests.test_models.CustomModelBackend"]
    
  420.     )
    
  421.     def test_custom_backend(self):
    
  422.         for perm in ("auth.test", self.permission):
    
  423.             with self.subTest(perm):
    
  424.                 self.assertCountEqual(
    
  425.                     User.objects.with_perm(perm),
    
  426.                     [self.user_charlie, self.user_charlie_b],
    
  427.                 )
    
  428. 
    
  429.     @override_settings(
    
  430.         AUTHENTICATION_BACKENDS=["auth_tests.test_models.CustomModelBackend"]
    
  431.     )
    
  432.     def test_custom_backend_pass_obj(self):
    
  433.         for perm in ("auth.test", self.permission):
    
  434.             with self.subTest(perm):
    
  435.                 self.assertSequenceEqual(
    
  436.                     User.objects.with_perm(perm, obj=self.user_charlie_b),
    
  437.                     [self.user_charlie_b],
    
  438.                 )
    
  439. 
    
  440.     @override_settings(
    
  441.         AUTHENTICATION_BACKENDS=[
    
  442.             "auth_tests.test_models.CustomModelBackend",
    
  443.             "django.contrib.auth.backends.ModelBackend",
    
  444.         ]
    
  445.     )
    
  446.     def test_multiple_backends(self):
    
  447.         msg = (
    
  448.             "You have multiple authentication backends configured and "
    
  449.             "therefore must provide the `backend` argument."
    
  450.         )
    
  451.         with self.assertRaisesMessage(ValueError, msg):
    
  452.             User.objects.with_perm("auth.test")
    
  453. 
    
  454.         backend = "auth_tests.test_models.CustomModelBackend"
    
  455.         self.assertCountEqual(
    
  456.             User.objects.with_perm("auth.test", backend=backend),
    
  457.             [self.user_charlie, self.user_charlie_b],
    
  458.         )
    
  459. 
    
  460. 
    
  461. class IsActiveTestCase(TestCase):
    
  462.     """
    
  463.     Tests the behavior of the guaranteed is_active attribute
    
  464.     """
    
  465. 
    
  466.     def test_builtin_user_isactive(self):
    
  467.         user = User.objects.create(username="foo", email="[email protected]")
    
  468.         # is_active is true by default
    
  469.         self.assertIs(user.is_active, True)
    
  470.         user.is_active = False
    
  471.         user.save()
    
  472.         user_fetched = User.objects.get(pk=user.pk)
    
  473.         # the is_active flag is saved
    
  474.         self.assertFalse(user_fetched.is_active)
    
  475. 
    
  476.     @override_settings(AUTH_USER_MODEL="auth_tests.IsActiveTestUser1")
    
  477.     def test_is_active_field_default(self):
    
  478.         """
    
  479.         tests that the default value for is_active is provided
    
  480.         """
    
  481.         UserModel = get_user_model()
    
  482.         user = UserModel(username="foo")
    
  483.         self.assertIs(user.is_active, True)
    
  484.         # you can set the attribute - but it will not save
    
  485.         user.is_active = False
    
  486.         # there should be no problem saving - but the attribute is not saved
    
  487.         user.save()
    
  488.         user_fetched = UserModel._default_manager.get(pk=user.pk)
    
  489.         # the attribute is always true for newly retrieved instance
    
  490.         self.assertIs(user_fetched.is_active, True)
    
  491. 
    
  492. 
    
  493. class TestCreateSuperUserSignals(TestCase):
    
  494.     """
    
  495.     Simple test case for ticket #20541
    
  496.     """
    
  497. 
    
  498.     def post_save_listener(self, *args, **kwargs):
    
  499.         self.signals_count += 1
    
  500. 
    
  501.     def setUp(self):
    
  502.         self.signals_count = 0
    
  503.         post_save.connect(self.post_save_listener, sender=User)
    
  504. 
    
  505.     def tearDown(self):
    
  506.         post_save.disconnect(self.post_save_listener, sender=User)
    
  507. 
    
  508.     def test_create_user(self):
    
  509.         User.objects.create_user("JohnDoe")
    
  510.         self.assertEqual(self.signals_count, 1)
    
  511. 
    
  512.     def test_create_superuser(self):
    
  513.         User.objects.create_superuser("JohnDoe", "[email protected]", "1")
    
  514.         self.assertEqual(self.signals_count, 1)
    
  515. 
    
  516. 
    
  517. class AnonymousUserTests(SimpleTestCase):
    
  518.     no_repr_msg = "Django doesn't provide a DB representation for AnonymousUser."
    
  519. 
    
  520.     def setUp(self):
    
  521.         self.user = AnonymousUser()
    
  522. 
    
  523.     def test_properties(self):
    
  524.         self.assertIsNone(self.user.pk)
    
  525.         self.assertEqual(self.user.username, "")
    
  526.         self.assertEqual(self.user.get_username(), "")
    
  527.         self.assertIs(self.user.is_anonymous, True)
    
  528.         self.assertIs(self.user.is_authenticated, False)
    
  529.         self.assertIs(self.user.is_staff, False)
    
  530.         self.assertIs(self.user.is_active, False)
    
  531.         self.assertIs(self.user.is_superuser, False)
    
  532.         self.assertEqual(self.user.groups.count(), 0)
    
  533.         self.assertEqual(self.user.user_permissions.count(), 0)
    
  534.         self.assertEqual(self.user.get_user_permissions(), set())
    
  535.         self.assertEqual(self.user.get_group_permissions(), set())
    
  536. 
    
  537.     def test_str(self):
    
  538.         self.assertEqual(str(self.user), "AnonymousUser")
    
  539. 
    
  540.     def test_eq(self):
    
  541.         self.assertEqual(self.user, AnonymousUser())
    
  542.         self.assertNotEqual(self.user, User("super", "[email protected]", "super"))
    
  543. 
    
  544.     def test_hash(self):
    
  545.         self.assertEqual(hash(self.user), 1)
    
  546. 
    
  547.     def test_int(self):
    
  548.         msg = (
    
  549.             "Cannot cast AnonymousUser to int. Are you trying to use it in "
    
  550.             "place of User?"
    
  551.         )
    
  552.         with self.assertRaisesMessage(TypeError, msg):
    
  553.             int(self.user)
    
  554. 
    
  555.     def test_delete(self):
    
  556.         with self.assertRaisesMessage(NotImplementedError, self.no_repr_msg):
    
  557.             self.user.delete()
    
  558. 
    
  559.     def test_save(self):
    
  560.         with self.assertRaisesMessage(NotImplementedError, self.no_repr_msg):
    
  561.             self.user.save()
    
  562. 
    
  563.     def test_set_password(self):
    
  564.         with self.assertRaisesMessage(NotImplementedError, self.no_repr_msg):
    
  565.             self.user.set_password("password")
    
  566. 
    
  567.     def test_check_password(self):
    
  568.         with self.assertRaisesMessage(NotImplementedError, self.no_repr_msg):
    
  569.             self.user.check_password("password")
    
  570. 
    
  571. 
    
  572. class GroupTests(SimpleTestCase):
    
  573.     def test_str(self):
    
  574.         g = Group(name="Users")
    
  575.         self.assertEqual(str(g), "Users")
    
  576. 
    
  577. 
    
  578. class PermissionTests(TestCase):
    
  579.     def test_str(self):
    
  580.         p = Permission.objects.get(codename="view_customemailfield")
    
  581.         self.assertEqual(
    
  582.             str(p), "auth_tests | custom email field | Can view custom email field"
    
  583.         )