diff --git a/app/http/controllers/ControllerTest.py b/app/http/controllers/ControllerTest.py index 80798a1ca..e3290b1c9 100644 --- a/app/http/controllers/ControllerTest.py +++ b/app/http/controllers/ControllerTest.py @@ -17,3 +17,6 @@ def returns_a_view(self, view: View): def returns_a_dict(self): return {'id': 1} + + def param(self): + return self.request.param('id') diff --git a/masonite/helpers/routes.py b/masonite/helpers/routes.py index daf89daa2..28b9ab73e 100644 --- a/masonite/helpers/routes.py +++ b/masonite/helpers/routes.py @@ -144,7 +144,7 @@ def compile_route_to_regex(route): regex += r'([a-zA-Z]+)' else: # default - regex += r'(\w+)' + regex += r'([\w.-]+)' regex += r'\/' # append the variable name passed @(variable):int to a list diff --git a/masonite/providers/RouteProvider.py b/masonite/providers/RouteProvider.py index 50ce97d32..fc55d59f2 100644 --- a/masonite/providers/RouteProvider.py +++ b/masonite/providers/RouteProvider.py @@ -12,7 +12,6 @@ def register(self): pass def boot(self, router: Route, request: Request): - # All routes joined for route in self.app.make('WebRoutes'): @@ -49,8 +48,7 @@ def boot(self, router: Route, request: Request): try: parameter_dict = {} for index, value in enumerate(matchurl.match(router.url).groups()): - parameter_dict[router.generated_url_list()[ - index]] = value + parameter_dict[router.generated_url_list()[index]] = value request.set_params(parameter_dict) except AttributeError: pass diff --git a/masonite/request.py b/masonite/request.py index fd7ef78eb..7621613e0 100644 --- a/masonite/request.py +++ b/masonite/request.py @@ -732,8 +732,7 @@ def compile_route_to_url(self, route, params={}): if url: # if the url contains a parameter variable like @id:int if '@' in url: - url = url.replace('@', '').replace( - ':int', '').replace(':string', '') + url = url.replace('@', '').split(':')[0] compiled_url += str(params[url]) + '/' else: compiled_url += url + '/' diff --git a/masonite/routes.py b/masonite/routes.py index 79fea78d2..93fd9f543 100644 --- a/masonite/routes.py +++ b/masonite/routes.py @@ -337,7 +337,6 @@ def compile_route_to_regex(self, router): # Split the route split_given_route = self.route_url.split('/') - # compile the provided url into regex url_list = [] regex = '^' @@ -360,8 +359,7 @@ def compile_route_to_regex(self, router): # append the variable name passed @(variable):int to a list url_list.append( - regex_route.replace('@', '').replace( - ':int', '').replace(':string', '') + regex_route.replace('@', '').split(':')[0] ) else: regex += regex_route + r'\/' diff --git a/tests/providers/test_route_provider.py b/tests/providers/test_route_provider.py index 5c775b6b8..129256810 100644 --- a/tests/providers/test_route_provider.py +++ b/tests/providers/test_route_provider.py @@ -112,6 +112,29 @@ def test_url_with_dashes_finds_route(self): assert self.app.make('Request').param('endpoint') == 'user-endpoint' + def test_param_returns_param(self): + self.app.make('Route').url = '/test/1' + self.app.bind('WebRoutes', [get('/test/@id', ControllerTest.param)]) + + self.provider.boot( + self.app.make('Route'), + self.app.make('Request') + ) + + assert self.app.make('Response') == '1' + + def test_custom_route_compiler_returns_param(self): + self.app.make('Route').url = '/test/1' + self.app.make('Route').compile('signed', r'([\w.-]+)') + self.app.bind('WebRoutes', [get('/test/@id:signed', ControllerTest.param)]) + + self.provider.boot( + self.app.make('Route'), + self.app.make('Request') + ) + + assert self.app.make('Response') == '1' + def test_route_subdomain_ignores_routes(self): self.app.make('Route').url = '/test' self.app.make('Environ')['HTTP_HOST'] = 'subb.domain.com' diff --git a/tests/test_requests.py b/tests/test_requests.py index d6d13c458..6625fb559 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -326,6 +326,18 @@ def test_redirect_compiles_url_with_multiple_parameters(self): 'id': '1', 'test': 'user', } + assert request.compile_route_to_url(route, params) == '/test/1/user' + + def test_request_compiles_custom_route_compiler(self): + app = App() + app.bind('Request', self.request) + request = app.make('Request').load_app(app) + + route = 'test/@id:signed' + params = { + 'id': '1', + } + assert request.compile_route_to_url(route, params) == '/test/1' def test_redirect_compiles_url_with_http(self): @@ -459,7 +471,11 @@ def test_contains_for_path_with_digit_and_wrong_contains(self): def test_contains_for_path_with_alpha_contains(self): self.request.path = '/test/path/joe' - assert self.request.contains('/test/path/*:string') + assert self.request.contains('/test/path/*:string') + + def test_contains_for_route_compilers(self): + self.request.path = '/test/path/joe' + assert self.request.contains('/test/path/*:signed') def test_contains_multiple_asteriks(self): self.request.path = '/dashboard/user/edit/1'