From 015a9b928af233ca036b93a4d7eecf18f15cbc2b Mon Sep 17 00:00:00 2001 From: Bas Peschier Date: Thu, 19 Mar 2015 08:56:38 +0100 Subject: [1.8.x] Fixed #13525 -- Added tests and docs for nested parameters in URL patterns. When reversing, only outer parameters are used if captured parameters are nested. Added tests to check the edge cases and documentation for the behavior with an example to avoid it. Backport of 23a5d64f40b0f4a3fbfef7427ca793cb1df1034e from master --- tests/urlpatterns_reverse/tests.py | 17 +++++++++++++++++ tests/urlpatterns_reverse/urls.py | 6 ++++++ 2 files changed, 23 insertions(+) (limited to 'tests/urlpatterns_reverse') diff --git a/tests/urlpatterns_reverse/tests.py b/tests/urlpatterns_reverse/tests.py index 7c8c17a928..8f8496a515 100644 --- a/tests/urlpatterns_reverse/tests.py +++ b/tests/urlpatterns_reverse/tests.py @@ -94,6 +94,12 @@ test_data = ( ('people_backref', '/people/nate-nate/', [], {'name': 'nate'}), ('optional', '/optional/fred/', [], {'name': 'fred'}), ('optional', '/optional/fred/', ['fred'], {}), + ('named_optional', '/optional/1/', [1], {}), + ('named_optional', '/optional/1/', [], {'arg1': 1}), + ('named_optional', '/optional/1/2/', [1, 2], {}), + ('named_optional', '/optional/1/2/', [], {'arg1': 1, 'arg2': 2}), + ('named_optional_terminated', '/optional/1/2/', [1, 2], {}), + ('named_optional_terminated', '/optional/1/2/', [], {'arg1': 1, 'arg2': 2}), ('hardcoded', '/hardcoded/', [], {}), ('hardcoded2', '/hardcoded/doc.pdf', [], {}), ('people3', '/people/il/adrian/', [], {'state': 'il', 'name': 'adrian'}), @@ -142,6 +148,17 @@ test_data = ( ('part2', '/prefix/xx/part2/one/', [], {'value': 'one', 'prefix': 'xx'}), ('part2', '/prefix/xx/part2/', [], {'prefix': 'xx'}), + # Tests for nested groups. Nested capturing groups will only work if you + # *only* supply the correct outer group. + ('nested-noncapture', '/nested/noncapture/opt', [], {'p': 'opt'}), + ('nested-capture', '/nested/capture/opt/', ['opt/'], {}), + ('nested-capture', NoReverseMatch, [], {'p': 'opt'}), + ('nested-mixedcapture', '/nested/capture/mixed/opt', ['opt'], {}), + ('nested-mixedcapture', NoReverseMatch, [], {'p': 'opt'}), + ('nested-namedcapture', '/nested/capture/named/opt/', [], {'outer': 'opt/'}), + ('nested-namedcapture', NoReverseMatch, [], {'outer': 'opt/', 'inner': 'opt'}), + ('nested-namedcapture', NoReverseMatch, [], {'inner': 'opt'}), + # Regression for #9038 # These views are resolved by method name. Each method is deployed twice - # once with an explicit argument, and once using the default value on diff --git a/tests/urlpatterns_reverse/urls.py b/tests/urlpatterns_reverse/urls.py index 9b5a5f29fa..d6b692d220 100644 --- a/tests/urlpatterns_reverse/urls.py +++ b/tests/urlpatterns_reverse/urls.py @@ -32,6 +32,12 @@ with warnings.catch_warnings(): url(r'^people/(?:name/(\w+)/)?', empty_view, name="people2a"), url(r'^people/(?P\w+)-(?P=name)/$', empty_view, name="people_backref"), url(r'^optional/(?P.*)/(?:.+/)?', empty_view, name="optional"), + url(r'^optional/(?P\d+)/(?:(?P\d+)/)?', absolute_kwargs_view, name="named_optional"), + url(r'^optional/(?P\d+)/(?:(?P\d+)/)?$', absolute_kwargs_view, name="named_optional_terminated"), + url(r'^nested/noncapture/(?:(?P

\w+))$', empty_view, name='nested-noncapture'), + url(r'^nested/capture/((\w+)/)?$', empty_view, name='nested-capture'), + url(r'^nested/capture/mixed/((?P

\w+))$', empty_view, name='nested-mixedcapture'), + url(r'^nested/capture/named/(?P(?P\w+)/)?$', empty_view, name='nested-namedcapture'), url(r'^hardcoded/$', empty_view, name="hardcoded"), url(r'^hardcoded/doc\.pdf$', empty_view, name="hardcoded2"), url(r'^people/(?P\w\w)/(?P\w+)/$', empty_view, name="people3"), -- cgit v1.3