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.utils import override_settings
10
@override_settings(USE_TZ=False, PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))
11
class SignalTestCase(TestCase):
12
urls = 'django.contrib.auth.tests.urls'
13
fixtures = ['authtestdata.json']
15
def listener_login(self, user, **kwargs):
16
self.logged_in.append(user)
18
def listener_logout(self, user, **kwargs):
19
self.logged_out.append(user)
21
def listener_login_failed(self, sender, credentials, **kwargs):
22
self.login_failed.append(credentials)
25
"""Set up the listeners and reset the logged in/logged out counters"""
28
self.login_failed = []
29
signals.user_logged_in.connect(self.listener_login)
30
signals.user_logged_out.connect(self.listener_logout)
31
signals.user_login_failed.connect(self.listener_login_failed)
34
"""Disconnect the listeners"""
35
signals.user_logged_in.disconnect(self.listener_login)
36
signals.user_logged_out.disconnect(self.listener_logout)
37
signals.user_login_failed.disconnect(self.listener_login_failed)
40
# Only a successful login will trigger the success signal.
41
self.client.login(username='testclient', password='bad')
42
self.assertEqual(len(self.logged_in), 0)
43
self.assertEqual(len(self.login_failed), 1)
44
self.assertEqual(self.login_failed[0]['username'], 'testclient')
45
# verify the password is cleansed
46
self.assertTrue('***' in self.login_failed[0]['password'])
49
self.client.login(username='testclient', password='password')
50
self.assertEqual(len(self.logged_in), 1)
51
self.assertEqual(self.logged_in[0].username, 'testclient')
53
# Ensure there were no more failures.
54
self.assertEqual(len(self.login_failed), 1)
56
def test_logout_anonymous(self):
57
# The log_out function will still trigger the signal for anonymous
59
self.client.get('/logout/next_page/')
60
self.assertEqual(len(self.logged_out), 1)
61
self.assertEqual(self.logged_out[0], None)
63
def test_logout(self):
64
self.client.login(username='testclient', password='password')
65
self.client.get('/logout/next_page/')
66
self.assertEqual(len(self.logged_out), 1)
67
self.assertEqual(self.logged_out[0].username, 'testclient')
69
def test_update_last_login(self):
70
"""Ensure that only `last_login` is updated in `update_last_login`"""
71
user = User.objects.get(pk=3)
72
old_last_login = user.last_login
74
user.username = "This username shouldn't get saved"
75
request = RequestFactory().get('/login')
76
signals.user_logged_in.send(sender=user.__class__, request=request,
78
user = User.objects.get(pk=3)
79
self.assertEqual(user.username, 'staff')
80
self.assertNotEqual(user.last_login, old_last_login)