Skip to content

Commit

Permalink
Fixed #5189 -- Added logout method to test Client. Thanks, Jakub Wisn…
Browse files Browse the repository at this point in the history
…iowski <restless.being@gmail.com>.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@5916 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
freakboy3742 committed Aug 17, 2007
1 parent 55c0b35 commit 8dff1cd
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 3 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 11 additions & 0 deletions django/test/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,3 +253,14 @@ def login(self, **credentials):
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()
17 changes: 14 additions & 3 deletions docs/testing.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
16 changes: 16 additions & 0 deletions tests/modeltests/test_client/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,22 @@ def test_view_with_inactive_login(self):
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
Expand Down

0 comments on commit 8dff1cd

Please sign in to comment.