From cb5416b798a9fde6d4826ad82b1f846b88a1ffcd Mon Sep 17 00:00:00 2001 From: Patrick Paysant Date: Sun, 7 Sep 2014 12:20:48 +0200 Subject: [PATCH] Allow default values for route parameters. --- .../appframework/routing/routeconfig.php | 6 +++++ .../lib/appframework/routing/RoutingTest.php | 26 ++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/private/appframework/routing/routeconfig.php b/lib/private/appframework/routing/routeconfig.php index 5b4d411a35..91687b9c83 100644 --- a/lib/private/appframework/routing/routeconfig.php +++ b/lib/private/appframework/routing/routeconfig.php @@ -93,6 +93,12 @@ class RouteConfig { if(array_key_exists('requirements', $simpleRoute)) { $router->requirements($simpleRoute['requirements']); } + + // optionally register defaults for route. This is used to + // tell the route parser how url parameters should be default valued + if(array_key_exists('defaults', $simpleRoute)) { + $router->defaults($simpleRoute['defaults']); + } } } diff --git a/tests/lib/appframework/routing/RoutingTest.php b/tests/lib/appframework/routing/RoutingTest.php index 7cd07db6ce..a1d9a51a3c 100644 --- a/tests/lib/appframework/routing/RoutingTest.php +++ b/tests/lib/appframework/routing/RoutingTest.php @@ -45,6 +45,15 @@ class RoutingTest extends \PHPUnit_Framework_TestCase $this->assertSimpleRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open', array('something')); } + public function testSimpleRouteWithDefaults() + { + $routes = array('routes' => array( + array('name' => 'folders#open', 'url' => '/folders/{folderId}/open', 'verb' => 'delete', array(), 'defaults' => array('param' => 'foobar')) + )); + + $this->assertSimpleRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open', array(), array('param' => 'foobar')); + } + /** * @expectedException \UnexpectedValueException @@ -95,10 +104,10 @@ class RoutingTest extends \PHPUnit_Framework_TestCase * @param string $controllerName * @param string $actionName */ - private function assertSimpleRoute($routes, $name, $verb, $url, $controllerName, $actionName, array $requirements=array()) + private function assertSimpleRoute($routes, $name, $verb, $url, $controllerName, $actionName, array $requirements=array(), array $defaults=array()) { // route mocks - $route = $this->mockRoute($verb, $controllerName, $actionName, $requirements); + $route = $this->mockRoute($verb, $controllerName, $actionName, $requirements, $defaults); // router mock $router = $this->getMock("\OC\Route\Router", array('create')); @@ -181,10 +190,10 @@ class RoutingTest extends \PHPUnit_Framework_TestCase * @param string $actionName * @return \PHPUnit_Framework_MockObject_MockObject */ - private function mockRoute($verb, $controllerName, $actionName, array $requirements=array()) + private function mockRoute($verb, $controllerName, $actionName, array $requirements=array(), array $defaults=array()) { $container = new DIContainer('app1'); - $route = $this->getMock("\OC\Route\Route", array('method', 'action', 'requirements'), array(), '', false); + $route = $this->getMock("\OC\Route\Route", array('method', 'action', 'requirements', 'defaults'), array(), '', false); $route ->expects($this->exactly(1)) ->method('method') @@ -204,6 +213,15 @@ class RoutingTest extends \PHPUnit_Framework_TestCase ->with($this->equalTo($requirements)) ->will($this->returnValue($route)); } + + if (count($defaults) > 0) { + $route + ->expects($this->exactly(1)) + ->method('defaults') + ->with($this->equalTo($defaults)) + ->will($this->returnValue($route)); + } + return $route; }