mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #5836 -- Corrected the logic in the Test Client when an exception raised by a view is caught and re-raised. Thanks for the report, test case, and fix, Chris Wagner.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@7583 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		
							
								
								
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							| @@ -367,6 +367,7 @@ answer newbie questions, and generally made Django that much better: | |||||||
|     George Vilches <gav@thataddress.com> |     George Vilches <gav@thataddress.com> | ||||||
|     Vlado <vlado@labath.org> |     Vlado <vlado@labath.org> | ||||||
|     Milton Waddams |     Milton Waddams | ||||||
|  |     Chris Wagner <cw264701@ohio.edu> | ||||||
|     wam-djangobug@wamber.net |     wam-djangobug@wamber.net | ||||||
|     Wang Chun <wangchun@exoweb.net> |     Wang Chun <wangchun@exoweb.net> | ||||||
|     Filip Wasilewski <filip.wasilewski@gmail.com> |     Filip Wasilewski <filip.wasilewski@gmail.com> | ||||||
|   | |||||||
| @@ -179,9 +179,14 @@ class Client: | |||||||
|             if e.args != ('500.html',): |             if e.args != ('500.html',): | ||||||
|                 raise |                 raise | ||||||
|  |  | ||||||
|         # Look for a signalled exception and reraise it |         # Look for a signalled exception, clear the current context | ||||||
|  |         # exception data, then re-raise the signalled exception. | ||||||
|  |         # Also make sure that the signalled exception is cleared from | ||||||
|  |         # the local cache! | ||||||
|         if self.exc_info: |         if self.exc_info: | ||||||
|             raise self.exc_info[1], None, self.exc_info[2] |             exc_info = self.exc_info | ||||||
|  |             self.exc_info = None | ||||||
|  |             raise exc_info[1], None, exc_info[2] | ||||||
|              |              | ||||||
|         # Save the client and request that stimulated the response |         # Save the client and request that stimulated the response | ||||||
|         response.client = self |         response.client = self | ||||||
|   | |||||||
| @@ -34,5 +34,23 @@ | |||||||
|             "email": "testclient@example.com",  |             "email": "testclient@example.com",  | ||||||
|             "date_joined": "2006-12-17 07:03:31" |             "date_joined": "2006-12-17 07:03:31" | ||||||
|         } |         } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "pk": "3",  | ||||||
|  |         "model": "auth.user",  | ||||||
|  |         "fields": { | ||||||
|  |             "username": "staff",  | ||||||
|  |             "first_name": "Staff",  | ||||||
|  |             "last_name": "Member",  | ||||||
|  |             "is_active": true,  | ||||||
|  |             "is_superuser": false,  | ||||||
|  |             "is_staff": true,  | ||||||
|  |             "last_login": "2006-12-17 07:03:31",  | ||||||
|  |             "groups": [],  | ||||||
|  |             "user_permissions": [],  | ||||||
|  |             "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",  | ||||||
|  |             "email": "testclient@example.com",  | ||||||
|  |             "date_joined": "2006-12-17 07:03:31" | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| ] | ] | ||||||
| @@ -16,5 +16,41 @@ | |||||||
|             "email": "testclient@example.com",  |             "email": "testclient@example.com",  | ||||||
|             "date_joined": "2006-12-17 07:03:31" |             "date_joined": "2006-12-17 07:03:31" | ||||||
|         } |         } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "pk": "2",  | ||||||
|  |         "model": "auth.user",  | ||||||
|  |         "fields": { | ||||||
|  |             "username": "inactive",  | ||||||
|  |             "first_name": "Inactive",  | ||||||
|  |             "last_name": "User",  | ||||||
|  |             "is_active": false,  | ||||||
|  |             "is_superuser": false,  | ||||||
|  |             "is_staff": false,  | ||||||
|  |             "last_login": "2006-12-17 07:03:31",  | ||||||
|  |             "groups": [],  | ||||||
|  |             "user_permissions": [],  | ||||||
|  |             "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",  | ||||||
|  |             "email": "testclient@example.com",  | ||||||
|  |             "date_joined": "2006-12-17 07:03:31" | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "pk": "3",  | ||||||
|  |         "model": "auth.user",  | ||||||
|  |         "fields": { | ||||||
|  |             "username": "staff",  | ||||||
|  |             "first_name": "Staff",  | ||||||
|  |             "last_name": "Member",  | ||||||
|  |             "is_active": true,  | ||||||
|  |             "is_superuser": false,  | ||||||
|  |             "is_staff": true,  | ||||||
|  |             "last_login": "2006-12-17 07:03:31",  | ||||||
|  |             "groups": [],  | ||||||
|  |             "user_permissions": [],  | ||||||
|  |             "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",  | ||||||
|  |             "email": "testclient@example.com",  | ||||||
|  |             "date_joined": "2006-12-17 07:03:31" | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| ] | ] | ||||||
| @@ -4,6 +4,7 @@ Regression tests for the Test Client, especially the customized assertions. | |||||||
| """ | """ | ||||||
| from django.test import Client, TestCase | from django.test import Client, TestCase | ||||||
| from django.core.urlresolvers import reverse | from django.core.urlresolvers import reverse | ||||||
|  | from django.core.exceptions import SuspiciousOperation | ||||||
| import os | import os | ||||||
|  |  | ||||||
| class AssertContainsTests(TestCase): | class AssertContainsTests(TestCase): | ||||||
| @@ -294,4 +295,26 @@ class URLEscapingTests(TestCase): | |||||||
|         self.assertEqual(response.status_code, 200) |         self.assertEqual(response.status_code, 200) | ||||||
|         self.assertEqual(response.content, 'Hi, Arthur') |         self.assertEqual(response.content, 'Hi, Arthur') | ||||||
|  |  | ||||||
|  | class ExceptionTests(TestCase): | ||||||
|  |     fixtures = ['testdata.json'] | ||||||
|      |      | ||||||
|  |     def test_exception_cleared(self): | ||||||
|  |         "#5836 - A stale user exception isn't re-raised by the test client." | ||||||
|  |  | ||||||
|  |         login = self.client.login(username='testclient',password='password') | ||||||
|  |         self.failUnless(login, 'Could not log in') | ||||||
|  |         try: | ||||||
|  |             response = self.client.get("/test_client_regress/staff_only/") | ||||||
|  |             self.fail("General users should not be able to visit this page") | ||||||
|  |         except SuspiciousOperation: | ||||||
|  |             pass | ||||||
|  |  | ||||||
|  |         # At this point, an exception has been raised, and should be cleared. | ||||||
|  |          | ||||||
|  |         # This next operation should be successful; if it isn't we have a problem. | ||||||
|  |         login = self.client.login(username='staff', password='password') | ||||||
|  |         self.failUnless(login, 'Could not log in') | ||||||
|  |         try: | ||||||
|  |             self.client.get("/test_client_regress/staff_only/") | ||||||
|  |         except SuspiciousOperation: | ||||||
|  |             self.fail("Staff should be able to visit this page") | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ import views | |||||||
| urlpatterns = patterns('', | urlpatterns = patterns('', | ||||||
|     (r'^no_template_view/$', views.no_template_view), |     (r'^no_template_view/$', views.no_template_view), | ||||||
|     (r'^file_upload/$', views.file_upload_view), |     (r'^file_upload/$', views.file_upload_view), | ||||||
|  |     (r'^staff_only/$', views.staff_only_view), | ||||||
|     (r'^get_view/$', views.get_view), |     (r'^get_view/$', views.get_view), | ||||||
|     url(r'^arg_view/(?P<name>.+)/$', views.view_with_argument, name='arg_view'), |     url(r'^arg_view/(?P<name>.+)/$', views.view_with_argument, name='arg_view'), | ||||||
|     (r'^login_protected_redirect_view/$', views.login_protected_redirect_view) |     (r'^login_protected_redirect_view/$', views.login_protected_redirect_view) | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ import os | |||||||
|  |  | ||||||
| from django.contrib.auth.decorators import login_required | from django.contrib.auth.decorators import login_required | ||||||
| from django.http import HttpResponse, HttpResponseRedirect, HttpResponseServerError | from django.http import HttpResponse, HttpResponseRedirect, HttpResponseServerError | ||||||
|  | from django.core.exceptions import SuspiciousOperation | ||||||
|  |  | ||||||
| def no_template_view(request): | def no_template_view(request): | ||||||
|     "A simple view that expects a GET request, and returns a rendered template" |     "A simple view that expects a GET request, and returns a rendered template" | ||||||
| @@ -23,6 +24,13 @@ def file_upload_view(request): | |||||||
|     else: |     else: | ||||||
|         return HttpResponseServerError() |         return HttpResponseServerError() | ||||||
|  |  | ||||||
|  | def staff_only_view(request): | ||||||
|  |     "A view that can only be visited by staff. Non staff members get an exception" | ||||||
|  |     if request.user.is_staff: | ||||||
|  |         return HttpResponse('') | ||||||
|  |     else: | ||||||
|  |         raise SuspiciousOperation() | ||||||
|  |      | ||||||
| def get_view(request): | def get_view(request): | ||||||
|     "A simple login protected view" |     "A simple login protected view" | ||||||
|     return HttpResponse("Hello world") |     return HttpResponse("Hello world") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user