Created
October 24, 2011 22:19
-
-
Save prestontimmons/1310549 to your computer and use it in GitHub Desktop.
Lazy man's Django testcase
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Decrease the verbosity of writing view tests. | |
Old way: | |
self.client.get(reverse("my-view")) | |
self.client.post(reverse("my-view"), data={"key": "value"}) | |
self.client.login("username", "password") | |
self.client.get(reverse("my-other-view")) | |
self.client.logout() | |
self.client.post(reverse("my-other-view"), data={"key": "value"} | |
self.assertEqual(response.status_code, 302) | |
self.assertEqual(response["Location"], "http://remoteserver/") | |
session = self.client.session | |
session["key"] = "value" | |
session.save() | |
New way: | |
self.client.get("my-view") | |
self.client.post("my-view", data={"key": "value"}) | |
with self.login("username", "password"): | |
self.client.get("my-other-view") | |
self.assertRedirectsTo(response, "http://remoteserver/") | |
session = self.session | |
session["key"] = "value" | |
session.save() | |
By default also patches the template loader and initiates the client session. | |
""" | |
from django.conf import settings | |
from django.core.urlresolvers import reverse | |
from django.template import Template | |
from django.test import TestCase | |
from django.utils.importlib import import_module | |
import django.template.loader | |
class login(object): | |
def __init__(self, testcase, user, password): | |
self.testcase = testcase | |
success = testcase.client.login(username=user, password=password) | |
self.testcase.assertTrue( | |
success, | |
"login with username=%r, password=%r failed" % (user, password) | |
) | |
def __enter__(self): | |
pass | |
def __exit__(self, *args): | |
self.testcase.client.logout() | |
class LazyTestCase(TestCase): | |
patch_templates = True | |
def login(self, user, password): | |
return login(self, user, password) | |
def get(self, url_name, data=None, *args, **kwargs): | |
data = data or {} | |
return self.client.get( | |
reverse(url_name, args=args, kwargs=kwargs), data | |
) | |
def post(self, url_name, data=None, *args, **kwargs): | |
return self.client.post( | |
reverse(url_name, args=args, kwargs=kwargs), data | |
) | |
@property | |
def session(self): | |
return self.client.session | |
def load_data(self): | |
return | |
def setUp(self): | |
if self.patch_templates: | |
self.get_template = django.template.loader.get_template | |
def get_template(*args, **kwargs): | |
return Template("") | |
django.template.loader.get_template = get_template | |
if "django.contrib.sessions" in settings.INSTALLED_APPS: | |
# Workaround for https://code.djangoproject.com/ticket/15740 | |
engine = import_module(settings.SESSION_ENGINE) | |
store = engine.SessionStore() | |
store.save() | |
self.client.cookies[settings.SESSION_COOKIE_NAME] = store.session_key | |
self.load_data() | |
def tearDown(self): | |
if self.patch_templates: | |
django.template.loader.get_template = self.get_template | |
def assertRedirectsTo(self, response, url): | |
""" | |
Assert that a response redirects to a specific url without trying to | |
load the other page. | |
""" | |
self.assertEqual(response.status_code, 302) | |
self.assertEqual(response["Location"], url) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment