summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorHelen Sherwood-Taylor <helen@rrdlabs.co.uk>2016-08-12 19:07:24 +0100
committerTim Graham <timograham@gmail.com>2016-08-20 10:01:57 -0400
commitbc1e2d8e8edde6cc7d2657c68242a13ee65a15b8 (patch)
tree2de98fbc0a4b8202b6272484029d29cab553adb3 /tests
parent00bb47b58f974277330f9845aee0702f7a46d736 (diff)
Fixed #27018 -- Fixed admindocs crash with a view in a class.
Generated correct admindocs URLs on Python 3. URLs generate 404s on Python 2, as in older versions of Django.
Diffstat (limited to 'tests')
-rw-r--r--tests/admin_docs/tests.py21
-rw-r--r--tests/urlpatterns_reverse/method_view_urls.py18
-rw-r--r--tests/urlpatterns_reverse/tests.py8
3 files changed, 47 insertions, 0 deletions
diff --git a/tests/admin_docs/tests.py b/tests/admin_docs/tests.py
index 82384a4bb8..f57a9c8117 100644
--- a/tests/admin_docs/tests.py
+++ b/tests/admin_docs/tests.py
@@ -9,6 +9,7 @@ from django.contrib.sites.models import Site
from django.test import TestCase, modify_settings, override_settings
from django.test.utils import captured_stderr
from django.urls import reverse
+from django.utils import six
from .models import Company, Person
@@ -82,6 +83,18 @@ class AdminDocViewTests(TestDataMixin, AdminDocsTestCase):
self.assertContains(response, 'Views by namespace test')
self.assertContains(response, 'Name: <code>test:func</code>.')
+ @unittest.skipIf(six.PY2, "Python 2 doesn't support __qualname__.")
+ def test_view_index_with_method(self):
+ """
+ Views that are methods are listed correctly.
+ """
+ response = self.client.get(reverse('django-admindocs-views-index'))
+ self.assertContains(
+ response,
+ '<h3><a href="/admindocs/views/django.contrib.admin.sites.AdminSite.index/">/admin/</a></h3>',
+ html=True
+ )
+
def test_view_detail(self):
url = reverse('django-admindocs-views-detail', args=['django.contrib.admindocs.views.BaseAdminDocsView'])
response = self.client.get(url)
@@ -103,6 +116,14 @@ class AdminDocViewTests(TestDataMixin, AdminDocsTestCase):
self.assertEqual(response.status_code, 404)
self.assertNotIn("urlpatterns_reverse.nonimported_module", sys.modules)
+ def test_view_detail_as_method(self):
+ """
+ Views that are methods can be displayed.
+ """
+ url = reverse('django-admindocs-views-detail', args=['django.contrib.admin.sites.AdminSite.index'])
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200 if six.PY3 else 404)
+
def test_model_index(self):
response = self.client.get(reverse('django-admindocs-models-index'))
self.assertContains(
diff --git a/tests/urlpatterns_reverse/method_view_urls.py b/tests/urlpatterns_reverse/method_view_urls.py
new file mode 100644
index 0000000000..d2f24ecffa
--- /dev/null
+++ b/tests/urlpatterns_reverse/method_view_urls.py
@@ -0,0 +1,18 @@
+from django.conf.urls import url
+
+
+class ViewContainer(object):
+ def method_view(self, request):
+ pass
+
+ @classmethod
+ def classmethod_view(cls, request):
+ pass
+
+view_container = ViewContainer()
+
+
+urlpatterns = [
+ url(r'^$', view_container.method_view, name='instance-method-url'),
+ url(r'^$', ViewContainer.classmethod_view, name='instance-method-url'),
+]
diff --git a/tests/urlpatterns_reverse/tests.py b/tests/urlpatterns_reverse/tests.py
index 67a4370e78..522899e886 100644
--- a/tests/urlpatterns_reverse/tests.py
+++ b/tests/urlpatterns_reverse/tests.py
@@ -6,6 +6,7 @@ from __future__ import unicode_literals
import sys
import threading
+import unittest
from admin_scripts.tests import AdminScriptTestCase
@@ -430,6 +431,13 @@ class ResolverTests(SimpleTestCase):
self.assertTrue(resolver._is_callback('urlpatterns_reverse.nested_urls.View3'))
self.assertFalse(resolver._is_callback('urlpatterns_reverse.nested_urls.blub'))
+ @unittest.skipIf(six.PY2, "Python 2 doesn't support __qualname__.")
+ def test_view_detail_as_method(self):
+ # Views which have a class name as part of their path.
+ resolver = get_resolver('urlpatterns_reverse.method_view_urls')
+ self.assertTrue(resolver._is_callback('urlpatterns_reverse.method_view_urls.ViewContainer.method_view'))
+ self.assertTrue(resolver._is_callback('urlpatterns_reverse.method_view_urls.ViewContainer.classmethod_view'))
+
def test_populate_concurrency(self):
"""
RegexURLResolver._populate() can be called concurrently, but not more