diff --git a/django/test/client.py b/django/test/client.py index f4435c090f..b144fe2fdb 100644 --- a/django/test/client.py +++ b/django/test/client.py @@ -334,10 +334,12 @@ class Client(object): def logout(self): """ - Removes the authenticated user's cookies. + Removes the authenticated user's cookies and session object. Causes the authenticated user to be logged out. """ session = __import__(settings.SESSION_ENGINE, {}, {}, ['']).SessionStore() - session.delete(session_key=self.cookies[settings.SESSION_COOKIE_NAME].value) + session_cookie = self.cookies.get(settings.SESSION_COOKIE_NAME) + if session_cookie: + session.delete(session_key=session_cookie.value) self.cookies = SimpleCookie() diff --git a/tests/modeltests/test_client/models.py b/tests/modeltests/test_client/models.py index 2cca618b4e..a0900ec2c3 100644 --- a/tests/modeltests/test_client/models.py +++ b/tests/modeltests/test_client/models.py @@ -411,4 +411,3 @@ class ClientTest(TestCase): self.assertEqual(mail.outbox[1].from_email, 'from@example.com') self.assertEqual(mail.outbox[1].to[0], 'second@example.com') self.assertEqual(mail.outbox[1].to[1], 'third@example.com') - diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py index 1bffc7d225..14adec0475 100644 --- a/tests/regressiontests/test_client_regress/models.py +++ b/tests/regressiontests/test_client_regress/models.py @@ -309,17 +309,17 @@ class ExceptionTests(TestCase): self.client.get("/test_client_regress/staff_only/") except SuspiciousOperation: self.fail("Staff should be able to visit this page") - + class TemplateExceptionTests(TestCase): def setUp(self): self.old_templates = settings.TEMPLATE_DIRS settings.TEMPLATE_DIRS = () - + def tearDown(self): settings.TEMPLATE_DIRS = self.old_templates - + def test_no_404_template(self): - "Missing templates are correctly reported by test client" + "Missing templates are correctly reported by test client" try: response = self.client.get("/no_such_view/") self.fail("Should get error about missing template") @@ -334,7 +334,7 @@ class TemplateExceptionTests(TestCase): self.fail("Should get error about syntax error in template") except TemplateSyntaxError: pass - + # We need two different tests to check URLconf substitution - one to check # it was changed, and another one (without self.urls) to check it was reverted on # teardown. This pair of tests relies upon the alphabetical ordering of test execution. @@ -382,4 +382,11 @@ class SessionTests(TestCase): response = self.client.get('/test_client_regress/check_session/') self.assertEqual(response.status_code, 200) self.assertEqual(response.content, 'YES') - \ No newline at end of file + + def test_logout(self): + """Logout should work whether the user is logged in or not (#9978).""" + self.client.logout() + login = self.client.login(username='testclient',password='password') + self.failUnless(login, 'Could not log in') + self.client.logout() + self.client.logout()