diff options
| author | Helen Sherwood-Taylor <helen@rrdlabs.co.uk> | 2016-08-12 19:07:24 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-08-20 10:02:22 -0400 |
| commit | ae0f55eb491255217d6df31296ec8102007224a6 (patch) | |
| tree | cac9bf607a4ba6483585350d55a74b3f2f8eea1b /tests | |
| parent | 7c0c3fb6b1d932bc33e7dcc8f16e31cd39992f9b (diff) | |
[1.10.x] 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.
Backport of bc1e2d8e8edde6cc7d2657c68242a13ee65a15b8 from master
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/admin_docs/tests.py | 21 | ||||
| -rw-r--r-- | tests/urlpatterns_reverse/method_view_urls.py | 18 | ||||
| -rw-r--r-- | tests/urlpatterns_reverse/tests.py | 8 |
3 files changed, 47 insertions, 0 deletions
diff --git a/tests/admin_docs/tests.py b/tests/admin_docs/tests.py index e3091738a8..26e9c04d29 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 |
