If you want to test for trivial error in your add and changelist admin views, use this snippet.
Save the snippet in admintests.py and put it anywhere in your pythonpath.
Put this code in your tests.py:
from django.test import TestCase
from admintest import adminviews_test
class TestAdminViews(TestCase):
def test_admin_views(self):
adminviews_test(self)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #!/usr/bin/env python
# -*- coding: utf-8 -
#
# @contact: [email protected]
# @version: 1.0
# @license: MIT http://www.opensource.org/licenses/mit-license.php
#
from django.db.models.base import ModelBase
from django.core.urlresolvers import reverse, NoReverseMatch
from django.contrib import admin
from django.contrib.auth.models import User
def adminviews_test(self, user=None, password=None):
if user is None:
if password is None:
password = "test"
user = User.objects.create_superuser('test', '[email protected]', password)
self.client.login(username = user.username, password = password)
pkg = self.__module__.rpartition('.')[0]
if pkg.endswith(".tests"):
pkg = pkg[:-6]
models_mod = __import__(pkg + ".models")
if not getattr(models_mod, "models", None):
return
for id_ in dir(models_mod.models):
model = getattr(models_mod.models, id_)
# Get ModelAdmin for this Model
if isinstance(model, ModelBase) and model._meta.app_label == pkg and model in admin.site._registry:
try:
# Prevent error 405 if model_admin.has_add_permission always return False
if admin.site._registry[model].has_add_permission(type("request", (), {"user": user})):
url = reverse("admin:%s_%s_add" % (model._meta.app_label, model._meta.module_name))
response = self.client.get(url, follow = True)
self.failUnlessEqual(response.status_code, 200,
"%s != %s -> %s, url: %s" % (response.status_code, 200, repr(model), url))
self.assertFalse("this_is_the_login_form" in response.content,
"login requested for %s" % str(model))
url = reverse("admin:%s_%s_changelist" %
(model._meta.app_label, model._meta.module_name))
response = self.client.get(url, follow = True)
self.failUnlessEqual(response.status_code, 200,
"%s != %s -> %s, url: %s" % (response.status_code, 200, repr(model), url))
self.assertFalse("this_is_the_login_form" in response.content,
"login requested for %s" % str(model))
except NoReverseMatch:
continue
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 11 months, 3 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 11 months, 4 weeks ago
- Serializer factory with Django Rest Framework by julio 1 year, 6 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 7 months ago
- Help text hyperlinks by sa2812 1 year, 8 months ago
Comments
It doesn't work at django 1.4.5 :(
At the top instructions it's missing a 's' at admintests:
from admintests import adminviews_test
#
I was able to get it working in 1.6.
You must call admin.autodiscover()
It does not support app names like "foo.bar" but you can hack on it to make it work.
#
It's necessary to call admin.autodiscover() to populate admin.site._registry. There's also an easier way to retrieve models, using
instead of:
you might also need to check that pkg value is ok for this check: model._meta.app_label == pkg
#
Please login first before commenting.