Merge pull request #15 from medmunds/test_admin_views

Admin tests and fixes
This commit is contained in:
Mike Edmunds
2012-12-10 10:58:21 -08:00
8 changed files with 106 additions and 14 deletions

View File

@@ -27,7 +27,11 @@ class DjrillAdminSite(AdminSite):
def get_urls(self): def get_urls(self):
"""Add our custom views to the admin urlconf.""" """Add our custom views to the admin urlconf."""
urls = super(DjrillAdminSite, self).get_urls() urls = super(DjrillAdminSite, self).get_urls()
from django.conf.urls.defaults import patterns, url try:
from django.conf.urls import include, patterns, url
except ImportError:
# Django 1.3
from django.conf.urls.defaults import include, patterns, url
for path, view, name, display_name in self.custom_views: for path, view, name, display_name in self.custom_views:
urls += patterns('', urls += patterns('',
url(r'^%s$' % path, self.admin_view(view), name=name), url(r'^%s$' % path, self.admin_view(view), name=name),

View File

@@ -4,6 +4,9 @@ from djrill.views import (DjrillIndexView, DjrillSendersListView,
DjrillTagListView, DjrillTagListView,
DjrillUrlListView) DjrillUrlListView)
# Only try to register Djrill admin views if DjrillAdminSite
# or django-adminplus is in use
if hasattr(admin.site,'register_view'):
admin.site.register_view("djrill/senders/", DjrillSendersListView.as_view(), admin.site.register_view("djrill/senders/", DjrillSendersListView.as_view(),
"djrill_senders", "senders") "djrill_senders", "senders")
admin.site.register_view("djrill/status/", DjrillIndexView.as_view(), admin.site.register_view("djrill/status/", DjrillIndexView.as_view(),

View File

@@ -1,5 +1,5 @@
{% extends "admin/base_site.html" %} {% extends "admin/base_site.html" %}
{% load adminmedia admin_list i18n %} {% load admin_list i18n %}
{% load url from future %} {% load url from future %}
{% block extrastyle %} {% block extrastyle %}
{{ block.super }} {{ block.super }}

View File

@@ -1,5 +1,5 @@
{% extends "admin/base_site.html" %} {% extends "admin/base_site.html" %}
{% load adminmedia admin_list i18n %} {% load admin_list i18n %}
{% load url from future %} {% load url from future %}
{% block extrastyle %} {% block extrastyle %}
{{ block.super }} {{ block.super }}

View File

@@ -1,5 +1,5 @@
{% extends "admin/base_site.html" %} {% extends "admin/base_site.html" %}
{% load adminmedia admin_list i18n %} {% load admin_list i18n %}
{% load url from future %} {% load url from future %}
{% block extrastyle %} {% block extrastyle %}
{{ block.super }} {{ block.super }}

View File

@@ -1,5 +1,5 @@
{% extends "admin/base_site.html" %} {% extends "admin/base_site.html" %}
{% load adminmedia admin_list i18n %} {% load admin_list i18n %}
{% load url from future %} {% load url from future %}
{% block extrastyle %} {% block extrastyle %}
{{ block.super }} {{ block.super }}

16
djrill/test_admin_urls.py Normal file
View File

@@ -0,0 +1,16 @@
try:
from django.conf.urls import include, patterns, url
except ImportError:
# Django 1.3
from django.conf.urls.defaults import include, patterns, url
from django.contrib import admin
from djrill import DjrillAdminSite
admin.site = DjrillAdminSite()
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
)

View File

@@ -1,6 +1,9 @@
from mock import patch from mock import patch
import sys
from django.conf import settings from django.conf import settings
from django.contrib import admin
from django.contrib.auth.models import User
from django.core import mail from django.core import mail
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.test import TestCase from django.test import TestCase
@@ -13,8 +16,9 @@ class DjrillBackendMockAPITestCase(TestCase):
class MockResponse: class MockResponse:
"""requests.post return value mock sufficient for DjrillBackend""" """requests.post return value mock sufficient for DjrillBackend"""
def __init__(self, status_code=200): def __init__(self, status_code=200, content="{}"):
self.status_code = status_code self.status_code = status_code
self.content = content
def setUp(self): def setUp(self):
self.patch = patch('requests.post') self.patch = patch('requests.post')
@@ -146,6 +150,71 @@ class DjrillBackendTests(DjrillBackendMockAPITestCase):
self.assertEqual(sent, 0) self.assertEqual(sent, 0)
def reset_admin_site():
"""Return the Django admin globals to their original state"""
admin.site = admin.AdminSite() # restore default
if 'djrill.admin' in sys.modules:
del sys.modules['djrill.admin'] # force autodiscover to re-import
class DjrillAdminTests(DjrillBackendMockAPITestCase):
"""Test the Djrill admin site"""
# These tests currently just verify that the admin site pages load
# without error -- they don't test any Mandrill-supplied content.
# (Future improvements could mock the Mandrill responses.)
# These urls set up the DjrillAdminSite as suggested in the readme
urls = 'djrill.test_admin_urls'
@classmethod
def setUpClass(cls):
# Other test cases may muck with the Django admin site globals,
# so return it to the default state before loading test_admin_urls
reset_admin_site()
def setUp(self):
super(DjrillAdminTests, self).setUp()
# Must be authenticated staff to access admin site...
admin = User.objects.create_user('admin', 'admin@example.com', 'secret')
admin.is_staff = True
admin.save()
self.client.login(username='admin', password='secret')
def test_admin_senders(self):
response = self.client.get('/admin/djrill/senders/')
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Senders")
def test_admin_status(self):
response = self.client.get('/admin/djrill/status/')
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Status")
def test_admin_tags(self):
response = self.client.get('/admin/djrill/tags/')
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Tags")
def test_admin_urls(self):
response = self.client.get('/admin/djrill/urls/')
self.assertEqual(response.status_code, 200)
self.assertContains(response, "URLs")
def test_admin_index(self):
"""Make sure Djrill section is included in the admin index page"""
response = self.client.get('/admin/')
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Djrill")
class DjrillNoAdminTests(TestCase):
def test_admin_autodiscover_without_djrill(self):
"""Make sure autodiscover doesn't die without DjrillAdminSite"""
reset_admin_site()
admin.autodiscover() # test: this shouldn't error
class DjrillMessageTests(TestCase): class DjrillMessageTests(TestCase):
def setUp(self): def setUp(self):
self.subject = "Djrill baby djrill." self.subject = "Djrill baby djrill."