test_signals.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from django.contrib.auth import signals
  2. from django.contrib.auth.models import User
  3. from django.contrib.auth.tests.utils import skipIfCustomUser
  4. from django.test import TestCase
  5. from django.test.client import RequestFactory
  6. from django.test import override_settings
  7. @skipIfCustomUser
  8. @override_settings(USE_TZ=False, PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))
  9. class SignalTestCase(TestCase):
  10. urls = 'django.contrib.auth.tests.urls'
  11. fixtures = ['authtestdata.json']
  12. def listener_login(self, user, **kwargs):
  13. self.logged_in.append(user)
  14. def listener_logout(self, user, **kwargs):
  15. self.logged_out.append(user)
  16. def listener_login_failed(self, sender, credentials, **kwargs):
  17. self.login_failed.append(credentials)
  18. def setUp(self):
  19. """Set up the listeners and reset the logged in/logged out counters"""
  20. self.logged_in = []
  21. self.logged_out = []
  22. self.login_failed = []
  23. signals.user_logged_in.connect(self.listener_login)
  24. signals.user_logged_out.connect(self.listener_logout)
  25. signals.user_login_failed.connect(self.listener_login_failed)
  26. def tearDown(self):
  27. """Disconnect the listeners"""
  28. signals.user_logged_in.disconnect(self.listener_login)
  29. signals.user_logged_out.disconnect(self.listener_logout)
  30. signals.user_login_failed.disconnect(self.listener_login_failed)
  31. def test_login(self):
  32. # Only a successful login will trigger the success signal.
  33. self.client.login(username='testclient', password='bad')
  34. self.assertEqual(len(self.logged_in), 0)
  35. self.assertEqual(len(self.login_failed), 1)
  36. self.assertEqual(self.login_failed[0]['username'], 'testclient')
  37. # verify the password is cleansed
  38. self.assertTrue('***' in self.login_failed[0]['password'])
  39. # Like this:
  40. self.client.login(username='testclient', password='password')
  41. self.assertEqual(len(self.logged_in), 1)
  42. self.assertEqual(self.logged_in[0].username, 'testclient')
  43. # Ensure there were no more failures.
  44. self.assertEqual(len(self.login_failed), 1)
  45. def test_logout_anonymous(self):
  46. # The log_out function will still trigger the signal for anonymous
  47. # users.
  48. self.client.get('/logout/next_page/')
  49. self.assertEqual(len(self.logged_out), 1)
  50. self.assertEqual(self.logged_out[0], None)
  51. def test_logout(self):
  52. self.client.login(username='testclient', password='password')
  53. self.client.get('/logout/next_page/')
  54. self.assertEqual(len(self.logged_out), 1)
  55. self.assertEqual(self.logged_out[0].username, 'testclient')
  56. def test_update_last_login(self):
  57. """Ensure that only `last_login` is updated in `update_last_login`"""
  58. user = User.objects.get(pk=3)
  59. old_last_login = user.last_login
  60. user.username = "This username shouldn't get saved"
  61. request = RequestFactory().get('/login')
  62. signals.user_logged_in.send(sender=user.__class__, request=request,
  63. user=user)
  64. user = User.objects.get(pk=3)
  65. self.assertEqual(user.username, 'staff')
  66. self.assertNotEqual(user.last_login, old_last_login)