From 1ff4b7f63d7dd80cb92a35beb95df2e0b6891476 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Tue, 17 May 2016 10:11:27 +0200 Subject: Allow registering of OCS routes with the appframework --- lib/private/AppFramework/Routing/RouteConfig.php | 55 ++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'lib/private/AppFramework/Routing/RouteConfig.php') diff --git a/lib/private/AppFramework/Routing/RouteConfig.php b/lib/private/AppFramework/Routing/RouteConfig.php index 64179336020..d4b4ec038ad 100644 --- a/lib/private/AppFramework/Routing/RouteConfig.php +++ b/lib/private/AppFramework/Routing/RouteConfig.php @@ -62,6 +62,61 @@ class RouteConfig { // parse resources $this->processResources($this->routes); + + /* + * OCS routes go into a different collection + */ + $oldCollection = $this->router->getCurrentCollection(); + $this->router->useCollection($oldCollection.'.ocs'); + + // parse ocs simple routes + $this->processOCS($this->routes); + + $this->router->useCollection($oldCollection); + } + + private function processOCS(array $routes) { + $ocsRoutes = isset($routes['ocs']) ? $routes['ocs'] : []; + foreach ($ocsRoutes as $ocsRoute) { + $name = $ocsRoute['name']; + $postFix = ''; + + if (isset($ocsRoute['postfix'])) { + $postfix = $ocsRoute['postfix']; + } + + $url = $ocsRoute['url']; + $verb = isset($ocsRoute['verb']) ? strtoupper($ocsRoute['verb']) : 'GET'; + + $split = explode('#', $name, 2); + if (count($split) != 2) { + throw new \UnexpectedValueException('Invalid route name'); + } + $controller = $split[0]; + $action = $split[1]; + + $controllerName = $this->buildControllerName($controller); + $actionName = $this->buildActionName($action); + + // register the route + $handler = new RouteActionHandler($this->container, $controllerName, $actionName); + + $router = $this->router->create('ocs.'.$this->appName.'.'.$controller.'.'.$action . $postfix, $url) + ->method($verb) + ->action($handler); + + // optionally register requirements for route. This is used to + // tell the route parser how url parameters should be matched + if(array_key_exists('requirements', $ocsRoute)) { + $router->requirements($ocsRoute['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', $ocsRoute)) { + $router->defaults($ocsRoute['defaults']); + } + } } /** -- cgit v1.2.3 From 0bda09236e52f028b3d1a2f92a3b60541ebc22cd Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Thu, 14 Jul 2016 20:45:19 +0200 Subject: Add route tests --- lib/private/AppFramework/Routing/RouteConfig.php | 2 +- tests/lib/AppFramework/Routing/RoutingTest.php | 131 +++++++++++++++++++++++ 2 files changed, 132 insertions(+), 1 deletion(-) (limited to 'lib/private/AppFramework/Routing/RouteConfig.php') diff --git a/lib/private/AppFramework/Routing/RouteConfig.php b/lib/private/AppFramework/Routing/RouteConfig.php index d4b4ec038ad..eca0051691f 100644 --- a/lib/private/AppFramework/Routing/RouteConfig.php +++ b/lib/private/AppFramework/Routing/RouteConfig.php @@ -79,7 +79,7 @@ class RouteConfig { $ocsRoutes = isset($routes['ocs']) ? $routes['ocs'] : []; foreach ($ocsRoutes as $ocsRoute) { $name = $ocsRoute['name']; - $postFix = ''; + $postfix = ''; if (isset($ocsRoute['postfix'])) { $postfix = $ocsRoute['postfix']; diff --git a/tests/lib/AppFramework/Routing/RoutingTest.php b/tests/lib/AppFramework/Routing/RoutingTest.php index 52a5eb33ba9..6c8b0f40133 100644 --- a/tests/lib/AppFramework/Routing/RoutingTest.php +++ b/tests/lib/AppFramework/Routing/RoutingTest.php @@ -18,6 +18,15 @@ class RoutingTest extends \Test\TestCase $this->assertSimpleRoute($routes, 'folders.open', 'GET', '/folders/{folderId}/open', 'FoldersController', 'open'); } + public function testSimpleOCSRoute() { + $routes = ['ocs' => [ + ['name' => 'folders#open', 'url' => '/folders/{folderId}/open', 'verb' => 'GET'] + ] + ]; + + $this->assertSimpleOCSRoute($routes, 'folders.open', 'GET', '/folders/{folderId}/open', 'FoldersController', 'open'); + } + public function testSimpleRouteWithMissingVerb() { $routes = array('routes' => array( @@ -27,6 +36,15 @@ class RoutingTest extends \Test\TestCase $this->assertSimpleRoute($routes, 'folders.open', 'GET', '/folders/{folderId}/open', 'FoldersController', 'open'); } + public function testSimpleOCSRouteWithMissingVerb() { + $routes = ['ocs' => [ + ['name' => 'folders#open', 'url' => '/folders/{folderId}/open'] + ] + ]; + + $this->assertSimpleOCSRoute($routes, 'folders.open', 'GET', '/folders/{folderId}/open', 'FoldersController', 'open'); + } + public function testSimpleRouteWithLowercaseVerb() { $routes = array('routes' => array( @@ -36,6 +54,15 @@ class RoutingTest extends \Test\TestCase $this->assertSimpleRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open'); } + public function testSimpleOCSRouteWithLowercaseVerb() { + $routes = ['ocs' => [ + ['name' => 'folders#open', 'url' => '/folders/{folderId}/open', 'verb' => 'delete'] + ] + ]; + + $this->assertSimpleOCSRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open'); + } + public function testSimpleRouteWithRequirements() { $routes = array('routes' => array( @@ -45,6 +72,15 @@ class RoutingTest extends \Test\TestCase $this->assertSimpleRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open', array('something')); } + public function testSimpleOCSRouteWithRequirements() { + $routes = ['ocs' => [ + ['name' => 'folders#open', 'url' => '/folders/{folderId}/open', 'verb' => 'delete', 'requirements' => ['something']] + ] + ]; + + $this->assertSimpleOCSRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open', ['something']); + } + public function testSimpleRouteWithDefaults() { $routes = array('routes' => array( @@ -54,6 +90,16 @@ class RoutingTest extends \Test\TestCase $this->assertSimpleRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open', array(), array('param' => 'foobar')); } + + public function testSimpleOCSRouteWithDefaults() { + $routes = ['ocs' => [ + ['name' => 'folders#open', 'url' => '/folders/{folderId}/open', 'verb' => 'delete', 'defaults' => ['param' => 'foobar']] + ] + ]; + + $this->assertSimpleOCSRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open', [], ['param' => 'foobar']); + } + public function testSimpleRouteWithPostfix() { $routes = array('routes' => array( @@ -63,6 +109,14 @@ class RoutingTest extends \Test\TestCase $this->assertSimpleRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open', array(), array(), '_something'); } + public function testSimpleOCSRouteWithPostfix() { + $routes = ['ocs' => [ + ['name' => 'folders#open', 'url' => '/folders/{folderId}/open', 'verb' => 'delete', 'postfix' => '_something'] + ] + ]; + + $this->assertSimpleOCSRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open', [], [], '_something'); + } /** * @expectedException \UnexpectedValueException @@ -86,6 +140,27 @@ class RoutingTest extends \Test\TestCase $config->register(); } + /** + * @expectedException \UnexpectedValueException + */ + public function testSimpleOCSRouteWithBrokenName() { + $routes = ['ocs' => [ + ['name' => 'folders_open', 'url' => '/folders/{folderId}/open', 'verb' => 'delete'] + ]]; + + // router mock + $router = $this->getMockBuilder('\OC\Route\Router') + ->setMethods(['create']) + ->setConstructorArgs([$this->getMockBuilder('\OCP\ILogger')->getMock()]) + ->getMock(); + + // load route configuration + $container = new DIContainer('app1'); + $config = new RouteConfig($container, $router, $routes); + + $config->register(); + } + public function testSimpleRouteWithUnderScoreNames() { $routes = array('routes' => array( @@ -95,6 +170,14 @@ class RoutingTest extends \Test\TestCase $this->assertSimpleRoute($routes, 'admin_folders.open_current', 'DELETE', '/folders/{folderId}/open', 'AdminFoldersController', 'openCurrent'); } + public function testSimpleOCSRouteWithUnderScoreNames() { + $routes = ['ocs' => [ + ['name' => 'admin_folders#open_current', 'url' => '/folders/{folderId}/open', 'verb' => 'delete'] + ]]; + + $this->assertSimpleOCSRoute($routes, 'admin_folders.open_current', 'DELETE', '/folders/{folderId}/open', 'AdminFoldersController', 'openCurrent'); + } + public function testResource() { $routes = array('resources' => array('account' => array('url' => '/accounts'))); @@ -145,6 +228,54 @@ class RoutingTest extends \Test\TestCase $config->register(); } + /** + * @param $routes + * @param string $name + * @param string $verb + * @param string $url + * @param string $controllerName + * @param string $actionName + * @param array $requirements + * @param array $defaults + * @param string $postfix + */ + private function assertSimpleOCSRoute($routes, + $name, + $verb, + $url, + $controllerName, + $actionName, + array $requirements=array(), + array $defaults=array(), + $postfix='') + { + if ($postfix) { + $name .= $postfix; + } + + // route mocks + $container = new DIContainer('app1'); + $route = $this->mockRoute($container, $verb, $controllerName, $actionName, $requirements, $defaults); + + // router mock + $router = $this->getMockBuilder('\OC\Route\Router') + ->setMethods(['create']) + ->setConstructorArgs([$this->getMockBuilder('\OCP\ILogger')->getMock()]) + ->getMock(); + + // we expect create to be called once: + $router + ->expects($this->once()) + ->method('create') + ->with($this->equalTo('ocs.app1.' . $name), $this->equalTo($url)) + ->will($this->returnValue($route)); + + // load route configuration + $config = new RouteConfig($container, $router, $routes); + + $config->register(); + } + /** * @param string $resourceName * @param string $url -- cgit v1.2.3