test_signals.py 3.1 KB

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