Author: russellm
Date: 2010-03-19 00:43:32 -0500 (Fri, 19 Mar 2010)
New Revision: 12807

Added:
   
django/branches/releases/1.1.X/tests/regressiontests/test_client_regress/session.py
Modified:
   django/branches/releases/1.1.X/django/test/client.py
   
django/branches/releases/1.1.X/tests/regressiontests/test_client_regress/models.py
Log:
[1.1.X] Fixed #13152 -- Ensure the test client saves the session before writing 
the session key to the cookie, in case the session engine changes the session 
key.

Backport of r12806 from trunk.

Modified: django/branches/releases/1.1.X/django/test/client.py
===================================================================
--- django/branches/releases/1.1.X/django/test/client.py        2010-03-19 
05:42:13 UTC (rev 12806)
+++ django/branches/releases/1.1.X/django/test/client.py        2010-03-19 
05:43:32 UTC (rev 12807)
@@ -423,6 +423,9 @@
                 request.session = engine.SessionStore()
             login(request, user)
 
+            # Save the session values.
+            request.session.save()
+
             # Set the cookie to represent the session.
             session_cookie = settings.SESSION_COOKIE_NAME
             self.cookies[session_cookie] = request.session.session_key
@@ -435,9 +438,6 @@
             }
             self.cookies[session_cookie].update(cookie_data)
 
-            # Save the session values.
-            request.session.save()
-
             return True
         else:
             return False

Modified: 
django/branches/releases/1.1.X/tests/regressiontests/test_client_regress/models.py
===================================================================
--- 
django/branches/releases/1.1.X/tests/regressiontests/test_client_regress/models.py
  2010-03-19 05:42:13 UTC (rev 12806)
+++ 
django/branches/releases/1.1.X/tests/regressiontests/test_client_regress/models.py
  2010-03-19 05:43:32 UTC (rev 12807)
@@ -385,6 +385,27 @@
         # default client.
         self.assertRedirects(response, 
"http://testserver/test_client_regress/get_view/";)
 
+
+class SessionEngineTests(TestCase):
+    fixtures = ['testdata']
+
+    def setUp(self):
+        self.old_SESSION_ENGINE = settings.SESSION_ENGINE
+        settings.SESSION_ENGINE = 'regressiontests.test_client_regress.session'
+
+    def tearDown(self):
+        settings.SESSION_ENGINE = self.old_SESSION_ENGINE
+
+    def test_login(self):
+        "A session engine that modifies the session key can be used to log in"
+        login = self.client.login(username='testclient', password='password')
+        self.failUnless(login, 'Could not log in')
+
+        # Try to access a login protected page.
+        response = self.client.get("/test_client/login_protected_view/")
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.context['user'].username, 'testclient')
+
 class URLEscapingTests(TestCase):
     def test_simple_argument_get(self):
         "Get a view that has a simple string argument"

Added: 
django/branches/releases/1.1.X/tests/regressiontests/test_client_regress/session.py
===================================================================
--- 
django/branches/releases/1.1.X/tests/regressiontests/test_client_regress/session.py
                         (rev 0)
+++ 
django/branches/releases/1.1.X/tests/regressiontests/test_client_regress/session.py
 2010-03-19 05:43:32 UTC (rev 12807)
@@ -0,0 +1,30 @@
+from django.contrib.sessions.backends.base import SessionBase
+
+class SessionStore(SessionBase):
+    """
+    A simple cookie-based session storage implemenation.
+
+    The session key is actually the session data, pickled and encoded.
+    This means that saving the session will change the session key.
+    """
+    def __init__(self, session_key=None):
+        super(SessionStore, self).__init__(session_key)
+
+    def exists(self, session_key):
+        return False
+
+    def create(self):
+        self.session_key = self.encode({})
+
+    def save(self, must_create=False):
+        self.session_key = self.encode(self._session)
+
+    def delete(self, session_key=None):
+        self.session_key = self.encode({})
+
+    def load(self):
+        try:
+            return self.decode(self.session_key)
+        except:
+            self.modified = True
+            return {}
\ No newline at end of file

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to