Ticket #10521: 10521-remote-user-tests-enh.diff
File 10521-remote-user-tests-enh.diff, 18.9 KB (added by , 16 years ago) |
---|
-
django/contrib/auth/tests/__init__.py
diff -r f69520e5a824 django/contrib/auth/tests/__init__.py
a b 1 1 from django.contrib.auth.tests.basic import BASIC_TESTS 2 from django.contrib.auth.tests.views \2 from django.contrib.auth.tests.views_tests \ 3 3 import PasswordResetTest, ChangePasswordTest 4 4 from django.contrib.auth.tests.forms import FORM_TESTS 5 5 from django.contrib.auth.tests.remote_user \ -
django/contrib/auth/tests/remote_user.py
diff -r f69520e5a824 django/contrib/auth/tests/remote_user.py
a b 14 14 # Usernames to be passed in REMOTE_USER for the test_known_user test case. 15 15 known_user = 'knownuser' 16 16 known_user2 = 'knownuser2' 17 18 urls = 'django.contrib.auth.tests.test_urls' 17 19 18 20 def setUp(self): 19 21 self.curr_middleware = settings.MIDDLEWARE_CLASSES … … 28 30 """ 29 31 num_users = User.objects.count() 30 32 31 response = self.client.get('/ ')33 response = self.client.get('/remote_user/') 32 34 self.assert_(isinstance(response.context['user'], AnonymousUser)) 33 35 self.assertEqual(User.objects.count(), num_users) 34 36 35 response = self.client.get('/ ', REMOTE_USER=None)37 response = self.client.get('/remote_user/', REMOTE_USER=None) 36 38 self.assert_(isinstance(response.context['user'], AnonymousUser)) 37 39 self.assertEqual(User.objects.count(), num_users) 38 40 39 response = self.client.get('/ ', REMOTE_USER='')41 response = self.client.get('/remote_user/', REMOTE_USER='') 40 42 self.assert_(isinstance(response.context['user'], AnonymousUser)) 41 43 self.assertEqual(User.objects.count(), num_users) 42 44 … … 46 48 as a User. 47 49 """ 48 50 num_users = User.objects.count() 49 response = self.client.get('/ ', REMOTE_USER='newuser')51 response = self.client.get('/remote_user/', REMOTE_USER='newuser') 50 52 self.assertEqual(response.context['user'].username, 'newuser') 51 53 self.assertEqual(User.objects.count(), num_users + 1) 52 54 User.objects.get(username='newuser') 53 55 54 56 # Another request with same user should not create any new users. 55 response = self.client.get('/ ', REMOTE_USER='newuser')57 response = self.client.get('/remote_user/', REMOTE_USER='newuser') 56 58 self.assertEqual(User.objects.count(), num_users + 1) 57 59 58 60 def test_known_user(self): … … 62 64 User.objects.create(username='knownuser') 63 65 User.objects.create(username='knownuser2') 64 66 num_users = User.objects.count() 65 response = self.client.get('/ ', REMOTE_USER=self.known_user)67 response = self.client.get('/remote_user/', REMOTE_USER=self.known_user) 66 68 self.assertEqual(response.context['user'].username, 'knownuser') 67 69 self.assertEqual(User.objects.count(), num_users) 68 70 # Test that a different user passed in the headers causes the new user 69 71 # to be logged in. 70 response = self.client.get('/ ', REMOTE_USER=self.known_user2)72 response = self.client.get('/remote_user/', REMOTE_USER=self.known_user2) 71 73 self.assertEqual(response.context['user'].username, 'knownuser2') 72 74 self.assertEqual(User.objects.count(), num_users) 73 75 … … 82 84 user.last_login = default_login 83 85 user.save() 84 86 85 response = self.client.get('/ ', REMOTE_USER=self.known_user)87 response = self.client.get('/remote_user/', REMOTE_USER=self.known_user) 86 88 self.assertNotEqual(default_login, response.context['user'].last_login) 87 89 88 90 user = User.objects.get(username='knownuser') 89 91 user.last_login = default_login 90 92 user.save() 91 response = self.client.get('/ ', REMOTE_USER=self.known_user)93 response = self.client.get('/remote_user/', REMOTE_USER=self.known_user) 92 94 self.assertEqual(default_login, response.context['user'].last_login) 93 95 94 96 def tearDown(self): … … 113 115 114 116 def test_unknown_user(self): 115 117 num_users = User.objects.count() 116 response = self.client.get('/ ', REMOTE_USER='newuser')118 response = self.client.get('/remote_user/', REMOTE_USER='newuser') 117 119 self.assert_(isinstance(response.context['user'], AnonymousUser)) 118 120 self.assertEqual(User.objects.count(), num_users) 119 121 -
new file django/contrib/auth/tests/test_urls.py
diff -r f69520e5a824 django/contrib/auth/tests/test_urls.py
- + 1 """ 2 3 This is a urlconf to be loaded by remote_user.py. Add any urls needed 4 for tests only. 5 6 """ 7 from django.conf.urls.defaults import * 8 from django.contrib.auth.tests.views import remote_user_auth_view 9 10 urlpatterns = patterns('', 11 (r'^remote_user/', remote_user_auth_view), 12 ) -
django/contrib/auth/tests/views.py
diff -r f69520e5a824 django/contrib/auth/tests/views.py
a b 1 from django.http import HttpResponse 2 from django.shortcuts import render_to_response 3 from django.template import Template, RequestContext 1 4 2 import os 3 import re 4 5 from django.conf import settings 6 from django.contrib.auth.models import User 7 from django.test import TestCase 8 from django.core import mail 9 10 class PasswordResetTest(TestCase): 11 fixtures = ['authtestdata.json'] 12 urls = 'django.contrib.auth.urls' 13 14 def test_email_not_found(self): 15 "Error is raised if the provided email address isn't currently registered" 16 response = self.client.get('/password_reset/') 17 self.assertEquals(response.status_code, 200) 18 response = self.client.post('/password_reset/', {'email': 'not_a_real_email@email.com'}) 19 self.assertContains(response, "That e-mail address doesn't have an associated user account") 20 self.assertEquals(len(mail.outbox), 0) 21 22 def test_email_found(self): 23 "Email is sent if a valid email address is provided for password reset" 24 response = self.client.post('/password_reset/', {'email': 'staffmember@example.com'}) 25 self.assertEquals(response.status_code, 302) 26 self.assertEquals(len(mail.outbox), 1) 27 self.assert_("http://" in mail.outbox[0].body) 28 29 def _test_confirm_start(self): 30 # Start by creating the email 31 response = self.client.post('/password_reset/', {'email': 'staffmember@example.com'}) 32 self.assertEquals(response.status_code, 302) 33 self.assertEquals(len(mail.outbox), 1) 34 return self._read_signup_email(mail.outbox[0]) 35 36 def _read_signup_email(self, email): 37 urlmatch = re.search(r"https?://[^/]*(/.*reset/\S*)", email.body) 38 self.assert_(urlmatch is not None, "No URL found in sent email") 39 return urlmatch.group(), urlmatch.groups()[0] 40 41 def test_confirm_valid(self): 42 url, path = self._test_confirm_start() 43 response = self.client.get(path) 44 # redirect to a 'complete' page: 45 self.assertEquals(response.status_code, 200) 46 self.assert_("Please enter your new password" in response.content) 47 48 def test_confirm_invalid(self): 49 url, path = self._test_confirm_start() 50 # Lets munge the token in the path, but keep the same length, 51 # in case the URL conf will reject a different length 52 path = path[:-5] + ("0"*4) + path[-1] 53 54 response = self.client.get(path) 55 self.assertEquals(response.status_code, 200) 56 self.assert_("The password reset link was invalid" in response.content) 57 58 def test_confirm_invalid_post(self): 59 # Same as test_confirm_invalid, but trying 60 # to do a POST instead. 61 url, path = self._test_confirm_start() 62 path = path[:-5] + ("0"*4) + path[-1] 63 64 response = self.client.post(path, {'new_password1': 'anewpassword', 65 'new_password2':' anewpassword'}) 66 # Check the password has not been changed 67 u = User.objects.get(email='staffmember@example.com') 68 self.assert_(not u.check_password("anewpassword")) 69 70 def test_confirm_complete(self): 71 url, path = self._test_confirm_start() 72 response = self.client.post(path, {'new_password1': 'anewpassword', 73 'new_password2': 'anewpassword'}) 74 # It redirects us to a 'complete' page: 75 self.assertEquals(response.status_code, 302) 76 # Check the password has been changed 77 u = User.objects.get(email='staffmember@example.com') 78 self.assert_(u.check_password("anewpassword")) 79 80 # Check we can't use the link again 81 response = self.client.get(path) 82 self.assertEquals(response.status_code, 200) 83 self.assert_("The password reset link was invalid" in response.content) 84 85 def test_confirm_different_passwords(self): 86 url, path = self._test_confirm_start() 87 response = self.client.post(path, {'new_password1': 'anewpassword', 88 'new_password2':' x'}) 89 self.assertEquals(response.status_code, 200) 90 self.assert_("The two password fields didn't match" in response.content) 91 92 93 class ChangePasswordTest(TestCase): 94 fixtures = ['authtestdata.json'] 95 urls = 'django.contrib.auth.urls' 96 97 def setUp(self): 98 self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS 99 settings.TEMPLATE_DIRS = ( 100 os.path.join( 101 os.path.dirname(__file__), 102 'templates' 103 ) 104 ,) 105 106 def tearDown(self): 107 settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS 108 109 def login(self, password='password'): 110 response = self.client.post('/login/', { 111 'username': 'testclient', 112 'password': password 113 } 114 ) 115 self.assertEquals(response.status_code, 302) 116 self.assert_(response['Location'].endswith(settings.LOGIN_REDIRECT_URL)) 117 118 def fail_login(self, password='password'): 119 response = self.client.post('/login/', { 120 'username': 'testclient', 121 'password': password 122 } 123 ) 124 self.assertEquals(response.status_code, 200) 125 self.assert_("Please enter a correct username and password. Note that both fields are case-sensitive." in response.content) 126 127 def logout(self): 128 response = self.client.get('/logout/') 129 130 def test_password_change_fails_with_invalid_old_password(self): 131 self.login() 132 response = self.client.post('/password_change/', { 133 'old_password': 'donuts', 134 'new_password1': 'password1', 135 'new_password2': 'password1', 136 } 137 ) 138 self.assertEquals(response.status_code, 200) 139 self.assert_("Your old password was entered incorrectly. Please enter it again." in response.content) 140 141 def test_password_change_fails_with_mismatched_passwords(self): 142 self.login() 143 response = self.client.post('/password_change/', { 144 'old_password': 'password', 145 'new_password1': 'password1', 146 'new_password2': 'donuts', 147 } 148 ) 149 self.assertEquals(response.status_code, 200) 150 self.assert_("The two password fields didn't match." in response.content) 151 152 def test_password_change_succeeds(self): 153 self.login() 154 response = self.client.post('/password_change/', { 155 'old_password': 'password', 156 'new_password1': 'password1', 157 'new_password2': 'password1', 158 } 159 ) 160 self.assertEquals(response.status_code, 302) 161 self.assert_(response['Location'].endswith('/password_change/done/')) 162 self.fail_login() 163 self.login(password='password1') 164 5 def remote_user_auth_view(request): 6 t = Template("Username is {{ user }}.") 7 c = RequestContext(request, {}) 8 return HttpResponse(t.render(c)) -
new file django/contrib/auth/tests/views_tests.py
diff -r f69520e5a824 django/contrib/auth/tests/views_tests.py
- + 1 2 import os 3 import re 4 5 from django.conf import settings 6 from django.contrib.auth.models import User 7 from django.test import TestCase 8 from django.core import mail 9 10 class PasswordResetTest(TestCase): 11 fixtures = ['authtestdata.json'] 12 urls = 'django.contrib.auth.urls' 13 14 def test_email_not_found(self): 15 "Error is raised if the provided email address isn't currently registered" 16 response = self.client.get('/password_reset/') 17 self.assertEquals(response.status_code, 200) 18 response = self.client.post('/password_reset/', {'email': 'not_a_real_email@email.com'}) 19 self.assertContains(response, "That e-mail address doesn't have an associated user account") 20 self.assertEquals(len(mail.outbox), 0) 21 22 def test_email_found(self): 23 "Email is sent if a valid email address is provided for password reset" 24 response = self.client.post('/password_reset/', {'email': 'staffmember@example.com'}) 25 self.assertEquals(response.status_code, 302) 26 self.assertEquals(len(mail.outbox), 1) 27 self.assert_("http://" in mail.outbox[0].body) 28 29 def _test_confirm_start(self): 30 # Start by creating the email 31 response = self.client.post('/password_reset/', {'email': 'staffmember@example.com'}) 32 self.assertEquals(response.status_code, 302) 33 self.assertEquals(len(mail.outbox), 1) 34 return self._read_signup_email(mail.outbox[0]) 35 36 def _read_signup_email(self, email): 37 urlmatch = re.search(r"https?://[^/]*(/.*reset/\S*)", email.body) 38 self.assert_(urlmatch is not None, "No URL found in sent email") 39 return urlmatch.group(), urlmatch.groups()[0] 40 41 def test_confirm_valid(self): 42 url, path = self._test_confirm_start() 43 response = self.client.get(path) 44 # redirect to a 'complete' page: 45 self.assertEquals(response.status_code, 200) 46 self.assert_("Please enter your new password" in response.content) 47 48 def test_confirm_invalid(self): 49 url, path = self._test_confirm_start() 50 # Lets munge the token in the path, but keep the same length, 51 # in case the URL conf will reject a different length 52 path = path[:-5] + ("0"*4) + path[-1] 53 54 response = self.client.get(path) 55 self.assertEquals(response.status_code, 200) 56 self.assert_("The password reset link was invalid" in response.content) 57 58 def test_confirm_invalid_post(self): 59 # Same as test_confirm_invalid, but trying 60 # to do a POST instead. 61 url, path = self._test_confirm_start() 62 path = path[:-5] + ("0"*4) + path[-1] 63 64 response = self.client.post(path, {'new_password1': 'anewpassword', 65 'new_password2':' anewpassword'}) 66 # Check the password has not been changed 67 u = User.objects.get(email='staffmember@example.com') 68 self.assert_(not u.check_password("anewpassword")) 69 70 def test_confirm_complete(self): 71 url, path = self._test_confirm_start() 72 response = self.client.post(path, {'new_password1': 'anewpassword', 73 'new_password2': 'anewpassword'}) 74 # It redirects us to a 'complete' page: 75 self.assertEquals(response.status_code, 302) 76 # Check the password has been changed 77 u = User.objects.get(email='staffmember@example.com') 78 self.assert_(u.check_password("anewpassword")) 79 80 # Check we can't use the link again 81 response = self.client.get(path) 82 self.assertEquals(response.status_code, 200) 83 self.assert_("The password reset link was invalid" in response.content) 84 85 def test_confirm_different_passwords(self): 86 url, path = self._test_confirm_start() 87 response = self.client.post(path, {'new_password1': 'anewpassword', 88 'new_password2':' x'}) 89 self.assertEquals(response.status_code, 200) 90 self.assert_("The two password fields didn't match" in response.content) 91 92 93 class ChangePasswordTest(TestCase): 94 fixtures = ['authtestdata.json'] 95 urls = 'django.contrib.auth.urls' 96 97 def setUp(self): 98 self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS 99 settings.TEMPLATE_DIRS = ( 100 os.path.join( 101 os.path.dirname(__file__), 102 'templates' 103 ) 104 ,) 105 106 def tearDown(self): 107 settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS 108 109 def login(self, password='password'): 110 response = self.client.post('/login/', { 111 'username': 'testclient', 112 'password': password 113 } 114 ) 115 self.assertEquals(response.status_code, 302) 116 self.assert_(response['Location'].endswith(settings.LOGIN_REDIRECT_URL)) 117 118 def fail_login(self, password='password'): 119 response = self.client.post('/login/', { 120 'username': 'testclient', 121 'password': password 122 } 123 ) 124 self.assertEquals(response.status_code, 200) 125 self.assert_("Please enter a correct username and password. Note that both fields are case-sensitive." in response.content) 126 127 def logout(self): 128 response = self.client.get('/logout/') 129 130 def test_password_change_fails_with_invalid_old_password(self): 131 self.login() 132 response = self.client.post('/password_change/', { 133 'old_password': 'donuts', 134 'new_password1': 'password1', 135 'new_password2': 'password1', 136 } 137 ) 138 self.assertEquals(response.status_code, 200) 139 self.assert_("Your old password was entered incorrectly. Please enter it again." in response.content) 140 141 def test_password_change_fails_with_mismatched_passwords(self): 142 self.login() 143 response = self.client.post('/password_change/', { 144 'old_password': 'password', 145 'new_password1': 'password1', 146 'new_password2': 'donuts', 147 } 148 ) 149 self.assertEquals(response.status_code, 200) 150 self.assert_("The two password fields didn't match." in response.content) 151 152 def test_password_change_succeeds(self): 153 self.login() 154 response = self.client.post('/password_change/', { 155 'old_password': 'password', 156 'new_password1': 'password1', 157 'new_password2': 'password1', 158 } 159 ) 160 self.assertEquals(response.status_code, 302) 161 self.assert_(response['Location'].endswith('/password_change/done/')) 162 self.fail_login() 163 self.login(password='password1') 164