Ticket #10899: 10899.r16527.diff
File 10899.r16527.diff, 6.6 KB (added by , 13 years ago) |
---|
-
django/test/client.py
diff --git a/django/test/client.py b/django/test/client.py index 4335f21..cf74b22 100644
a b class Client(RequestFactory): 345 345 super(Client, self).__init__(**defaults) 346 346 self.handler = ClientHandler(enforce_csrf_checks) 347 347 self.exc_info = None 348 self._session_store = None 348 349 349 350 def store_exc_info(self, **kwargs): 350 351 """ … … class Client(RequestFactory): 356 357 """ 357 358 Obtains the current session variables. 358 359 """ 360 if self._session_store: 361 return self._session_store 362 359 363 if 'django.contrib.sessions.middleware.SessionMiddleware' in settings.MIDDLEWARE_CLASSES: 360 364 engine = import_module(settings.SESSION_ENGINE) 361 cookie = self.cookies.get(settings.SESSION_COOKIE_NAME , None)365 cookie = self.cookies.get(settings.SESSION_COOKIE_NAME) 362 366 if cookie: 363 return engine.SessionStore(cookie.value) 364 return {} 367 session_store = engine.SessionStore(cookie.value) 368 else: 369 session_store = engine.SessionStore() 370 session_store.save() 371 self.cookies[settings.SESSION_COOKIE_NAME] = \ 372 session_store.session_key 373 self._session_store = session_store 374 return session_store 375 else: 376 return {} 365 377 session = property(_session) 366 378 367 368 379 def request(self, **request): 369 380 """ 370 381 The master request method. Composes the environment dictionary … … class Client(RequestFactory): 374 385 """ 375 386 environ = self._base_environ(**request) 376 387 388 if self._session_store: 389 if getattr(self._session_store, "modified"): 390 self._session_store.save() 391 392 if 'django.contrib.sessions.middleware.SessionMiddleware' in settings.MIDDLEWARE_CLASSES: 393 # Update the session cookie since the session key can change 394 # due to login or logout and force the session to be reloaded 395 # on next access. 396 self.cookies[settings.SESSION_COOKIE_NAME] = \ 397 self._session_store.session_key 398 self._session_store = None 399 377 400 # Curry a data dictionary into an instance of the template renderer 378 401 # callback function. 379 402 data = {} … … class Client(RequestFactory): 505 528 user = authenticate(**credentials) 506 529 if user and user.is_active \ 507 530 and 'django.contrib.sessions.middleware.SessionMiddleware' in settings.MIDDLEWARE_CLASSES: 508 engine = import_module(settings.SESSION_ENGINE)509 531 510 532 # Create a fake request to store login details. 511 533 request = HttpRequest() 512 if self.session: 513 request.session = self.session 514 else: 515 request.session = engine.SessionStore() 534 request.session = self.session 516 535 login(request, user) 517 536 518 537 # Save the session values. … … class Client(RequestFactory): 545 564 if session_cookie: 546 565 session.delete(session_key=session_cookie.value) 547 566 self.cookies = SimpleCookie() 567 self._session_store = None 548 568 549 569 def _handle_redirects(self, response, **extra): 550 570 "Follows any redirects by requesting responses from the server using GET." -
docs/topics/testing.txt
diff --git a/docs/topics/testing.txt b/docs/topics/testing.txt index 6595c51..5a34376 100644
a b can access these properties as part of a test condition. 1001 1001 A dictionary-like object containing session information. See the 1002 1002 :doc:`session documentation</topics/http/sessions>` for full details. 1003 1003 1004 To modify the session and then save it, it must be stored in a variable 1005 first (because a new ``SessionStore`` is created every time this property 1006 is accessed):: 1004 .. versionadded:: 1.4 1005 1006 Similar to normal Django sessions, you can manipulate sessions directly. 1007 The modified values will be saved on subsequent requests. 1007 1008 1008 1009 def test_something(self): 1009 session = self.client.session 1010 session['somekey'] = 'test' 1011 session.save() 1010 self.client.session['somekey'] = value 1011 self.client.session['anotherkey'] = value 1012 1012 1013 1013 .. _Cookie module documentation: http://docs.python.org/library/cookie.html 1014 1014 -
tests/regressiontests/test_client_regress/models.py
diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py index 8e840e4..088b5d7 100644
a b class SessionTests(TestCase): 704 704 self.assertEqual(response.status_code, 200) 705 705 self.assertEqual(response.content, 'YES') 706 706 707 def test_session_manipulation(self): 708 # Check that the session can be edited as documented before #10899. 709 session = self.client.session 710 session["session_var"] = "foo" 711 session.save() 712 713 response = self.client.get('/test_client_regress/check_session/') 714 self.assertEqual(response.status_code, 200) 715 self.assertEqual(response.content, 'foo') 716 717 def test_direct_session_manipulation(self): 718 # Add a value to the session 719 self.client.session['session_var'] = 'bar' 720 self.assertEqual(self.client.session['session_var'], 'bar') 721 722 # Check that the session has been modified 723 response = self.client.get('/test_client_regress/check_session/') 724 self.assertEqual(response.status_code, 200) 725 self.assertEqual(response.content, 'bar') 726 727 # Check that the session variable persists over login 728 # when cycle_key() is called 729 self.client.login(username='testclient', password='password') 730 self.assertEqual(self.client.session['session_var'], 'bar') 731 732 response = self.client.get('/test_client_regress/check_session/') 733 self.assertEqual(response.status_code, 200) 734 self.assertEqual(response.content, 'bar') 735 736 # Check that new session is started after logout 737 self.client.logout() 738 self.assertEqual(self.client.session.get('session_var'), None) 739 707 740 def test_logout(self): 708 741 """Logout should work whether the user is logged in or not (#9978).""" 709 742 self.client.logout() … … class SessionTests(TestCase): 712 745 self.client.logout() 713 746 self.client.logout() 714 747 748 715 749 class RequestMethodTests(TestCase): 716 750 def test_get(self): 717 751 "Request a view via request method GET"