Fixed #5189 -- Added logout method to test Client. Thanks, Jakub Wisniowski <restless.being@gmail.com>.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@5916 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2007-08-17 14:20:25 +00:00
parent 55c0b35acf
commit 8dff1cd91d
4 changed files with 42 additions and 3 deletions

View File

@ -284,6 +284,7 @@ answer newbie questions, and generally made Django that much better:
charly.wilhelm@gmail.com
Rachel Willmer <http://www.willmer.com/kb/>
Gary Wilson <gary.wilson@gmail.com>
Jakub Wiśniowski <restless.being@gmail.com>
wojtek
ye7cakf02@sneakemail.com
ymasuda@ethercube.com

View File

@ -253,3 +253,14 @@ class Client:
else:
return False
def logout(self):
"""Removes the authenticated user's cookies.
Causes the authenticated user to be logged out.
"""
try:
Session.objects.get(session_key=self.cookies['sessionid'].value).delete()
except KeyError:
pass
self.cookies = SimpleCookie()

View File

@ -550,6 +550,17 @@ Once you have a ``Client`` instance, you can call any of the following methods:
conditions. You'll need to create users as part of the test suite -- either
manually (using the Django model API) or with a test fixture.
``logout()``
**New in Django development version**
If your site uses Django's `authentication system`_, the ``logout()``
method can be used to simulate the effect of a user logging out of
your site.
After you call this method, the test client will have all the cookies and
session data cleared to defaults. Subsequent requests will appear to
come from an AnonymousUser.
.. _authentication system: ../authentication/
.. _authentication backend: ../authentication/#other-authentication-sources
@ -758,7 +769,7 @@ Here's specifically what will happen:
* At the start of each test case, before ``setUp()`` is run, Django will
flush the database, returning the database to the state it was in
directly after ``syncdb`` was called.
* Then, all the named fixtures are installed. In this example, Django will
install any JSON fixture named ``mammals``, followed by any fixture named
``birds``. See the `loaddata documentation`_ for more details on defining
@ -843,7 +854,7 @@ The test runner accomplishes this by transparently replacing the normal
effect on any other e-mail senders outside of Django, such as your machine's
mail server, if you're running one.)
During test running, each outgoing e-mail is saved in
During test running, each outgoing e-mail is saved in
``django.core.mail.outbox``. This is a simple list of all `EmailMessage`_
instances that have been sent. It does not exist under normal execution
conditions, i.e., when you're not running unit tests. The outbox is created
@ -977,7 +988,7 @@ a number of utility methods in the ``django.test.utils`` module.
``autoclobber`` describes the behavior that will occur if a database with
the same name as the test database is discovered:
* If ``autoclobber`` is ``False``, the user will be asked to approve
destroying the existing database. ``sys.exit`` is called if the user
does not approve.

View File

@ -246,6 +246,22 @@ class ClientTest(TestCase):
login = self.client.login(username='inactive', password='password')
self.failIf(login)
def test_logout(self):
# Log in
self.client.login(username='testclient', password='password')
# Request a page that requires a login
response = self.client.get('/test_client/login_protected_view/')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['user'].username, 'testclient')
# Log out
self.client.logout()
# Request a page that requires a login
response = self.client.get('/test_client/login_protected_view/')
self.assertRedirects(response, '/accounts/login/')
def test_session_modifying_view(self):
"Request a page that modifies the session"
# Session value isn't set initially