Ticket #10899: 10899_at_r16097.diff
File 10899_at_r16097.diff, 6.5 KB (added by , 14 years ago) |
---|
-
django/test/client.py
diff --git a/django/test/client.py b/django/test/client.py index 5cbc0ca..95085b5 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' in settings.INSTALLED_APPS: 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' in settings.INSTALLED_APPS: 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' in settings.INSTALLED_APPS: 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 fb9f6e5..1014b74 100644
a b can access these properties as part of a test condition. 1000 1000 A dictionary-like object containing session information. See the 1001 1001 :doc:`session documentation</topics/http/sessions>` for full details. 1002 1002 1003 To modify the session and then save it, it must be stored in a variable 1004 first (because a new ``SessionStore`` is created every time this property 1005 is accessed):: 1003 .. versionadded:: 1.4 1004 1005 Similar to normal Django sessions, you can manipulate sessions directly. 1006 The modified values will be saved on subsequent requests. 1006 1007 1007 1008 def test_something(self): 1008 session = self.client.session 1009 session['somekey'] = 'test' 1010 session.save() 1009 self.client.session['somekey'] = value 1010 self.client.session['anotherkey'] = value 1011 1011 1012 1012 .. _Cookie module documentation: http://docs.python.org/library/cookie.html 1013 1013 -
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 6757695..40848a1 100644
a b class SessionTests(TestCase): 691 691 self.assertEqual(response.status_code, 200) 692 692 self.assertEqual(response.content, 'YES') 693 693 694 def test_session_manipulation(self): 695 # Check that the session can be edited as documented before #10899. 696 session = self.client.session 697 session["session_var"] = "foo" 698 session.save() 699 700 response = self.client.get('/test_client_regress/check_session/') 701 self.assertEqual(response.status_code, 200) 702 self.assertEqual(response.content, 'foo') 703 704 def test_direct_session_manipulation(self): 705 # Add a value to the session 706 self.client.session['session_var'] = 'bar' 707 self.assertEqual(self.client.session['session_var'], 'bar') 708 709 # Check that the session has been modified 710 response = self.client.get('/test_client_regress/check_session/') 711 self.assertEqual(response.status_code, 200) 712 self.assertEqual(response.content, 'bar') 713 714 # Check that the session variable persists over login 715 # when cycle_key() is called 716 self.client.login(username='testclient', password='password') 717 self.assertEqual(self.client.session['session_var'], 'bar') 718 719 response = self.client.get('/test_client_regress/check_session/') 720 self.assertEqual(response.status_code, 200) 721 self.assertEqual(response.content, 'bar') 722 723 # Check that new session is started after logout 724 self.client.logout() 725 self.assertEqual(self.client.session.get('session_var'), None) 726 694 727 def test_logout(self): 695 728 """Logout should work whether the user is logged in or not (#9978).""" 696 729 self.client.logout() … … class SessionTests(TestCase): 699 732 self.client.logout() 700 733 self.client.logout() 701 734 735 702 736 class RequestMethodTests(TestCase): 703 737 def test_get(self): 704 738 "Request a view via request method GET"