mirror of
https://github.com/django/django.git
synced 2025-08-04 10:59:45 +00:00
Fixed #13922 -- Updated resolve() to support namespaces. Thanks to Nowell Strite for the report and patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@13479 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
aa93f8c2f0
commit
e0fb90b2f3
5 changed files with 172 additions and 11 deletions
|
@ -7,7 +7,11 @@ urlpatterns = patterns('regressiontests.urlpatterns_reverse.views',
|
|||
url(r'^normal/$', 'empty_view', name='inc-normal-view'),
|
||||
url(r'^normal/(?P<arg1>\d+)/(?P<arg2>\d+)/$', 'empty_view', name='inc-normal-view'),
|
||||
|
||||
url(r'^mixed_args/(\d+)/(?P<arg2>\d+)/$', 'empty_view', name='inc-mixed-args'),
|
||||
url(r'^no_kwargs/(\d+)/(\d+)/$', 'empty_view', name='inc-no-kwargs'),
|
||||
|
||||
(r'^test3/', include(testobj3.urls)),
|
||||
(r'^ns-included3/', include('regressiontests.urlpatterns_reverse.included_urls', namespace='inc-ns3')),
|
||||
(r'^ns-included4/', include('regressiontests.urlpatterns_reverse.namespace_urls', namespace='inc-ns4')),
|
||||
)
|
||||
|
||||
|
|
|
@ -23,6 +23,9 @@ urlpatterns = patterns('regressiontests.urlpatterns_reverse.views',
|
|||
url(r'^normal/$', 'empty_view', name='normal-view'),
|
||||
url(r'^normal/(?P<arg1>\d+)/(?P<arg2>\d+)/$', 'empty_view', name='normal-view'),
|
||||
|
||||
url(r'^mixed_args/(\d+)/(?P<arg2>\d+)/$', 'empty_view', name='mixed-args'),
|
||||
url(r'^no_kwargs/(\d+)/(\d+)/$', 'empty_view', name='no-kwargs'),
|
||||
|
||||
(r'^test1/', include(testobj1.urls)),
|
||||
(r'^test2/', include(testobj2.urls)),
|
||||
(r'^default/', include(default_testobj.urls)),
|
||||
|
|
|
@ -18,7 +18,7 @@ import unittest
|
|||
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.core.urlresolvers import reverse, resolve, NoReverseMatch, Resolver404
|
||||
from django.core.urlresolvers import reverse, resolve, NoReverseMatch, Resolver404, ResolverMatch
|
||||
from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect
|
||||
from django.shortcuts import redirect
|
||||
from django.test import TestCase
|
||||
|
@ -26,6 +26,35 @@ from django.test import TestCase
|
|||
import urlconf_outer
|
||||
import urlconf_inner
|
||||
import middleware
|
||||
import views
|
||||
|
||||
resolve_test_data = (
|
||||
# These entries are in the format: (path, url_name, app_name, namespace, view_func, args, kwargs)
|
||||
# Simple case
|
||||
('/normal/42/37/', 'normal-view', None, '', views.empty_view, tuple(), {'arg1': '42', 'arg2': '37'}),
|
||||
('/included/normal/42/37/', 'inc-normal-view', None, '', views.empty_view, tuple(), {'arg1': '42', 'arg2': '37'}),
|
||||
|
||||
# Unnamed args are dropped if you have *any* kwargs in a pattern
|
||||
('/mixed_args/42/37/', 'mixed-args', None, '', views.empty_view, tuple(), {'arg2': '37'}),
|
||||
('/included/mixed_args/42/37/', 'inc-mixed-args', None, '', views.empty_view, tuple(), {'arg2': '37'}),
|
||||
|
||||
# If you have no kwargs, you get an args list.
|
||||
('/no_kwargs/42/37/', 'no-kwargs', None, '', views.empty_view, ('42','37'), {}),
|
||||
('/included/no_kwargs/42/37/', 'inc-no-kwargs', None, '', views.empty_view, ('42','37'), {}),
|
||||
|
||||
# Namespaces
|
||||
('/test1/inner/42/37/', 'urlobject-view', 'testapp', 'test-ns1', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}),
|
||||
('/included/test3/inner/42/37/', 'urlobject-view', 'testapp', 'test-ns3', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}),
|
||||
('/ns-included1/normal/42/37/', 'inc-normal-view', None, 'inc-ns1', views.empty_view, tuple(), {'arg1': '42', 'arg2': '37'}),
|
||||
('/included/test3/inner/42/37/', 'urlobject-view', 'testapp', 'test-ns3', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}),
|
||||
('/default/inner/42/37/', 'urlobject-view', 'testapp', 'testapp', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}),
|
||||
('/other2/inner/42/37/', 'urlobject-view', 'nodefault', 'other-ns2', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}),
|
||||
('/other1/inner/42/37/', 'urlobject-view', 'nodefault', 'other-ns1', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}),
|
||||
|
||||
# Nested namespaces
|
||||
('/ns-included1/test3/inner/42/37/', 'urlobject-view', 'testapp', 'inc-ns1:test-ns3', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}),
|
||||
('/ns-included1/ns-included4/ns-included2/test3/inner/42/37/', 'urlobject-view', 'testapp', 'inc-ns1:inc-ns4:inc-ns2:test-ns3', 'empty_view', tuple(), {'arg1': '42', 'arg2': '37'}),
|
||||
)
|
||||
|
||||
test_data = (
|
||||
('places', '/places/3/', [3], {}),
|
||||
|
@ -229,6 +258,12 @@ class NamespaceTests(TestCase):
|
|||
self.assertEquals('/ns-included1/test3/inner/37/42/', reverse('inc-ns1:test-ns3:urlobject-view', args=[37,42]))
|
||||
self.assertEquals('/ns-included1/test3/inner/42/37/', reverse('inc-ns1:test-ns3:urlobject-view', kwargs={'arg1':42, 'arg2':37}))
|
||||
|
||||
def test_nested_namespace_pattern(self):
|
||||
"Namespaces can be nested"
|
||||
self.assertEquals('/ns-included1/ns-included4/ns-included1/test3/inner/', reverse('inc-ns1:inc-ns4:inc-ns1:test-ns3:urlobject-view'))
|
||||
self.assertEquals('/ns-included1/ns-included4/ns-included1/test3/inner/37/42/', reverse('inc-ns1:inc-ns4:inc-ns1:test-ns3:urlobject-view', args=[37,42]))
|
||||
self.assertEquals('/ns-included1/ns-included4/ns-included1/test3/inner/42/37/', reverse('inc-ns1:inc-ns4:inc-ns1:test-ns3:urlobject-view', kwargs={'arg1':42, 'arg2':37}))
|
||||
|
||||
def test_app_lookup_object(self):
|
||||
"A default application namespace can be used for lookup"
|
||||
self.assertEquals('/default/inner/', reverse('testapp:urlobject-view'))
|
||||
|
@ -317,3 +352,29 @@ class NoRootUrlConfTests(TestCase):
|
|||
|
||||
def test_no_handler_exception(self):
|
||||
self.assertRaises(ImproperlyConfigured, self.client.get, '/test/me/')
|
||||
|
||||
class ResolverMatchTests(TestCase):
|
||||
urls = 'regressiontests.urlpatterns_reverse.namespace_urls'
|
||||
|
||||
def test_urlpattern_resolve(self):
|
||||
for path, name, app_name, namespace, func, args, kwargs in resolve_test_data:
|
||||
# Test legacy support for extracting "function, args, kwargs"
|
||||
match_func, match_args, match_kwargs = resolve(path)
|
||||
self.assertEqual(match_func, func)
|
||||
self.assertEqual(match_args, args)
|
||||
self.assertEqual(match_kwargs, kwargs)
|
||||
|
||||
# Test ResolverMatch capabilities.
|
||||
match = resolve(path)
|
||||
self.assertEqual(match.__class__, ResolverMatch)
|
||||
self.assertEqual(match.url_name, name)
|
||||
self.assertEqual(match.args, args)
|
||||
self.assertEqual(match.kwargs, kwargs)
|
||||
self.assertEqual(match.app_name, app_name)
|
||||
self.assertEqual(match.namespace, namespace)
|
||||
self.assertEqual(match.func, func)
|
||||
|
||||
# ... and for legacy purposes:
|
||||
self.assertEquals(match[0], func)
|
||||
self.assertEquals(match[1], args)
|
||||
self.assertEquals(match[2], kwargs)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue