diff options
Diffstat (limited to 'tests/Router/Runner/ControllerTest.php')
-rw-r--r-- | tests/Router/Runner/ControllerTest.php | 182 |
1 files changed, 61 insertions, 121 deletions
diff --git a/tests/Router/Runner/ControllerTest.php b/tests/Router/Runner/ControllerTest.php index 433d36d..694fe5b 100644 --- a/tests/Router/Runner/ControllerTest.php +++ b/tests/Router/Runner/ControllerTest.php @@ -1,140 +1,80 @@ <?php +namespace Jasny\Router; + use Jasny\Router\Route; -use Jasny\Router\Runner\Controller; +use Jasny\Router\Runner; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; -class ControllerTest extends PHPUnit_Framework_TestCase -{ - /** - * Tmp scripts - * @var array - **/ - public static $files = []; - - /** - * Test creating Controller runner - * - * @dataProvider phpScriptProvider - * @param Route $route - * @param boolean $positive - */ - public function testPhpScript($route, $positive) - { - $runner = new Controller($route); +use Jasny\Router\TestHelpers; +/** + * @covers Jasny\Router\Runner\Controller; + */ +class ControllerTest extends \PHPUnit_Framework_TestCase +{ + use TestHelpers; + + public function testInvoke() + { $request = $this->createMock(ServerRequestInterface::class); $response = $this->createMock(ResponseInterface::class); - $request->expects($this->once())->method('getAttribute')->with($this->equalTo('route'))->will($this->returnValue($route)); - - if (!$positive) $this->expectException(\RuntimeException::class); - $result = $runner->run($request, $response); - - $this->assertEquals($request, $result['request'], "Request object was not passed correctly to result"); - $this->assertEquals($response, $result['response'], "Response object was not passed correctly to result"); + $finalResponse = $this->createMock(ResponseInterface::class); + + $controller = $this->createCallbackMock($this->once(), [$request, $response], $finalResponse); + $class = get_class($controller); + + $route = $this->createMock(Route::class); + $route->controller = $class; + + $request->expects($this->once())->method('getAttribute')->with('route')->willReturn($route); + + $runner = $this->getMockBuilder(Runner\Controller::class)->setMethods(['instantiate'])->getMock(); + $runner->expects($this->once())->method('instantiate')->with($class)->willReturn($controller); + + $result = $runner($request, $response); + + $this->assertSame($finalResponse, $result); } - - /** - * Provide data for testing 'create' method - */ - public function phpScriptProvider() - { - foreach (['noInvoke', 'withInvoke'] as $type) { - list($class, $path) = static::createTmpScript($type); - static::$files[$type] = compact('class', 'path'); - } - - return [ - [Route::create(['test' => 'test']), false], - [Route::create(['fn' => 'testFunction', 'value' => 'test']), false], - [Route::create(['controller' => 'TestController', 'value' => 'test']), false], - [Route::create(['controller' => '', 'value' => 'test']), false], - [Route::create(['controller' => static::$files['noInvoke']['class'], 'path' => static::$files['noInvoke']['path']]), false], - [Route::create(['controller' => static::$files['withInvoke']['class'], 'path' => static::$files['withInvoke']['path']]), true], - ]; - } - - /** - * Delete tmp test scripts - */ - public static function tearDownAfterClass() - { - foreach (static::$files as $path) { - unlink($path['path']); - } - } - + /** - * Create single tmp script file for testing - * - * @param string $type ('returnTrue', 'returnNotTrue') - * @return string $path + * @expectedException RuntimeException + * @expectedExceptionMessage Can not route to controller 'FooBarZoo': class not exists */ - public static function createTmpScript($type) - { - $dir = rtrim(sys_get_temp_dir(), '/'); - - do { - $name = static::getRandomString() . '-test-script.php'; - $path = $dir . '/' . $name; - - if (!file_exists($path)) break; - } while (true); - - if ($type === 'noInvoke') { - $class = 'RunnerTestConrtollerInvalid'; - $content = -<<<CONTENT -<?php - -class $class { - public \$route = null; - - public function __construct(\$route) + public function testInvalidClass() { - \$this->route = \$route; - } -} -CONTENT; - } else { - $class = 'RunnerTestConrtoller'; - $content = -<<<CONTENT -<?php - -class $class { - public \$route = null; - - public function __construct(\$route) - { - \$this->route = \$route; + $request = $this->createMock(ServerRequestInterface::class); + $response = $this->createMock(ResponseInterface::class); + + $route = $this->createMock(Route::class); + $route->controller = 'foo-bar-zoo'; + + $request->expects($this->once())->method('getAttribute')->with('route')->willReturn($route); + + $runner = $this->getMockBuilder(Runner\Controller::class)->setMethods(['instantiate'])->getMock(); + $runner->expects($this->never())->method('instantiate'); + + $runner($request, $response); } - public function __invoke(Psr\Http\Message\ServerRequestInterface \$request, Psr\Http\Message\ResponseInterface \$response) - { - return ['request' => \$request, 'response' => \$response]; - } -} -CONTENT; - } - - $bytes = file_put_contents($path, $content); - static::assertTrue((int)$bytes > 0); - - require_once $path; - - return [$class, $path]; - } - /** - * Get random string of given length (no more then length of md5 hash) - * - * @param int $length - * @return string + * @expectedException RuntimeException + * @expectedExceptionMessage Can not route to controller 'StdClass': class does not have '__invoke' method */ - public static function getRandomString($length = 10) - { - return substr(md5(microtime(true) * mt_rand()), 0, $length); + public function testInvokeNotCallable() + { + $request = $this->createMock(ServerRequestInterface::class); + $response = $this->createMock(ResponseInterface::class); + + $route = $this->createMock(Route::class); + $route->controller = 'std-class'; + + $request->expects($this->once())->method('getAttribute')->with('route')->willReturn($route); + + $runner = $this->getMockBuilder(Runner\Controller::class)->setMethods(['instantiate'])->getMock(); + $runner->expects($this->never())->method('instantiate'); + + $runner($request, $response); } } |