diff options
| author | Tim Graham <timograham@gmail.com> | 2015-02-12 12:14:19 -0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-02-13 09:42:49 -0500 |
| commit | fdf20093e0f8cd064673aa1597c20727ed4dd2a0 (patch) | |
| tree | 6e4a7dc5b765b0adde253067861a0f0ca977da8e /tests/auth_tests | |
| parent | f287bec5833d75750fa6368bc2802741b7924533 (diff) | |
Fixed #24334 -- Allowed admin password reset to work with non-digit custom user model primary key.
Thanks Loic for help and Simon for review.
Diffstat (limited to 'tests/auth_tests')
| -rw-r--r-- | tests/auth_tests/test_views.py | 37 | ||||
| -rw-r--r-- | tests/auth_tests/urls_custom_user_admin.py | 21 |
2 files changed, 58 insertions, 0 deletions
diff --git a/tests/auth_tests/test_views.py b/tests/auth_tests/test_views.py index ec991153a0..85177dab28 100644 --- a/tests/auth_tests/test_views.py +++ b/tests/auth_tests/test_views.py @@ -18,6 +18,7 @@ from django.contrib.sessions.middleware import SessionMiddleware from django.contrib.sites.requests import RequestSite from django.core import mail from django.core.urlresolvers import NoReverseMatch, reverse, reverse_lazy +from django.db import connection from django.http import HttpRequest, QueryDict from django.middleware.csrf import CsrfViewMiddleware from django.test import ( @@ -30,6 +31,7 @@ from django.utils.http import urlquote from django.utils.six.moves.urllib.parse import ParseResult, urlparse from django.utils.translation import LANGUAGE_SESSION_KEY +from .models import UUIDUser from .settings import AUTH_TEMPLATES @@ -902,3 +904,38 @@ class ChangelistTests(AuthViewsTestCase): self.assertEqual(row.user_id, self.admin.pk) self.assertEqual(row.object_id, str(u.pk)) self.assertEqual(row.change_message, 'Changed password.') + + def test_password_change_bad_url(self): + response = self.client.get(reverse('auth_test_admin:auth_user_password_change', args=('foobar',))) + self.assertEqual(response.status_code, 404) + + +@override_settings( + AUTH_USER_MODEL='auth.UUIDUser', + ROOT_URLCONF='auth_tests.urls_custom_user_admin', +) +class UUIDUserTests(TestCase): + + def test_admin_password_change(self): + u = UUIDUser.objects.create_superuser(username='uuid', email='foo@bar.com', password='test') + self.assertTrue(self.client.login(username='uuid', password='test')) + + user_change_url = reverse('custom_user_admin:auth_uuiduser_change', args=(u.pk,)) + response = self.client.get(user_change_url) + self.assertEqual(response.status_code, 200) + + password_change_url = reverse('custom_user_admin:auth_user_password_change', args=(u.pk,)) + response = self.client.get(password_change_url) + self.assertEqual(response.status_code, 200) + + # A LogEntry is created with pk=1 which breaks a FK constraint on MySQL + with connection.constraint_checks_disabled(): + response = self.client.post(password_change_url, { + 'password1': 'password1', + 'password2': 'password1', + }) + self.assertRedirects(response, user_change_url) + row = LogEntry.objects.latest('id') + self.assertEqual(row.user_id, 1) # harcoded in CustomUserAdmin.log_change() + self.assertEqual(row.object_id, str(u.pk)) + self.assertEqual(row.change_message, 'Changed password.') diff --git a/tests/auth_tests/urls_custom_user_admin.py b/tests/auth_tests/urls_custom_user_admin.py new file mode 100644 index 0000000000..02389de4f2 --- /dev/null +++ b/tests/auth_tests/urls_custom_user_admin.py @@ -0,0 +1,21 @@ +from django.conf.urls import include, url +from django.contrib import admin +from django.contrib.auth import get_user_model +from django.contrib.auth.admin import UserAdmin +from django.contrib.auth.urls import urlpatterns + +site = admin.AdminSite(name='custom_user_admin') + + +class CustomUserAdmin(UserAdmin): + def log_change(self, request, object, message): + # LogEntry.user column doesn't get altered to expect a UUID, so set an + # integer manually to avoid causing an error. + request.user.pk = 1 + super(CustomUserAdmin, self).log_change(request, object, message) + +site.register(get_user_model(), CustomUserAdmin) + +urlpatterns += [ + url(r'^admin/', include(site.urls)), +] |
