summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2013-08-17 11:16:48 +0200
committerThomas Müller <thomas.mueller@tmit.eu>2013-08-17 11:16:48 +0200
commitfde9cabe9774b67e88ee8aa8fa39fe044fe2da2f (patch)
tree6f08673a824cd19fd518e7df70115f9eb1a36900 /tests
parent33bb2238aeb0fddd3ddd3fe18307c5e7548e00bc (diff)
downloadnextcloud-server-fde9cabe9774b67e88ee8aa8fa39fe044fe2da2f.tar.gz
nextcloud-server-fde9cabe9774b67e88ee8aa8fa39fe044fe2da2f.zip
initial import of appframework
Diffstat (limited to 'tests')
-rw-r--r--tests/lib/appframework/AppTest.php107
-rw-r--r--tests/lib/appframework/classloader.php45
-rw-r--r--tests/lib/appframework/controller/ControllerTest.php161
-rw-r--r--tests/lib/appframework/dependencyinjection/DIContainerTest.php98
-rw-r--r--tests/lib/appframework/http/DispatcherTest.php218
-rw-r--r--tests/lib/appframework/http/DownloadResponseTest.php51
-rw-r--r--tests/lib/appframework/http/HttpTest.php87
-rw-r--r--tests/lib/appframework/http/JSONResponseTest.php96
-rw-r--r--tests/lib/appframework/http/RedirectResponseTest.php55
-rw-r--r--tests/lib/appframework/http/RequestTest.php78
-rw-r--r--tests/lib/appframework/http/ResponseTest.php119
-rw-r--r--tests/lib/appframework/http/TemplateResponseTest.php157
-rw-r--r--tests/lib/appframework/middleware/MiddlewareDispatcherTest.php280
-rw-r--r--tests/lib/appframework/middleware/MiddlewareTest.php82
-rw-r--r--tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php388
-rw-r--r--tests/lib/appframework/routing/RoutingTest.php214
-rw-r--r--tests/lib/appframework/utility/MethodAnnotationReaderTest.php58
17 files changed, 2294 insertions, 0 deletions
diff --git a/tests/lib/appframework/AppTest.php b/tests/lib/appframework/AppTest.php
new file mode 100644
index 00000000000..000094d07c8
--- /dev/null
+++ b/tests/lib/appframework/AppTest.php
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework;
+
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Core\API;
+use OC\AppFramework\Middleware\MiddlewareDispatcher;
+
+// FIXME: loading pimpl correctly from 3rdparty repo
+require_once __DIR__ . '/../../../../3rdparty/Pimple/Pimple.php';
+require_once __DIR__ . "/classloader.php";
+
+
+class AppTest extends \PHPUnit_Framework_TestCase {
+
+ private $container;
+ private $api;
+ private $controller;
+ private $dispatcher;
+ private $params;
+ private $headers;
+ private $output;
+ private $controllerName;
+ private $controllerMethod;
+
+ protected function setUp() {
+ $this->container = new \Pimple();
+ $this->controller = $this->getMockBuilder(
+ 'OC\AppFramework\Controller\Controller')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->dispatcher = $this->getMockBuilder(
+ 'OC\AppFramework\Http\Dispatcher')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+
+ $this->headers = array('key' => 'value');
+ $this->output = 'hi';
+ $this->controllerName = 'Controller';
+ $this->controllerMethod = 'method';
+
+ $this->container[$this->controllerName] = $this->controller;
+ $this->container['Dispatcher'] = $this->dispatcher;
+ }
+
+
+ public function testControllerNameAndMethodAreBeingPassed(){
+ $return = array(null, array(), null);
+ $this->dispatcher->expects($this->once())
+ ->method('dispatch')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod))
+ ->will($this->returnValue($return));
+
+ $this->expectOutputString('');
+
+ App::main($this->controllerName, $this->controllerMethod, array(),
+ $this->container);
+ }
+
+
+ /*
+ FIXME: this complains about shit headers which are already sent because
+ of the content length. Would be cool if someone could fix this
+
+ public function testOutputIsPrinted(){
+ $return = array(null, array(), $this->output);
+ $this->dispatcher->expects($this->once())
+ ->method('dispatch')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod))
+ ->will($this->returnValue($return));
+
+ $this->expectOutputString($this->output);
+
+ App::main($this->controllerName, $this->controllerMethod, array(),
+ $this->container);
+ }
+ */
+
+ // FIXME: if someone manages to test the headers output, I'd be grateful
+
+
+}
diff --git a/tests/lib/appframework/classloader.php b/tests/lib/appframework/classloader.php
new file mode 100644
index 00000000000..ae485e67b2c
--- /dev/null
+++ b/tests/lib/appframework/classloader.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// to execute without ownCloud, we need to create our own class loader
+spl_autoload_register(function ($className){
+ if (strpos($className, 'OC\\AppFramework') === 0) {
+ $path = strtolower(str_replace('\\', '/', substr($className, 3)) . '.php');
+ $relPath = __DIR__ . '/../../../lib/' . $path;
+
+ if(file_exists($relPath)){
+ require_once $relPath;
+ }
+ }
+
+ // FIXME: this will most probably not work anymore
+ if (strpos($className, 'OCA\\') === 0) {
+
+ $path = strtolower(str_replace('\\', '/', substr($className, 3)) . '.php');
+ $relPath = __DIR__ . '/../..' . $path;
+
+ if(file_exists($relPath)){
+ require_once $relPath;
+ }
+ }
+});
diff --git a/tests/lib/appframework/controller/ControllerTest.php b/tests/lib/appframework/controller/ControllerTest.php
new file mode 100644
index 00000000000..d8357c2a685
--- /dev/null
+++ b/tests/lib/appframework/controller/ControllerTest.php
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace Test\AppFramework\Controller;
+
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Http\JSONResponse;
+use OC\AppFramework\Http\TemplateResponse;
+use OC\AppFramework\Controller\Controller;
+
+
+require_once(__DIR__ . "/../classloader.php");
+
+
+class ChildController extends Controller {};
+
+class ControllerTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Controller
+ */
+ private $controller;
+ private $api;
+
+ protected function setUp(){
+ $request = new Request(
+ array(
+ 'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ 'post' => array('name' => 'Jane Doe', 'nickname' => 'Janey'),
+ 'urlParams' => array('name' => 'Johnny Weissmüller'),
+ 'files' => array('file' => 'filevalue'),
+ 'env' => array('PATH' => 'daheim'),
+ 'session' => array('sezession' => 'kein'),
+ 'method' => 'hi',
+ )
+ );
+
+ $this->api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName'), array('test'));
+ $this->api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('apptemplate_advanced'));
+
+ $this->controller = new ChildController($this->api, $request);
+ }
+
+
+ public function testParamsGet(){
+ $this->assertEquals('Johnny Weissmüller', $this->controller->params('name', 'Tarzan'));
+ }
+
+
+ public function testParamsGetDefault(){
+ $this->assertEquals('Tarzan', $this->controller->params('Ape Man', 'Tarzan'));
+ }
+
+
+ public function testParamsFile(){
+ $this->assertEquals('filevalue', $this->controller->params('file', 'filevalue'));
+ }
+
+
+ public function testGetUploadedFile(){
+ $this->assertEquals('filevalue', $this->controller->getUploadedFile('file'));
+ }
+
+
+
+ public function testGetUploadedFileDefault(){
+ $this->assertEquals('default', $this->controller->params('files', 'default'));
+ }
+
+
+ public function testGetParams(){
+ $params = array(
+ 'name' => 'Johnny Weissmüller',
+ 'nickname' => 'Janey',
+ );
+
+ $this->assertEquals($params, $this->controller->getParams());
+ }
+
+
+ public function testRender(){
+ $this->assertTrue($this->controller->render('') instanceof TemplateResponse);
+ }
+
+
+ public function testSetParams(){
+ $params = array('john' => 'foo');
+ $response = $this->controller->render('home', $params);
+
+ $this->assertEquals($params, $response->getParams());
+ }
+
+
+ public function testRenderRenderAs(){
+ $ocTpl = $this->getMock('Template', array('fetchPage'));
+ $ocTpl->expects($this->once())
+ ->method('fetchPage');
+
+ $api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName', 'getTemplate'), array('app'));
+ $api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('app'));
+ $api->expects($this->once())
+ ->method('getTemplate')
+ ->with($this->equalTo('home'), $this->equalTo('admin'), $this->equalTo('app'))
+ ->will($this->returnValue($ocTpl));
+
+ $this->controller = new ChildController($api, new Request());
+ $this->controller->render('home', array(), 'admin')->render();
+ }
+
+
+ public function testRenderHeaders(){
+ $headers = array('one', 'two');
+ $response = $this->controller->render('', array(), '', $headers);
+
+ $this->assertTrue(in_array($headers[0], $response->getHeaders()));
+ $this->assertTrue(in_array($headers[1], $response->getHeaders()));
+ }
+
+
+ public function testGetRequestMethod(){
+ $this->assertEquals('hi', $this->controller->method());
+ }
+
+
+ public function testGetEnvVariable(){
+ $this->assertEquals('daheim', $this->controller->env('PATH'));
+ }
+
+ public function testGetSessionVariable(){
+ $this->assertEquals('kein', $this->controller->session('sezession'));
+ }
+
+
+}
diff --git a/tests/lib/appframework/dependencyinjection/DIContainerTest.php b/tests/lib/appframework/dependencyinjection/DIContainerTest.php
new file mode 100644
index 00000000000..ce346f0a763
--- /dev/null
+++ b/tests/lib/appframework/dependencyinjection/DIContainerTest.php
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @author Morris Jobke
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ * @copyright 2013 Morris Jobke morris.jobke@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\DependencyInjection;
+
+use \OC\AppFramework\Http\Request;
+
+
+require_once(__DIR__ . "/../classloader.php");
+
+
+class DIContainerTest extends \PHPUnit_Framework_TestCase {
+
+ private $container;
+
+ protected function setUp(){
+ $this->container = new DIContainer('name');
+ $this->api = $this->getMock('OC\AppFramework\Core\API', array('getTrans'), array('hi'));
+ }
+
+ private function exchangeAPI(){
+ $this->api->expects($this->any())
+ ->method('getTrans')
+ ->will($this->returnValue('yo'));
+ $this->container['API'] = $this->api;
+ }
+
+ public function testProvidesAPI(){
+ $this->assertTrue(isset($this->container['API']));
+ }
+
+
+ public function testProvidesRequest(){
+ $this->assertTrue(isset($this->container['Request']));
+ }
+
+
+ public function testProvidesSecurityMiddleware(){
+ $this->assertTrue(isset($this->container['SecurityMiddleware']));
+ }
+
+
+ public function testProvidesMiddlewareDispatcher(){
+ $this->assertTrue(isset($this->container['MiddlewareDispatcher']));
+ }
+
+
+ public function testProvidesAppName(){
+ $this->assertTrue(isset($this->container['AppName']));
+ }
+
+
+ public function testAppNameIsSetCorrectly(){
+ $this->assertEquals('name', $this->container['AppName']);
+ }
+
+
+ public function testMiddlewareDispatcherIncludesSecurityMiddleware(){
+ $this->container['Request'] = new Request();
+ $security = $this->container['SecurityMiddleware'];
+ $dispatcher = $this->container['MiddlewareDispatcher'];
+
+ $this->assertContains($security, $dispatcher->getMiddlewares());
+ }
+
+
+ public function testMiddlewareDispatcherDoesNotIncludeTwigWhenTplDirectoryNotSet(){
+ $this->container['Request'] = new Request();
+ $this->exchangeAPI();
+ $dispatcher = $this->container['MiddlewareDispatcher'];
+
+ $this->assertEquals(1, count($dispatcher->getMiddlewares()));
+ }
+
+}
diff --git a/tests/lib/appframework/http/DispatcherTest.php b/tests/lib/appframework/http/DispatcherTest.php
new file mode 100644
index 00000000000..2e3db110504
--- /dev/null
+++ b/tests/lib/appframework/http/DispatcherTest.php
@@ -0,0 +1,218 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+use OC\AppFramework\Core\API;
+use OC\AppFramework\Middleware\MiddlewareDispatcher;
+
+require_once(__DIR__ . "/../classloader.php");
+
+
+class DispatcherTest extends \PHPUnit_Framework_TestCase {
+
+
+ private $middlewareDispatcher;
+ private $dispatcher;
+ private $controllerMethod;
+ private $response;
+ private $lastModified;
+ private $etag;
+ private $http;
+
+ protected function setUp() {
+ $this->controllerMethod = 'test';
+
+ $api = $this->getMockBuilder(
+ '\OC\AppFramework\Core\API')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $request = $this->getMockBuilder(
+ '\OC\AppFramework\Http\Request')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->http = $this->getMockBuilder(
+ '\OC\AppFramework\Http\Http')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->middlewareDispatcher = $this->getMockBuilder(
+ '\OC\AppFramework\Middleware\MiddlewareDispatcher')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->controller = $this->getMock(
+ '\OC\AppFramework\Controller\Controller',
+ array($this->controllerMethod), array($api, $request));
+
+ $this->dispatcher = new Dispatcher(
+ $this->http, $this->middlewareDispatcher);
+
+ $this->response = $this->getMockBuilder(
+ '\OC\AppFramework\Http\Response')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->lastModified = new \DateTime(null, new \DateTimeZone('GMT'));
+ $this->etag = 'hi';
+ }
+
+
+ private function setMiddlewareExpections($out=null,
+ $httpHeaders=null, $responseHeaders=array(),
+ $ex=false, $catchEx=true) {
+
+ if($ex) {
+ $exception = new \Exception();
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('beforeController')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod))
+ ->will($this->throwException($exception));
+ if($catchEx) {
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('afterException')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod),
+ $this->equalTo($exception))
+ ->will($this->returnValue($this->response));
+ } else {
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('afterException')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod),
+ $this->equalTo($exception))
+ ->will($this->returnValue(null));
+ return;
+ }
+ } else {
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('beforeController')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod));
+ $this->controller->expects($this->once())
+ ->method($this->controllerMethod)
+ ->will($this->returnValue($this->response));
+ }
+
+ $this->response->expects($this->once())
+ ->method('render')
+ ->will($this->returnValue($out));
+ $this->response->expects($this->once())
+ ->method('getStatus')
+ ->will($this->returnValue(Http::STATUS_OK));
+ $this->response->expects($this->once())
+ ->method('getLastModified')
+ ->will($this->returnValue($this->lastModified));
+ $this->response->expects($this->once())
+ ->method('getETag')
+ ->will($this->returnValue($this->etag));
+ $this->response->expects($this->once())
+ ->method('getHeaders')
+ ->will($this->returnValue($responseHeaders));
+ $this->http->expects($this->once())
+ ->method('getStatusHeader')
+ ->with($this->equalTo(Http::STATUS_OK),
+ $this->equalTo($this->lastModified),
+ $this->equalTo($this->etag))
+ ->will($this->returnValue($httpHeaders));
+
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('afterController')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod),
+ $this->equalTo($this->response))
+ ->will($this->returnValue($this->response));
+
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('afterController')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod),
+ $this->equalTo($this->response))
+ ->will($this->returnValue($this->response));
+
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('beforeOutput')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod),
+ $this->equalTo($out))
+ ->will($this->returnValue($out));
+
+
+ }
+
+
+ public function testDispatcherReturnsArrayWith2Entries() {
+ $this->setMiddlewareExpections();
+
+ $response = $this->dispatcher->dispatch($this->controller,
+ $this->controllerMethod);
+ $this->assertNull($response[0]);
+ $this->assertEquals(array(), $response[1]);
+ $this->assertNull($response[2]);
+ }
+
+
+ public function testHeadersAndOutputAreReturned(){
+ $out = 'yo';
+ $httpHeaders = 'Http';
+ $responseHeaders = array('hell' => 'yeah');
+ $this->setMiddlewareExpections($out, $httpHeaders, $responseHeaders);
+
+ $response = $this->dispatcher->dispatch($this->controller,
+ $this->controllerMethod);
+
+ $this->assertEquals($httpHeaders, $response[0]);
+ $this->assertEquals($responseHeaders, $response[1]);
+ $this->assertEquals($out, $response[2]);
+ }
+
+
+ public function testExceptionCallsAfterException() {
+ $out = 'yo';
+ $httpHeaders = 'Http';
+ $responseHeaders = array('hell' => 'yeah');
+ $this->setMiddlewareExpections($out, $httpHeaders, $responseHeaders, true);
+
+ $response = $this->dispatcher->dispatch($this->controller,
+ $this->controllerMethod);
+
+ $this->assertEquals($httpHeaders, $response[0]);
+ $this->assertEquals($responseHeaders, $response[1]);
+ $this->assertEquals($out, $response[2]);
+ }
+
+
+ public function testExceptionThrowsIfCanNotBeHandledByAfterException() {
+ $out = 'yo';
+ $httpHeaders = 'Http';
+ $responseHeaders = array('hell' => 'yeah');
+ $this->setMiddlewareExpections($out, $httpHeaders, $responseHeaders, true, false);
+
+ $this->setExpectedException('\Exception');
+ $response = $this->dispatcher->dispatch($this->controller,
+ $this->controllerMethod);
+
+ }
+
+}
diff --git a/tests/lib/appframework/http/DownloadResponseTest.php b/tests/lib/appframework/http/DownloadResponseTest.php
new file mode 100644
index 00000000000..103cfe7588c
--- /dev/null
+++ b/tests/lib/appframework/http/DownloadResponseTest.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+
+require_once(__DIR__ . "/../classloader.php");
+
+
+class ChildDownloadResponse extends DownloadResponse {};
+
+
+class DownloadResponseTest extends \PHPUnit_Framework_TestCase {
+
+ protected $response;
+
+ protected function setUp(){
+ $this->response = new ChildDownloadResponse('file', 'content');
+ }
+
+
+ public function testHeaders() {
+ $headers = $this->response->getHeaders();
+
+ $this->assertContains('attachment; filename="file"', $headers['Content-Disposition']);
+ $this->assertContains('content', $headers['Content-Type']);
+ }
+
+
+}
diff --git a/tests/lib/appframework/http/HttpTest.php b/tests/lib/appframework/http/HttpTest.php
new file mode 100644
index 00000000000..306bc3caf42
--- /dev/null
+++ b/tests/lib/appframework/http/HttpTest.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+
+require_once(__DIR__ . "/../classloader.php");
+
+
+
+class HttpTest extends \PHPUnit_Framework_TestCase {
+
+ private $server;
+ private $http;
+
+ protected function setUp(){
+ $this->server = array();
+ $this->http = new Http($this->server);
+ }
+
+
+ public function testProtocol() {
+ $header = $this->http->getStatusHeader(Http::STATUS_TEMPORARY_REDIRECT);
+ $this->assertEquals('HTTP/1.1 307 Temporary Redirect', $header);
+ }
+
+
+ public function testProtocol10() {
+ $this->http = new Http($this->server, 'HTTP/1.0');
+ $header = $this->http->getStatusHeader(Http::STATUS_OK);
+ $this->assertEquals('HTTP/1.0 200 OK', $header);
+ }
+
+
+ public function testEtagMatchReturnsNotModified() {
+ $http = new Http(array('HTTP_IF_NONE_MATCH' => 'hi'));
+
+ $header = $http->getStatusHeader(Http::STATUS_OK, null, 'hi');
+ $this->assertEquals('HTTP/1.1 304 Not Modified', $header);
+ }
+
+
+ public function testLastModifiedMatchReturnsNotModified() {
+ $dateTime = new \DateTime(null, new \DateTimeZone('GMT'));
+ $dateTime->setTimestamp('12');
+
+ $http = new Http(
+ array(
+ 'HTTP_IF_MODIFIED_SINCE' => 'Thu, 01 Jan 1970 00:00:12 +0000')
+ );
+
+ $header = $http->getStatusHeader(Http::STATUS_OK, $dateTime);
+ $this->assertEquals('HTTP/1.1 304 Not Modified', $header);
+ }
+
+
+
+ public function testTempRedirectBecomesFoundInHttp10() {
+ $http = new Http(array(), 'HTTP/1.0');
+
+ $header = $http->getStatusHeader(Http::STATUS_TEMPORARY_REDIRECT);
+ $this->assertEquals('HTTP/1.0 302 Found', $header);
+ }
+ // TODO: write unittests for http codes
+
+}
diff --git a/tests/lib/appframework/http/JSONResponseTest.php b/tests/lib/appframework/http/JSONResponseTest.php
new file mode 100644
index 00000000000..d15e08f6ce1
--- /dev/null
+++ b/tests/lib/appframework/http/JSONResponseTest.php
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @author Morris Jobke
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ * @copyright 2013 Morris Jobke morris.jobke@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+
+require_once(__DIR__ . "/../classloader.php");
+
+
+
+class JSONResponseTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var JSONResponse
+ */
+ private $json;
+
+ protected function setUp() {
+ $this->json = new JSONResponse();
+ }
+
+
+ public function testHeader() {
+ $headers = $this->json->getHeaders();
+ $this->assertEquals('application/json; charset=utf-8', $headers['Content-type']);
+ }
+
+
+ public function testSetData() {
+ $params = array('hi', 'yo');
+ $this->json->setData($params);
+
+ $this->assertEquals(array('hi', 'yo'), $this->json->getData());
+ }
+
+
+ public function testSetRender() {
+ $params = array('test' => 'hi');
+ $this->json->setData($params);
+
+ $expected = '{"test":"hi"}';
+
+ $this->assertEquals($expected, $this->json->render());
+ }
+
+
+ public function testRender() {
+ $params = array('test' => 'hi');
+ $this->json->setData($params);
+
+ $expected = '{"test":"hi"}';
+
+ $this->assertEquals($expected, $this->json->render());
+ }
+
+
+ public function testShouldHaveXContentHeaderByDefault() {
+ $headers = $this->json->getHeaders();
+ $this->assertEquals('nosniff', $headers['X-Content-Type-Options']);
+ }
+
+
+ public function testConstructorAllowsToSetData() {
+ $data = array('hi');
+ $code = 300;
+ $response = new JSONResponse($data, $code);
+
+ $expected = '["hi"]';
+ $this->assertEquals($expected, $response->render());
+ $this->assertEquals($code, $response->getStatus());
+ }
+
+}
diff --git a/tests/lib/appframework/http/RedirectResponseTest.php b/tests/lib/appframework/http/RedirectResponseTest.php
new file mode 100644
index 00000000000..a8577feed29
--- /dev/null
+++ b/tests/lib/appframework/http/RedirectResponseTest.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+
+require_once(__DIR__ . "/../classloader.php");
+
+
+
+class RedirectResponseTest extends \PHPUnit_Framework_TestCase {
+
+
+ protected $response;
+
+ protected function setUp(){
+ $this->response = new RedirectResponse('/url');
+ }
+
+
+ public function testHeaders() {
+ $headers = $this->response->getHeaders();
+ $this->assertEquals('/url', $headers['Location']);
+ $this->assertEquals(Http::STATUS_TEMPORARY_REDIRECT,
+ $this->response->getStatus());
+ }
+
+
+ public function testGetRedirectUrl(){
+ $this->assertEquals('/url', $this->response->getRedirectUrl());
+ }
+
+
+}
diff --git a/tests/lib/appframework/http/RequestTest.php b/tests/lib/appframework/http/RequestTest.php
new file mode 100644
index 00000000000..c1f56c01636
--- /dev/null
+++ b/tests/lib/appframework/http/RequestTest.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OC\AppFramework\Http;
+
+
+require_once(__DIR__ . "/../classloader.php");
+
+class RequestTest extends \PHPUnit_Framework_TestCase {
+
+ public function testRequestAccessors() {
+ $vars = array(
+ 'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ );
+
+ $request = new Request($vars);
+
+ // Countable
+ $this->assertEquals(2, count($request));
+ // Array access
+ $this->assertEquals('Joey', $request['nickname']);
+ // "Magic" accessors
+ $this->assertEquals('Joey', $request->{'nickname'});
+ $this->assertTrue(isset($request['nickname']));
+ $this->assertTrue(isset($request->{'nickname'}));
+ $this->assertEquals(false, isset($request->{'flickname'}));
+ // Only testing 'get', but same approach for post, files etc.
+ $this->assertEquals('Joey', $request->get['nickname']);
+ // Always returns null if variable not set.
+ $this->assertEquals(null, $request->{'flickname'});
+ }
+
+ // urlParams has precedence over POST which has precedence over GET
+ public function testPrecedence() {
+ $vars = array(
+ 'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ 'post' => array('name' => 'Jane Doe', 'nickname' => 'Janey'),
+ 'urlParams' => array('user' => 'jw', 'name' => 'Johnny Weissmüller'),
+ );
+
+ $request = new Request($vars);
+
+ $this->assertEquals(3, count($request));
+ $this->assertEquals('Janey', $request->{'nickname'});
+ $this->assertEquals('Johnny Weissmüller', $request->{'name'});
+ }
+
+
+ /**
+ * @expectedException RuntimeException
+ */
+ public function testImmutableArrayAccess() {
+ $vars = array(
+ 'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ );
+
+ $request = new Request($vars);
+ $request['nickname'] = 'Janey';
+ }
+
+ /**
+ * @expectedException RuntimeException
+ */
+ public function testImmutableMagicAccess() {
+ $vars = array(
+ 'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ );
+
+ $request = new Request($vars);
+ $request->{'nickname'} = 'Janey';
+ }
+
+}
diff --git a/tests/lib/appframework/http/ResponseTest.php b/tests/lib/appframework/http/ResponseTest.php
new file mode 100644
index 00000000000..621ba66545f
--- /dev/null
+++ b/tests/lib/appframework/http/ResponseTest.php
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+
+require_once(__DIR__ . "/../classloader.php");
+
+
+
+class ResponseTest extends \PHPUnit_Framework_TestCase {
+
+
+ private $childResponse;
+
+ protected function setUp(){
+ $this->childResponse = new Response();
+ }
+
+
+ public function testAddHeader(){
+ $this->childResponse->addHeader('hello', 'world');
+ $headers = $this->childResponse->getHeaders();
+ $this->assertEquals('world', $headers['hello']);
+ }
+
+
+ public function testAddHeaderValueNullDeletesIt(){
+ $this->childResponse->addHeader('hello', 'world');
+ $this->childResponse->addHeader('hello', null);
+ $this->assertEquals(1, count($this->childResponse->getHeaders()));
+ }
+
+
+ public function testCacheHeadersAreDisabledByDefault(){
+ $headers = $this->childResponse->getHeaders();
+ $this->assertEquals('no-cache, must-revalidate', $headers['Cache-Control']);
+ }
+
+
+ public function testRenderReturnNullByDefault(){
+ $this->assertEquals(null, $this->childResponse->render());
+ }
+
+
+ public function testGetStatus() {
+ $default = $this->childResponse->getStatus();
+
+ $this->childResponse->setStatus(Http::STATUS_NOT_FOUND);
+
+ $this->assertEquals(Http::STATUS_OK, $default);
+ $this->assertEquals(Http::STATUS_NOT_FOUND, $this->childResponse->getStatus());
+ }
+
+
+ public function testGetEtag() {
+ $this->childResponse->setEtag('hi');
+ $this->assertEquals('hi', $this->childResponse->getEtag());
+ }
+
+
+ public function testGetLastModified() {
+ $lastModified = new \DateTime(null, new \DateTimeZone('GMT'));
+ $lastModified->setTimestamp(1);
+ $this->childResponse->setLastModified($lastModified);
+ $this->assertEquals($lastModified, $this->childResponse->getLastModified());
+ }
+
+
+
+ public function testCacheSecondsZero() {
+ $this->childResponse->cacheFor(0);
+
+ $headers = $this->childResponse->getHeaders();
+ $this->assertEquals('no-cache, must-revalidate', $headers['Cache-Control']);
+ }
+
+
+ public function testCacheSeconds() {
+ $this->childResponse->cacheFor(33);
+
+ $headers = $this->childResponse->getHeaders();
+ $this->assertEquals('max-age=33, must-revalidate',
+ $headers['Cache-Control']);
+ }
+
+
+
+ public function testEtagLastModifiedHeaders() {
+ $lastModified = new \DateTime(null, new \DateTimeZone('GMT'));
+ $lastModified->setTimestamp(1);
+ $this->childResponse->setLastModified($lastModified);
+ $headers = $this->childResponse->getHeaders();
+ $this->assertEquals('Thu, 01 Jan 1970 00:00:01 +0000', $headers['Last-Modified']);
+ }
+
+
+}
diff --git a/tests/lib/appframework/http/TemplateResponseTest.php b/tests/lib/appframework/http/TemplateResponseTest.php
new file mode 100644
index 00000000000..30684725b72
--- /dev/null
+++ b/tests/lib/appframework/http/TemplateResponseTest.php
@@ -0,0 +1,157 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+use OC\AppFramework\Core\API;
+
+
+require_once(__DIR__ . "/../classloader.php");
+
+
+class TemplateResponseTest extends \PHPUnit_Framework_TestCase {
+
+ private $tpl;
+ private $api;
+
+ protected function setUp() {
+ $this->api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName'), array('test'));
+ $this->api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('app'));
+
+ $this->tpl = new TemplateResponse($this->api, 'home');
+ }
+
+
+ public function testSetParams(){
+ $params = array('hi' => 'yo');
+ $this->tpl->setParams($params);
+
+ $this->assertEquals(array('hi' => 'yo'), $this->tpl->getParams());
+ }
+
+
+ public function testGetTemplateName(){
+ $this->assertEquals('home', $this->tpl->getTemplateName());
+ }
+
+
+ public function testRender(){
+ $ocTpl = $this->getMock('Template', array('fetchPage'));
+ $ocTpl->expects($this->once())
+ ->method('fetchPage');
+
+ $api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName', 'getTemplate'), array('app'));
+ $api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('app'));
+ $api->expects($this->once())
+ ->method('getTemplate')
+ ->with($this->equalTo('home'), $this->equalTo('user'), $this->equalTo('app'))
+ ->will($this->returnValue($ocTpl));
+
+ $tpl = new TemplateResponse($api, 'home');
+
+ $tpl->render();
+ }
+
+
+ public function testRenderAssignsParams(){
+ $params = array('john' => 'doe');
+
+ $ocTpl = $this->getMock('Template', array('assign', 'fetchPage'));
+ $ocTpl->expects($this->once())
+ ->method('assign')
+ ->with($this->equalTo('john'), $this->equalTo('doe'));
+
+ $api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName', 'getTemplate'), array('app'));
+ $api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('app'));
+ $api->expects($this->once())
+ ->method('getTemplate')
+ ->with($this->equalTo('home'), $this->equalTo('user'), $this->equalTo('app'))
+ ->will($this->returnValue($ocTpl));
+
+ $tpl = new TemplateResponse($api, 'home');
+ $tpl->setParams($params);
+
+ $tpl->render();
+ }
+
+
+ public function testRenderDifferentApp(){
+ $ocTpl = $this->getMock('Template', array('fetchPage'));
+ $ocTpl->expects($this->once())
+ ->method('fetchPage');
+
+ $api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName', 'getTemplate'), array('app'));
+ $api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('app'));
+ $api->expects($this->once())
+ ->method('getTemplate')
+ ->with($this->equalTo('home'), $this->equalTo('user'), $this->equalTo('app2'))
+ ->will($this->returnValue($ocTpl));
+
+ $tpl = new TemplateResponse($api, 'home', 'app2');
+
+ $tpl->render();
+ }
+
+
+ public function testRenderDifferentRenderAs(){
+ $ocTpl = $this->getMock('Template', array('fetchPage'));
+ $ocTpl->expects($this->once())
+ ->method('fetchPage');
+
+ $api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName', 'getTemplate'), array('app'));
+ $api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('app'));
+ $api->expects($this->once())
+ ->method('getTemplate')
+ ->with($this->equalTo('home'), $this->equalTo('admin'), $this->equalTo('app'))
+ ->will($this->returnValue($ocTpl));
+
+ $tpl = new TemplateResponse($api, 'home');
+ $tpl->renderAs('admin');
+
+ $tpl->render();
+ }
+
+
+ public function testGetRenderAs(){
+ $render = 'myrender';
+ $this->tpl->renderAs($render);
+ $this->assertEquals($render, $this->tpl->getRenderAs());
+ }
+
+}
diff --git a/tests/lib/appframework/middleware/MiddlewareDispatcherTest.php b/tests/lib/appframework/middleware/MiddlewareDispatcherTest.php
new file mode 100644
index 00000000000..bfa54a48ea3
--- /dev/null
+++ b/tests/lib/appframework/middleware/MiddlewareDispatcherTest.php
@@ -0,0 +1,280 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework;
+
+use OC\AppFramework\Controller\Controller;
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Http\Response;
+use OC\AppFramework\Middleware\Middleware;
+use OC\AppFramework\Middleware\MiddlewareDispatcher;
+
+
+require_once(__DIR__ . "/../classloader.php");
+
+
+// needed to test ordering
+class TestMiddleware extends Middleware {
+ public static $beforeControllerCalled = 0;
+ public static $afterControllerCalled = 0;
+ public static $afterExceptionCalled = 0;
+ public static $beforeOutputCalled = 0;
+
+ public $beforeControllerOrder = 0;
+ public $afterControllerOrder = 0;
+ public $afterExceptionOrder = 0;
+ public $beforeOutputOrder = 0;
+
+ public $controller;
+ public $methodName;
+ public $exception;
+ public $response;
+ public $output;
+
+ private $beforeControllerThrowsEx;
+
+ public function __construct($beforeControllerThrowsEx) {
+ self::$beforeControllerCalled = 0;
+ self::$afterControllerCalled = 0;
+ self::$afterExceptionCalled = 0;
+ self::$beforeOutputCalled = 0;
+ $this->beforeControllerThrowsEx = $beforeControllerThrowsEx;
+ }
+
+ public function beforeController($controller, $methodName){
+ self::$beforeControllerCalled++;
+ $this->beforeControllerOrder = self::$beforeControllerCalled;
+ $this->controller = $controller;
+ $this->methodName = $methodName;
+ if($this->beforeControllerThrowsEx){
+ throw new \Exception();
+ }
+ }
+
+ public function afterException($controller, $methodName, \Exception $exception){
+ self::$afterExceptionCalled++;
+ $this->afterExceptionOrder = self::$afterExceptionCalled;
+ $this->controller = $controller;
+ $this->methodName = $methodName;
+ $this->exception = $exception;
+ parent::afterException($controller, $methodName, $exception);
+ }
+
+ public function afterController($controller, $methodName, Response $response){
+ self::$afterControllerCalled++;
+ $this->afterControllerOrder = self::$afterControllerCalled;
+ $this->controller = $controller;
+ $this->methodName = $methodName;
+ $this->response = $response;
+ return parent::afterController($controller, $methodName, $response);
+ }
+
+ public function beforeOutput($controller, $methodName, $output){
+ self::$beforeOutputCalled++;
+ $this->beforeOutputOrder = self::$beforeOutputCalled;
+ $this->controller = $controller;
+ $this->methodName = $methodName;
+ $this->output = $output;
+ return parent::beforeOutput($controller, $methodName, $output);
+ }
+}
+
+
+class MiddlewareDispatcherTest extends \PHPUnit_Framework_TestCase {
+
+ private $dispatcher;
+
+
+ public function setUp() {
+ $this->dispatcher = new MiddlewareDispatcher();
+ $this->controller = $this->getControllerMock();
+ $this->method = 'method';
+ $this->response = new Response();
+ $this->output = 'hi';
+ $this->exception = new \Exception();
+ }
+
+
+ private function getAPIMock(){
+ return $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName'), array('app'));
+ }
+
+
+ private function getControllerMock(){
+ return $this->getMock('OC\AppFramework\Controller\Controller', array('method'),
+ array($this->getAPIMock(), new Request()));
+ }
+
+
+ private function getMiddleware($beforeControllerThrowsEx=false){
+ $m1 = new TestMiddleware($beforeControllerThrowsEx);
+ $this->dispatcher->registerMiddleware($m1);
+ return $m1;
+ }
+
+
+ public function testAfterExceptionShouldReturnResponseOfMiddleware(){
+ $response = new Response();
+ $m1 = $this->getMock('\OC\AppFramework\Middleware\Middleware',
+ array('afterException', 'beforeController'));
+ $m1->expects($this->never())
+ ->method('afterException');
+
+ $m2 = $this->getMock('OC\AppFramework\Middleware\Middleware',
+ array('afterException', 'beforeController'));
+ $m2->expects($this->once())
+ ->method('afterException')
+ ->will($this->returnValue($response));
+
+ $this->dispatcher->registerMiddleware($m1);
+ $this->dispatcher->registerMiddleware($m2);
+
+ $this->dispatcher->beforeController($this->controller, $this->method);
+ $this->assertEquals($response, $this->dispatcher->afterException($this->controller, $this->method, $this->exception));
+ }
+
+
+ public function testAfterExceptionShouldThrowAgainWhenNotHandled(){
+ $m1 = new TestMiddleware(false);
+ $m2 = new TestMiddleware(true);
+
+ $this->dispatcher->registerMiddleware($m1);
+ $this->dispatcher->registerMiddleware($m2);
+
+ $this->setExpectedException('\Exception');
+ $this->dispatcher->beforeController($this->controller, $this->method);
+ $this->dispatcher->afterException($this->controller, $this->method, $this->exception);
+ }
+
+
+ public function testBeforeControllerCorrectArguments(){
+ $m1 = $this->getMiddleware();
+ $this->dispatcher->beforeController($this->controller, $this->method);
+
+ $this->assertEquals($this->controller, $m1->controller);
+ $this->assertEquals($this->method, $m1->methodName);
+ }
+
+
+ public function testAfterControllerCorrectArguments(){
+ $m1 = $this->getMiddleware();
+
+ $this->dispatcher->afterController($this->controller, $this->method, $this->response);
+
+ $this->assertEquals($this->controller, $m1->controller);
+ $this->assertEquals($this->method, $m1->methodName);
+ $this->assertEquals($this->response, $m1->response);
+ }
+
+
+ public function testAfterExceptionCorrectArguments(){
+ $m1 = $this->getMiddleware();
+
+ $this->setExpectedException('\Exception');
+
+ $this->dispatcher->beforeController($this->controller, $this->method);
+ $this->dispatcher->afterException($this->controller, $this->method, $this->exception);
+
+ $this->assertEquals($this->controller, $m1->controller);
+ $this->assertEquals($this->method, $m1->methodName);
+ $this->assertEquals($this->exception, $m1->exception);
+ }
+
+
+ public function testBeforeOutputCorrectArguments(){
+ $m1 = $this->getMiddleware();
+
+ $this->dispatcher->beforeOutput($this->controller, $this->method, $this->output);
+
+ $this->assertEquals($this->controller, $m1->controller);
+ $this->assertEquals($this->method, $m1->methodName);
+ $this->assertEquals($this->output, $m1->output);
+ }
+
+
+ public function testBeforeControllerOrder(){
+ $m1 = $this->getMiddleware();
+ $m2 = $this->getMiddleware();
+
+ $this->dispatcher->beforeController($this->controller, $this->method);
+
+ $this->assertEquals(1, $m1->beforeControllerOrder);
+ $this->assertEquals(2, $m2->beforeControllerOrder);
+ }
+
+ public function testAfterControllerOrder(){
+ $m1 = $this->getMiddleware();
+ $m2 = $this->getMiddleware();
+
+ $this->dispatcher->afterController($this->controller, $this->method, $this->response);
+
+ $this->assertEquals(2, $m1->afterControllerOrder);
+ $this->assertEquals(1, $m2->afterControllerOrder);
+ }
+
+
+ public function testAfterExceptionOrder(){
+ $m1 = $this->getMiddleware();
+ $m2 = $this->getMiddleware();
+
+ $this->setExpectedException('\Exception');
+ $this->dispatcher->beforeController($this->controller, $this->method);
+ $this->dispatcher->afterException($this->controller, $this->method, $this->exception);
+
+ $this->assertEquals(1, $m1->afterExceptionOrder);
+ $this->assertEquals(1, $m2->afterExceptionOrder);
+ }
+
+
+ public function testBeforeOutputOrder(){
+ $m1 = $this->getMiddleware();
+ $m2 = $this->getMiddleware();
+
+ $this->dispatcher->beforeOutput($this->controller, $this->method, $this->output);
+
+ $this->assertEquals(2, $m1->beforeOutputOrder);
+ $this->assertEquals(1, $m2->beforeOutputOrder);
+ }
+
+
+ public function testExceptionShouldRunAfterExceptionOfOnlyPreviouslyExecutedMiddlewares(){
+ $m1 = $this->getMiddleware();
+ $m2 = $this->getMiddleware(true);
+ $m3 = $this->getMock('\OC\AppFramework\Middleware\Middleware');
+ $m3->expects($this->never())
+ ->method('afterException');
+ $m3->expects($this->never())
+ ->method('beforeController');
+ $m3->expects($this->never())
+ ->method('afterController');
+
+ $this->dispatcher->registerMiddleware($m3);
+
+ $this->dispatcher->beforeOutput($this->controller, $this->method, $this->output);
+
+ $this->assertEquals(2, $m1->beforeOutputOrder);
+ $this->assertEquals(1, $m2->beforeOutputOrder);
+ }
+}
diff --git a/tests/lib/appframework/middleware/MiddlewareTest.php b/tests/lib/appframework/middleware/MiddlewareTest.php
new file mode 100644
index 00000000000..1adce6b3d4f
--- /dev/null
+++ b/tests/lib/appframework/middleware/MiddlewareTest.php
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework;
+
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Middleware\Middleware;
+
+
+require_once(__DIR__ . "/../classloader.php");
+
+
+class ChildMiddleware extends Middleware {};
+
+
+class MiddlewareTest extends \PHPUnit_Framework_TestCase {
+
+ private $middleware;
+ private $controller;
+ private $exception;
+ private $api;
+
+ protected function setUp(){
+ $this->middleware = new ChildMiddleware();
+
+ $this->api = $this->getMock('OC\AppFramework\Core\API',
+ array(), array('test'));
+
+ $this->controller = $this->getMock('OC\AppFramework\Controller\Controller',
+ array(), array($this->api, new Request()));
+ $this->exception = new \Exception();
+ $this->response = $this->getMock('OC\AppFramework\Http\Response');
+ }
+
+
+ public function testBeforeController() {
+ $this->middleware->beforeController($this->controller, null, $this->exception);
+ }
+
+
+ public function testAfterExceptionRaiseAgainWhenUnhandled() {
+ $this->setExpectedException('Exception');
+ $afterEx = $this->middleware->afterException($this->controller, null, $this->exception);
+ }
+
+
+ public function testAfterControllerReturnResponseWhenUnhandled() {
+ $response = $this->middleware->afterController($this->controller, null, $this->response);
+
+ $this->assertEquals($this->response, $response);
+ }
+
+
+ public function testBeforeOutputReturnOutputhenUnhandled() {
+ $output = $this->middleware->beforeOutput($this->controller, null, 'test');
+
+ $this->assertEquals('test', $output);
+ }
+
+
+}
diff --git a/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php b/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
new file mode 100644
index 00000000000..0b2103564e4
--- /dev/null
+++ b/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
@@ -0,0 +1,388 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Middleware\Security;
+
+use OC\AppFramework\Http\Http;
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Http\RedirectResponse;
+use OC\AppFramework\Http\JSONResponse;
+use OC\AppFramework\Middleware\Middleware;
+
+
+require_once(__DIR__ . "/../../classloader.php");
+
+
+class SecurityMiddlewareTest extends \PHPUnit_Framework_TestCase {
+
+ private $middleware;
+ private $controller;
+ private $secException;
+ private $secAjaxException;
+ private $request;
+
+ public function setUp() {
+ $api = $this->getMock('OC\AppFramework\Core\API', array(), array('test'));
+ $this->controller = $this->getMock('OC\AppFramework\Controller\Controller',
+ array(), array($api, new Request()));
+
+ $this->request = new Request();
+ $this->middleware = new SecurityMiddleware($api, $this->request);
+ $this->secException = new SecurityException('hey', false);
+ $this->secAjaxException = new SecurityException('hey', true);
+ }
+
+
+ private function getAPI(){
+ return $this->getMock('OC\AppFramework\Core\API',
+ array('isLoggedIn', 'passesCSRFCheck', 'isAdminUser',
+ 'isSubAdminUser', 'activateNavigationEntry',
+ 'getUserId'),
+ array('app'));
+ }
+
+
+ private function checkNavEntry($method, $shouldBeActivated=false){
+ $api = $this->getAPI();
+
+ if($shouldBeActivated){
+ $api->expects($this->once())
+ ->method('activateNavigationEntry');
+ } else {
+ $api->expects($this->never())
+ ->method('activateNavigationEntry');
+ }
+
+ $sec = new SecurityMiddleware($api, $this->request);
+ $sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest', $method);
+ }
+
+
+ /**
+ * @IsLoggedInExemption
+ * @CSRFExemption
+ * @IsAdminExemption
+ * @IsSubAdminExemption
+ */
+ public function testSetNavigationEntry(){
+ $this->checkNavEntry('testSetNavigationEntry', true);
+ }
+
+
+ private function ajaxExceptionCheck($method, $shouldBeAjax=false){
+ $api = $this->getAPI();
+ $api->expects($this->any())
+ ->method('passesCSRFCheck')
+ ->will($this->returnValue(false));
+
+ $sec = new SecurityMiddleware($api, $this->request);
+
+ try {
+ $sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest',
+ $method);
+ } catch (SecurityException $ex){
+ if($shouldBeAjax){
+ $this->assertTrue($ex->isAjax());
+ } else {
+ $this->assertFalse($ex->isAjax());
+ }
+
+ }
+ }
+
+
+ /**
+ * @Ajax
+ * @IsLoggedInExemption
+ * @CSRFExemption
+ * @IsAdminExemption
+ * @IsSubAdminExemption
+ */
+ public function testAjaxException(){
+ $this->ajaxExceptionCheck('testAjaxException');
+ }
+
+
+ /**
+ * @IsLoggedInExemption
+ * @CSRFExemption
+ * @IsAdminExemption
+ * @IsSubAdminExemption
+ */
+ public function testNoAjaxException(){
+ $this->ajaxExceptionCheck('testNoAjaxException');
+ }
+
+
+ private function ajaxExceptionStatus($method, $test, $status) {
+ $api = $this->getAPI();
+ $api->expects($this->any())
+ ->method($test)
+ ->will($this->returnValue(false));
+
+ $sec = new SecurityMiddleware($api, $this->request);
+
+ try {
+ $sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest',
+ $method);
+ } catch (SecurityException $ex){
+ $this->assertEquals($status, $ex->getCode());
+ }
+ }
+
+ /**
+ * @Ajax
+ */
+ public function testAjaxStatusLoggedInCheck() {
+ $this->ajaxExceptionStatus(
+ 'testAjaxStatusLoggedInCheck',
+ 'isLoggedIn',
+ Http::STATUS_UNAUTHORIZED
+ );
+ }
+
+ /**
+ * @Ajax
+ * @IsLoggedInExemption
+ */
+ public function testAjaxNotAdminCheck() {
+ $this->ajaxExceptionStatus(
+ 'testAjaxNotAdminCheck',
+ 'isAdminUser',
+ Http::STATUS_FORBIDDEN
+ );
+ }
+
+ /**
+ * @Ajax
+ * @IsLoggedInExemption
+ * @IsAdminExemption
+ */
+ public function testAjaxNotSubAdminCheck() {
+ $this->ajaxExceptionStatus(
+ 'testAjaxNotSubAdminCheck',
+ 'isSubAdminUser',
+ Http::STATUS_FORBIDDEN
+ );
+ }
+
+ /**
+ * @Ajax
+ * @IsLoggedInExemption
+ * @IsAdminExemption
+ * @IsSubAdminExemption
+ */
+ public function testAjaxStatusCSRFCheck() {
+ $this->ajaxExceptionStatus(
+ 'testAjaxStatusCSRFCheck',
+ 'passesCSRFCheck',
+ Http::STATUS_PRECONDITION_FAILED
+ );
+ }
+
+ /**
+ * @Ajax
+ * @CSRFExemption
+ * @IsLoggedInExemption
+ * @IsAdminExemption
+ * @IsSubAdminExemption
+ */
+ public function testAjaxStatusAllGood() {
+ $this->ajaxExceptionStatus(
+ 'testAjaxStatusAllGood',
+ 'isLoggedIn',
+ 0
+ );
+ $this->ajaxExceptionStatus(
+ 'testAjaxStatusAllGood',
+ 'isAdminUser',
+ 0
+ );
+ $this->ajaxExceptionStatus(
+ 'testAjaxStatusAllGood',
+ 'isSubAdminUser',
+ 0
+ );
+ $this->ajaxExceptionStatus(
+ 'testAjaxStatusAllGood',
+ 'passesCSRFCheck',
+ 0
+ );
+ }
+
+ /**
+ * @IsLoggedInExemption
+ * @CSRFExemption
+ * @IsAdminExemption
+ * @IsSubAdminExemption
+ */
+ public function testNoChecks(){
+ $api = $this->getAPI();
+ $api->expects($this->never())
+ ->method('passesCSRFCheck')
+ ->will($this->returnValue(true));
+ $api->expects($this->never())
+ ->method('isAdminUser')
+ ->will($this->returnValue(true));
+ $api->expects($this->never())
+ ->method('isSubAdminUser')
+ ->will($this->returnValue(true));
+ $api->expects($this->never())
+ ->method('isLoggedIn')
+ ->will($this->returnValue(true));
+
+ $sec = new SecurityMiddleware($api, $this->request);
+ $sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest',
+ 'testNoChecks');
+ }
+
+
+ private function securityCheck($method, $expects, $shouldFail=false){
+ $api = $this->getAPI();
+ $api->expects($this->once())
+ ->method($expects)
+ ->will($this->returnValue(!$shouldFail));
+
+ $sec = new SecurityMiddleware($api, $this->request);
+
+ if($shouldFail){
+ $this->setExpectedException('\OC\AppFramework\Middleware\Security\SecurityException');
+ }
+
+ $sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest', $method);
+ }
+
+
+ /**
+ * @IsLoggedInExemption
+ * @IsAdminExemption
+ * @IsSubAdminExemption
+ */
+ public function testCsrfCheck(){
+ $this->securityCheck('testCsrfCheck', 'passesCSRFCheck');
+ }
+
+
+ /**
+ * @IsLoggedInExemption
+ * @IsAdminExemption
+ * @IsSubAdminExemption
+ */
+ public function testFailCsrfCheck(){
+ $this->securityCheck('testFailCsrfCheck', 'passesCSRFCheck', true);
+ }
+
+
+ /**
+ * @CSRFExemption
+ * @IsAdminExemption
+ * @IsSubAdminExemption
+ */
+ public function testLoggedInCheck(){
+ $this->securityCheck('testLoggedInCheck', 'isLoggedIn');
+ }
+
+
+ /**
+ * @CSRFExemption
+ * @IsAdminExemption
+ * @IsSubAdminExemption
+ */
+ public function testFailLoggedInCheck(){
+ $this->securityCheck('testFailLoggedInCheck', 'isLoggedIn', true);
+ }
+
+
+ /**
+ * @IsLoggedInExemption
+ * @CSRFExemption
+ * @IsSubAdminExemption
+ */
+ public function testIsAdminCheck(){
+ $this->securityCheck('testIsAdminCheck', 'isAdminUser');
+ }
+
+
+ /**
+ * @IsLoggedInExemption
+ * @CSRFExemption
+ * @IsSubAdminExemption
+ */
+ public function testFailIsAdminCheck(){
+ $this->securityCheck('testFailIsAdminCheck', 'isAdminUser', true);
+ }
+
+
+ /**
+ * @IsLoggedInExemption
+ * @CSRFExemption
+ * @IsAdminExemption
+ */
+ public function testIsSubAdminCheck(){
+ $this->securityCheck('testIsSubAdminCheck', 'isSubAdminUser');
+ }
+
+
+ /**
+ * @IsLoggedInExemption
+ * @CSRFExemption
+ * @IsAdminExemption
+ */
+ public function testFailIsSubAdminCheck(){
+ $this->securityCheck('testFailIsSubAdminCheck', 'isSubAdminUser', true);
+ }
+
+
+
+ public function testAfterExceptionNotCaughtThrowsItAgain(){
+ $ex = new \Exception();
+ $this->setExpectedException('\Exception');
+ $this->middleware->afterException($this->controller, 'test', $ex);
+ }
+
+
+ public function testAfterExceptionReturnsRedirect(){
+ $api = $this->getMock('OC\AppFramework\Core\API', array(), array('test'));
+ $this->controller = $this->getMock('OC\AppFramework\Controller\Controller',
+ array(), array($api, new Request()));
+
+ $this->request = new Request(
+ array('server' => array('HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')));
+ $this->middleware = new SecurityMiddleware($api, $this->request);
+ $response = $this->middleware->afterException($this->controller, 'test',
+ $this->secException);
+
+ $this->assertTrue($response instanceof RedirectResponse);
+ }
+
+
+ public function testAfterAjaxExceptionReturnsJSONError(){
+ $response = $this->middleware->afterException($this->controller, 'test',
+ $this->secAjaxException);
+
+ $this->assertTrue($response instanceof JSONResponse);
+ }
+
+
+}
diff --git a/tests/lib/appframework/routing/RoutingTest.php b/tests/lib/appframework/routing/RoutingTest.php
new file mode 100644
index 00000000000..92ad461471d
--- /dev/null
+++ b/tests/lib/appframework/routing/RoutingTest.php
@@ -0,0 +1,214 @@
+<?php
+
+namespace OC\AppFramework\Routing;
+
+use OC\AppFramework\DependencyInjection\DIContainer;
+use OC\AppFramework\routing\RouteConfig;
+
+require_once(__DIR__ . "/../classloader.php");
+
+class RouteConfigTest extends \PHPUnit_Framework_TestCase
+{
+
+ public function testSimpleRoute()
+ {
+ $routes = array('routes' => array(
+ array('name' => 'folders#open', 'url' => '/folders/{folderId}/open', 'verb' => 'GET')
+ ));
+
+ $this->assertSimpleRoute($routes, 'folders.open', 'GET', '/folders/{folderId}/open', 'FoldersController', 'open');
+ }
+
+ public function testSimpleRouteWithMissingVerb()
+ {
+ $routes = array('routes' => array(
+ array('name' => 'folders#open', 'url' => '/folders/{folderId}/open')
+ ));
+
+ $this->assertSimpleRoute($routes, 'folders.open', 'GET', '/folders/{folderId}/open', 'FoldersController', 'open');
+ }
+
+ public function testSimpleRouteWithLowercaseVerb()
+ {
+ $routes = array('routes' => array(
+ array('name' => 'folders#open', 'url' => '/folders/{folderId}/open', 'verb' => 'delete')
+ ));
+
+ $this->assertSimpleRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open');
+ }
+
+ /**
+ * @expectedException \UnexpectedValueException
+ */
+ public function testSimpleRouteWithBrokenName()
+ {
+ $routes = array('routes' => array(
+ array('name' => 'folders_open', 'url' => '/folders/{folderId}/open', 'verb' => 'delete')
+ ));
+
+ // router mock
+ $router = $this->getMock("\OC_Router", array('create'));
+
+ // load route configuration
+ $container = new DIContainer('app1');
+ $config = new RouteConfig($container, $router, $routes);
+
+ $config->register();
+ }
+
+ public function testSimpleRouteWithUnderScoreNames()
+ {
+ $routes = array('routes' => array(
+ array('name' => 'admin_folders#open_current', 'url' => '/folders/{folderId}/open', 'verb' => 'delete')
+ ));
+
+ $this->assertSimpleRoute($routes, 'admin_folders.open_current', 'DELETE', '/folders/{folderId}/open', 'AdminFoldersController', 'openCurrent');
+ }
+
+ public function testResource()
+ {
+ $routes = array('resources' => array('accounts' => array('url' => '/accounts')));
+
+ $this->assertResource($routes, 'accounts', '/accounts', 'AccountsController', 'accountId');
+ }
+
+ public function testResourceWithUnderScoreName()
+ {
+ $routes = array('resources' => array('admin_accounts' => array('url' => '/admin/accounts')));
+
+ $this->assertResource($routes, 'admin_accounts', '/admin/accounts', 'AdminAccountsController', 'adminAccountId');
+ }
+
+ private function assertSimpleRoute($routes, $name, $verb, $url, $controllerName, $actionName)
+ {
+ // route mocks
+ $route = $this->mockRoute($verb, $controllerName, $actionName);
+
+ // router mock
+ $router = $this->getMock("\OC_Router", array('create'));
+
+ // we expect create to be called once:
+ $router
+ ->expects($this->once())
+ ->method('create')
+ ->with($this->equalTo('app1.' . $name), $this->equalTo($url))
+ ->will($this->returnValue($route));
+
+ // load route configuration
+ $container = new DIContainer('app1');
+ $config = new RouteConfig($container, $router, $routes);
+
+ $config->register();
+ }
+
+ private function assertResource($yaml, $resourceName, $url, $controllerName, $paramName)
+ {
+ // router mock
+ $router = $this->getMock("\OC_Router", array('create'));
+
+ // route mocks
+ $indexRoute = $this->mockRoute('GET', $controllerName, 'index');
+ $showRoute = $this->mockRoute('GET', $controllerName, 'show');
+ $createRoute = $this->mockRoute('POST', $controllerName, 'create');
+ $updateRoute = $this->mockRoute('PUT', $controllerName, 'update');
+ $destroyRoute = $this->mockRoute('DELETE', $controllerName, 'destroy');
+
+ $urlWithParam = $url . '/{' . $paramName . '}';
+
+ // we expect create to be called once:
+ $router
+ ->expects($this->at(0))
+ ->method('create')
+ ->with($this->equalTo('app1.' . $resourceName . '.index'), $this->equalTo($url))
+ ->will($this->returnValue($indexRoute));
+
+ $router
+ ->expects($this->at(1))
+ ->method('create')
+ ->with($this->equalTo('app1.' . $resourceName . '.show'), $this->equalTo($urlWithParam))
+ ->will($this->returnValue($showRoute));
+
+ $router
+ ->expects($this->at(2))
+ ->method('create')
+ ->with($this->equalTo('app1.' . $resourceName . '.create'), $this->equalTo($url))
+ ->will($this->returnValue($createRoute));
+
+ $router
+ ->expects($this->at(3))
+ ->method('create')
+ ->with($this->equalTo('app1.' . $resourceName . '.update'), $this->equalTo($urlWithParam))
+ ->will($this->returnValue($updateRoute));
+
+ $router
+ ->expects($this->at(4))
+ ->method('create')
+ ->with($this->equalTo('app1.' . $resourceName . '.destroy'), $this->equalTo($urlWithParam))
+ ->will($this->returnValue($destroyRoute));
+
+ // load route configuration
+ $container = new DIContainer('app1');
+ $config = new RouteConfig($container, $router, $yaml);
+
+ $config->register();
+ }
+
+ /**
+ * @param $verb
+ * @param $controllerName
+ * @param $actionName
+ * @return \PHPUnit_Framework_MockObject_MockObject
+ */
+ private function mockRoute($verb, $controllerName, $actionName)
+ {
+ $container = new DIContainer('app1');
+ $route = $this->getMock("\OC_Route", array('method', 'action'), array(), '', false);
+ $route
+ ->expects($this->exactly(1))
+ ->method('method')
+ ->with($this->equalTo($verb))
+ ->will($this->returnValue($route));
+
+ $route
+ ->expects($this->exactly(1))
+ ->method('action')
+ ->with($this->equalTo(new RouteActionHandler($container, $controllerName, $actionName)))
+ ->will($this->returnValue($route));
+ return $route;
+ }
+
+}
+
+/*
+#
+# sample routes.yaml for ownCloud
+#
+# the section simple describes one route
+
+routes:
+ - name: folders#open
+ url: /folders/{folderId}/open
+ verb: GET
+ # controller: name.split()[0]
+ # action: name.split()[1]
+
+# for a resource following actions will be generated:
+# - index
+# - create
+# - show
+# - update
+# - destroy
+# - new
+resources:
+ accounts:
+ url: /accounts
+
+ folders:
+ url: /accounts/{accountId}/folders
+ # actions can be used to define additional actions on the resource
+ actions:
+ - name: validate
+ verb: GET
+ on-collection: false
+
+ * */
diff --git a/tests/lib/appframework/utility/MethodAnnotationReaderTest.php b/tests/lib/appframework/utility/MethodAnnotationReaderTest.php
new file mode 100644
index 00000000000..bcdcf3de37b
--- /dev/null
+++ b/tests/lib/appframework/utility/MethodAnnotationReaderTest.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Utility;
+
+
+require_once __DIR__ . "/../classloader.php";
+
+
+class MethodAnnotationReaderTest extends \PHPUnit_Framework_TestCase {
+
+
+ /**
+ * @Annotation
+ */
+ public function testReadAnnotation(){
+ $reader = new MethodAnnotationReader('\OC\AppFramework\Utility\MethodAnnotationReaderTest',
+ 'testReadAnnotation');
+
+ $this->assertTrue($reader->hasAnnotation('Annotation'));
+ }
+
+
+ /**
+ * @Annotation
+ * @param test
+ */
+ public function testReadAnnotationNoLowercase(){
+ $reader = new MethodAnnotationReader('\OC\AppFramework\Utility\MethodAnnotationReaderTest',
+ 'testReadAnnotationNoLowercase');
+
+ $this->assertTrue($reader->hasAnnotation('Annotation'));
+ $this->assertFalse($reader->hasAnnotation('param'));
+ }
+
+
+}