From cb5416b798a9fde6d4826ad82b1f846b88a1ffcd Mon Sep 17 00:00:00 2001
From: Patrick Paysant <ppaysant@linagora.com>
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 5b4d411a355..91687b9c83c 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 7cd07db6ce1..a1d9a51a3c8 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;
 	}
 
-- 
GitLab