diff --git a/multiurl.py b/multiurl.py index 870a034..8266d89 100644 --- a/multiurl.py +++ b/multiurl.py @@ -55,7 +55,7 @@ def resolve(self, path): class MultiResolverMatch(object): - def __init__(self, matches, exceptions, patterns_matched, path, route=None): + def __init__(self, matches, exceptions, patterns_matched, path, route=''): self.matches = matches self.exceptions = exceptions self.patterns_matched = patterns_matched diff --git a/tests.py b/tests.py index 775c5c2..ab59340 100644 --- a/tests.py +++ b/tests.py @@ -4,10 +4,11 @@ from django.conf import settings from django.conf.urls import url - +from django.conf.urls.i18n import i18n_patterns from django.http import HttpResponse +from django.urls import path -from multiurl import multiurl, ContinueResolving +from multiurl import ContinueResolving, multiurl try: from django import urls as urlresolvers @@ -33,6 +34,14 @@ def setUp(self): ) ]) + self.patterns_pathall = urlresolvers.URLResolver(RegexPattern(r'^/'), i18n_patterns( + multiurl( + path('/', brand, name='brand'), + path('/', model, name='model'), + ), + )) + + # Patterns with no "catch all" - last view could still raise ContinueResolving. self.patterns_no_fallthrough = urlresolvers.URLResolver(RegexPattern(r'^/'), [ multiurl( @@ -56,6 +65,16 @@ def test_resolve_match_last(self): response = m.func(request=None, *m.args, **m.kwargs) self.assertEqual(response.content, b"Thing: Bacon") + def test_resolve_match_path_brand(self): + m = self.patterns_pathall.resolve('/en-us/bmw/') + response = m.func(request=None, *m.args, **m.kwargs) + self.assertEqual(response.content, b"Brand: BMW Series") + + def test_resolve_match_path_model(self): + m = self.patterns_pathall.resolve('/en-us/x5/') + response = m.func(request=None, *m.args, **m.kwargs) + self.assertEqual(response.content, b"Model: X5 2019") + def test_resolve_match_faillthrough(self): m = self.patterns_no_fallthrough.resolve('/bacon/') with self.assertRaises(urlresolvers.Resolver404): @@ -103,6 +122,24 @@ def thing(request, name): return HttpResponse("Thing: " + name.title()) +def brand(request, name): + brand = { + 'bmw': 'BMW Series', + } + if name in brand: + return HttpResponse("Brand: " + brand[name]) + raise ContinueResolving + + +def model(request, name): + model = { + 'x5': 'X5 2019', + } + if name in model: + return HttpResponse("Model: " + model[name]) + raise ContinueResolving + + if __name__ == '__main__': settings.configure() unittest.main()