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 charly.wilhelm@gmail.com
Rachel Willmer <http://www.willmer.com/kb/> Rachel Willmer <http://www.willmer.com/kb/>
Gary Wilson <gary.wilson@gmail.com> Gary Wilson <gary.wilson@gmail.com>
Jakub Wiśniowski <restless.being@gmail.com>
wojtek wojtek
ye7cakf02@sneakemail.com ye7cakf02@sneakemail.com
ymasuda@ethercube.com ymasuda@ethercube.com

View File

@ -253,3 +253,14 @@ class Client:
else: else:
return False 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 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. 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 system: ../authentication/
.. _authentication backend: ../authentication/#other-authentication-sources .. _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 * 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 flush the database, returning the database to the state it was in
directly after ``syncdb`` was called. directly after ``syncdb`` was called.
* Then, all the named fixtures are installed. In this example, Django will * Then, all the named fixtures are installed. In this example, Django will
install any JSON fixture named ``mammals``, followed by any fixture named install any JSON fixture named ``mammals``, followed by any fixture named
``birds``. See the `loaddata documentation`_ for more details on defining ``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 effect on any other e-mail senders outside of Django, such as your machine's
mail server, if you're running one.) 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`_ ``django.core.mail.outbox``. This is a simple list of all `EmailMessage`_
instances that have been sent. It does not exist under normal execution 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 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 ``autoclobber`` describes the behavior that will occur if a database with
the same name as the test database is discovered: the same name as the test database is discovered:
* If ``autoclobber`` is ``False``, the user will be asked to approve * If ``autoclobber`` is ``False``, the user will be asked to approve
destroying the existing database. ``sys.exit`` is called if the user destroying the existing database. ``sys.exit`` is called if the user
does not approve. does not approve.

View File

@ -246,6 +246,22 @@ class ClientTest(TestCase):
login = self.client.login(username='inactive', password='password') login = self.client.login(username='inactive', password='password')
self.failIf(login) 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): def test_session_modifying_view(self):
"Request a page that modifies the session" "Request a page that modifies the session"
# Session value isn't set initially # Session value isn't set initially