summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/Router/Runner/ControllerTest.php2
-rw-r--r--tests/RouterTest.php138
2 files changed, 131 insertions, 9 deletions
diff --git a/tests/Router/Runner/ControllerTest.php b/tests/Router/Runner/ControllerTest.php
index 8885ec6..5bbbeca 100644
--- a/tests/Router/Runner/ControllerTest.php
+++ b/tests/Router/Runner/ControllerTest.php
@@ -11,7 +11,7 @@ use Psr\Http\Message\StreamInterface;
use Jasny\Router\TestHelpers;
/**
- * @covers Jasny\Router\Runner\Controller;
+ * @covers Jasny\Router\Runner\Controller
*/
class ControllerTest extends \PHPUnit_Framework_TestCase
{
diff --git a/tests/RouterTest.php b/tests/RouterTest.php
index c036c71..3e5accf 100644
--- a/tests/RouterTest.php
+++ b/tests/RouterTest.php
@@ -1,6 +1,6 @@
<?php
-namespace Jasny\Router;
+namespace Jasny;
use Jasny\Router;
use Jasny\Router\Route;
@@ -9,6 +9,8 @@ use Jasny\Router\RunnerFactory;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
+use Psr\Http\Message\UriInterface;
+use PHPUnit_Framework_MockObject_Matcher_InvokedCount as InvokedCount;
use Jasny\Router\TestHelpers;
@@ -170,6 +172,50 @@ class RouterTest extends \PHPUnit_Framework_TestCase
$this->assertSame([$middlewareOne, $middlewareTwo], $router->getMiddlewares());
}
+ public function middlewareWithPathProvider()
+ {
+ return [
+ ['/', $this->never(), $this->once(), 'zoo'],
+ ['/foo', $this->once(), $this->never(), 'foo'],
+ ['/foo/bar', $this->once(), $this->never(), 'foo'],
+ ['/zoo', $this->never(), $this->once(), 'zoo']
+ ];
+ }
+
+ /**
+ * Test adding middleware action specifying a path
+ * @dataProvider middlewareWithPathProvider
+ *
+ * @param string $path
+ * @param InvokedCount $invokeMiddleware
+ * @param InvokedCount $invokeNext
+ * @param string $expect
+ */
+ public function testAddMiddlewareWithPath($path, $invokeMiddleware, $invokeNext, $expect)
+ {
+ $uri = $this->createMock(UriInterface::class);
+ $uri->method('getPath')->willReturn($path);
+
+ $request = $this->createMock(ServerRequestInterface::class);
+ $request->method('getUri')->willReturn($uri);
+
+ $response = $this->createMock(ResponseInterface::class);
+
+ $middleware = $this->createCallbackMock($invokeMiddleware, [$request, $response], 'foo');
+ $next = $this->createCallbackMock($invokeNext, [$request, $response], 'zoo');
+
+ $router = new Router($this->createMock(Routes::class));
+ $router->add('/foo', $middleware);
+
+ list($fn) = $router->getMiddlewares() + [null];
+
+ $this->assertNotSame($middleware, $fn);
+
+ $result = $fn($request, $response, $next);
+
+ $this->assertEquals($expect, $result);
+ }
+
/**
* @expectedException \InvalidArgumentException
*/
@@ -178,18 +224,46 @@ class RouterTest extends \PHPUnit_Framework_TestCase
$router = new Router($this->createMock(Routes::class));
$router->add('foo bar zoo');
}
+
+ /**
+ * @expectedException PHPUnit_Framework_Error
+ * @expectedException Middleware path 'foobar' doesn't start with a '/'
+ */
+ public function testAddNoticeWeirdPath()
+ {
+ $middleware = $this->createCallbackMock($this->never());
+
+ $router = new Router($this->createMock(Routes::class));
+ $router->add('foobar', $middleware);
+ }
+
+ public function testAddNoticeWeirdPathSkip()
+ {
+ $middleware = $this->createCallbackMock($this->never());
+
+ $router = new Router($this->createMock(Routes::class));
+ @$router->add('foobar', $middleware);
+
+ $this->assertCount(1, $router->getMiddlewares());
+ }
/**
- * Test executing router with middlewares chain (test only execution order)
+ * Test executing router with middlewares chain
*/
- public function testRunMiddlewares()
+ public function testRunWithMiddlewares()
{
$route = $this->createMock(Route::class);
+ $uri = $this->createMock(UriInterface::class);
+ $uri->method('getPath')->willReturn('/');
+
$request = $this->createMock(ServerRequestInterface::class);
- $request->expects($this->once())->method('withAttribute')->with('route')->willReturn($request);
+ $request->method('getUri')->willReturn($uri);
+
$requestOne = $this->createMock(ServerRequestInterface::class);
+ $requestOne->expects($this->never())->method('withAttribute');
$requestTwo = $this->createMock(ServerRequestInterface::class);
+ $requestTwo->expects($this->once())->method('withAttribute')->with('route')->willReturn($requestTwo);
$response = $this->createMock(ResponseInterface::class);
$responseOne = $this->createMock(ResponseInterface::class);
@@ -197,15 +271,15 @@ class RouterTest extends \PHPUnit_Framework_TestCase
$finalResponse = $this->createMock(ResponseInterface::class);
$middlewareOne = $this->getMockBuilder(\stdClass::class)->setMethods(['__invoke'])->getMock();
- $middlewareOne->expects($this->once())->method('__invoke')->id('one')
- ->with($request, $response, $this->isInstanceOf(Closure::class))
+ $middlewareOne->expects($this->once())->method('__invoke')
+ ->with($request, $response, $this->isInstanceOf(\Closure::class))
->will($this->returnCallback(function($a, $b, $next) use ($requestOne, $responseOne) {
return $next($requestOne, $responseOne);
}));
$middlewareTwo = $this->getMockBuilder(\stdClass::class)->setMethods(['__invoke'])->getMock();
- $middlewareTwo->expects($this->once())->method('__invoke')->id('two')->after('one')
- ->with($request, $response, $this->isInstanceOf(Closure::class))
+ $middlewareTwo->expects($this->once())->method('__invoke')
+ ->with($request, $response, $this->isInstanceOf(\Closure::class))
->will($this->returnCallback(function($a, $b, $next) use ($requestTwo, $responseTwo) {
return $next($requestTwo, $responseTwo);
}));
@@ -221,6 +295,54 @@ class RouterTest extends \PHPUnit_Framework_TestCase
$router->add($middlewareOne);
$router->add($middlewareTwo);
+
+ $result = $router($request, $response);
+
+ $this->assertSame($finalResponse, $result);
+ }
+
+ /**
+ * Test executing router with middlewares chain where each middleware is only applied for specific paths
+ */
+ public function testRunWithMiddlewaresByPath()
+ {
+ $route = $this->createMock(Route::class);
+
+ $uri = $this->createMock(UriInterface::class);
+ $uri->method('getPath')->willReturn('/foo/bar');
+
+ $request = $this->createMock(ServerRequestInterface::class);
+ $request->method('getUri')->willReturn($uri);
+
+ $requestOne = $this->createMock(ServerRequestInterface::class);
+ $requestOne->expects($this->once())->method('withAttribute')->with('route')->willReturn($requestOne);
+ $requestOne->method('getUri')->willReturn($uri);
+
+ $response = $this->createMock(ResponseInterface::class);
+ $responseOne = $this->createMock(ResponseInterface::class);
+ $finalResponse = $this->createMock(ResponseInterface::class);
+
+ $middlewareOne = $this->getMockBuilder(\stdClass::class)->setMethods(['__invoke'])->getMock();
+ $middlewareOne->expects($this->once())->method('__invoke')
+ ->with($request, $response, $this->isInstanceOf(\Closure::class))
+ ->will($this->returnCallback(function($a, $b, $next) use ($requestOne, $responseOne) {
+ return $next($requestOne, $responseOne);
+ }));
+
+ $middlewareTwo = $this->getMockBuilder(\stdClass::class)->setMethods(['__invoke'])->getMock();
+ $middlewareTwo->expects($this->never())->method('__invoke');
+
+ $runner = $this->createCallbackMock($this->once(), [$requestOne, $responseOne], $finalResponse);
+ $factory = $this->createCallbackMock($this->once(), [$route], $runner);
+
+ $routes = $this->createMock(Routes::class);
+ $routes->expects($this->once())->method('getRoute')->with($request)->willReturn($route);
+
+ $router = new Router($routes);
+ $router->setFactory($factory);
+
+ $router->add('/foo', $middlewareOne);
+ $router->add('/zoo', $middlewareTwo);
$result = $router($request, $response);