diff options
author | Arnold Daniels <arnold@jasny.net> | 2016-11-03 23:45:36 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-03 23:45:36 +0100 |
commit | f3d05dfca77843a869e938028824f19307780939 (patch) | |
tree | 846c5e559360e530d200d897f67b5af02f8795e5 /tests/Router/Runner | |
parent | aa31c40618b0cc7b43b7a1cb107e97b49e2c06f1 (diff) | |
parent | bd4cb77fbf04923fa31a08fdd1f33f2c0db87864 (diff) | |
download | router-1.0.0.zip router-1.0.0.tar.gz router-1.0.0.tar.bz2 |
Merge pull request #13 from jasny/fix-testsv1.0.0
Fix tests
Diffstat (limited to 'tests/Router/Runner')
-rw-r--r-- | tests/Router/Runner/CallbackTest.php | 89 | ||||
-rw-r--r-- | tests/Router/Runner/ControllerTest.php | 182 | ||||
-rw-r--r-- | tests/Router/Runner/PhpScriptTest.php | 152 | ||||
-rw-r--r-- | tests/Router/Runner/RunnerFactoryTest.php | 41 |
4 files changed, 205 insertions, 259 deletions
diff --git a/tests/Router/Runner/CallbackTest.php b/tests/Router/Runner/CallbackTest.php index 8a31794..39c2798 100644 --- a/tests/Router/Runner/CallbackTest.php +++ b/tests/Router/Runner/CallbackTest.php @@ -1,64 +1,73 @@ <?php +namespace Jasny\Router; + use Jasny\Router\Route; use Jasny\Router\Runner\Callback; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; -class CallbackTest extends PHPUnit_Framework_TestCase +use Jasny\Router\TestHelpers; + +/** + * @covers Jasny\Router\Runner\Callback + */ +class CallbackTest extends \PHPUnit_Framework_TestCase { + use TestHelpers; + /** * Test creating Callback runner - * - * @dataProvider callbackProvider - * @param Route $route - * @param boolean $positive */ - public function testCallback($route, $positive) + public function testCallback() { - $runner = new Callback($route); - $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); - - if (!$positive) return; - - $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); + + $route = $this->createMock(Route::class); + $route->fn = $this->createCallbackMock($this->once(), [$request, $response], $finalResponse); + + $request->expects($this->once())->method('getAttribute')->with('route')->willReturn($route); + + $runner = new Callback($route); + $result = $runner($request, $response); + + $this->assertSame($finalResponse, $result); } - - + /** - * Provide data fpr testing 'create' method + * @expectedException RuntimeException + * @expectedExceptionMessage 'fn' property of route shoud be a callable */ - public function callbackProvider() + public function testNoCallback() { - $callback = function($request, $response) { - return ['request' => $request, 'response' => $response]; - }; - - return [ - [Route::create(['fn' => $callback, 'value' => 'test']), true], - [Route::create(['fn' => [$this, 'getCallback'], 'value' => 'test']), true], - [Route::create(['controller' => 'TestController', 'value' => 'test']), false], - [Route::create(['file' => 'some_file.php', 'value' => 'test']), false], - [Route::create(['test' => 'test']), false], - ]; + $request = $this->createMock(ServerRequestInterface::class); + $response = $this->createMock(ResponseInterface::class); + + $route = $this->createMock(Route::class); + + $request->expects($this->once())->method('getAttribute')->with('route')->willReturn($route); + + $runner = new Callback($route); + $runner($request, $response); } - + /** - * Testable callback for creating Route - * - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @return array + * @expectedException RuntimeException + * @expectedExceptionMessage 'fn' property of route shoud be a callable */ - public function getCallback($request, $response) + public function testInvalidCallback() { - return ['request' => $request, 'response' => $response]; + $request = $this->createMock(ServerRequestInterface::class); + $response = $this->createMock(ResponseInterface::class); + + $route = $this->createMock(Route::class); + $route->fn = 'foo bar zoo'; + + $request->expects($this->once())->method('getAttribute')->with('route')->willReturn($route); + + $runner = new Callback($route); + $runner($request, $response); } } 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); } } diff --git a/tests/Router/Runner/PhpScriptTest.php b/tests/Router/Runner/PhpScriptTest.php index 2f31f73..658998b 100644 --- a/tests/Router/Runner/PhpScriptTest.php +++ b/tests/Router/Runner/PhpScriptTest.php @@ -1,90 +1,128 @@ <?php +namespace Jasny\Router; + use Jasny\Router\Route; -use Jasny\Router\Runner\PhpScript; +use Jasny\Router\Runner; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; -class PhpScriptTest extends PHPUnit_Framework_TestCase +use org\bovigo\vfs\vfsStream; +use org\bovigo\vfs\vfsStreamDirectory; + +/** + * @covers Jasny\Router\Runner\PhpScript + */ +class PhpScriptTest extends \PHPUnit_Framework_TestCase { /** - * Test creating PhpScript runner - * - * @dataProvider phpScriptProvider - * @param Route $route - * @param boolean $positive + * @var vfsStreamDirectory */ - public function testPhpScript($route, $positive) - { - $runner = new PhpScript($route); + protected $root; + + public function setUp() + { + $this->root = vfsStream::setup('root'); + $this->root->addChild(vfsStream::newFile('true.php')->setContent('<?php ?>')); + $this->root->addChild(vfsStream::newFile('foo.php')->setContent('<?php return "foo"; ?>')); + } + 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); + $finalResponse = $this->createMock(ResponseInterface::class); - if ($route->type === 'returnTrue') { - $this->assertEquals($response, $result, "Request object was not returned as result"); - } else { - $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"); - } + $route = $this->createMock(Route::class); + $route->file = vfsStream::url('root/foo.php'); + + $request->expects($this->once())->method('getAttribute')->with('route')->willReturn($route); + + $runner = $this->getMockBuilder(Runner\PhpScript::class)->setMethods(['includeScript'])->getMock(); + $runner->expects($this->once())->method('includeScript') + ->with(vfsStream::url('root/foo.php'), $request, $response) + ->willReturn($finalResponse); - unlink($route->file); + $result = $runner($request, $response); + + $this->assertSame($finalResponse, $result); } - - /** - * Provide data fpr testing 'create' method - */ + public function phpScriptProvider() { + $routeTrue = $this->createMock(Route::class); + $routeTrue->file = vfsStream::url('root/true.php'); + + $routeFoo = $this->createMock(Route::class); + $routeFoo->file = vfsStream::url('root/foo.php'); + return [ - [Route::create(['test' => 'test']), false], - [Route::create(['fn' => 'testFunction', 'value' => 'test']), false], - [Route::create(['controller' => 'TestController', 'value' => 'test']), false], - [Route::create(['file' => '', 'value' => 'test']), false], - [Route::create(['file' => 'some_file.php', 'value' => 'test']), false], - [Route::create(['file' => '../' . basename(getcwd()), 'value' => 'test']), false], - [Route::create(['file' => $this->createTmpScript('returnTrue'), 'type' => 'returnTrue']), true], - [Route::create(['file' => $this->createTmpScript('returnNotTrue'), 'type' => 'returnNotTrue']), true] + [$routeTrue, 1], + [$routeFoo, 'foo'] ]; } - + /** - * Create single tmp script file for testing - * - * @param string $type ('returnTrue', 'returnNotTrue') - * @return string $path + * @dataProvider phpScriptProvider + * + * @param Route $route + * @param mixed $expected */ - public function createTmpScript($type) + public function testInvokeIncludeScript($route, $expected) { - $dir = rtrim(sys_get_temp_dir(), '/'); - - do { - $name = $this->getRandomString() . '-test-script.php'; - $path = $dir . '/' . $name; + $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 (!file_exists($path)) break; - } while (true); + $runner = new Runner\PhpScript($route); + + if ($expected === 1) { + $expected = $response; + } + + $result = $runner->run($request, $response); + + $this->assertSame($expected, $result); + } - $content = $type === 'returnTrue' ? "<?php\n return true;" : "<?php\n return ['request' => \$request, 'response' => \$response];"; - $bytes = file_put_contents($path, $content); + /** + * @expectedException \RuntimeException + * @expectedExceptionMessage Failed to route using 'vfs://root/bar.php': File doesn't exist + */ + public function testInvokeWithNonExistingFile() + { + $request = $this->createMock(ServerRequestInterface::class); + $response = $this->createMock(ResponseInterface::class); - $this->assertTrue((int)$bytes > 0); + $route = $this->createMock(Route::class); + $route->file = vfsStream::url('root/bar.php'); + + $request->expects($this->once())->method('getAttribute')->with('route')->willReturn($route); + + $runner = $this->getMockBuilder(Runner\PhpScript::class)->setMethods(['includeScript'])->getMock(); + $runner->expects($this->never())->method('includeScript'); - return $path; + $runner($request, $response); } /** - * Get random string of given length (no more then length of md5 hash) - * - * @param int $length - * @return string + * @expectedException \RuntimeException + * @expectedExceptionMessage Won't route to 'vfs://root/../bar.php': '~', '..' are not allowed in filename */ - public function getRandomString($length = 10) - { - return substr(md5(microtime(true) * mt_rand()), 0, $length); + public function testInvokeWithIlligalFilename() + { + $request = $this->createMock(ServerRequestInterface::class); + $response = $this->createMock(ResponseInterface::class); + + $route = $this->createMock(Route::class); + $route->file = vfsStream::url('root/../bar.php'); + + $request->expects($this->once())->method('getAttribute')->with('route')->willReturn($route); + + $runner = $this->getMockBuilder(Runner\PhpScript::class)->setMethods(['includeScript'])->getMock(); + $runner->expects($this->never())->method('includeScript'); + + $runner($request, $response); } + } diff --git a/tests/Router/Runner/RunnerFactoryTest.php b/tests/Router/Runner/RunnerFactoryTest.php deleted file mode 100644 index c18656d..0000000 --- a/tests/Router/Runner/RunnerFactoryTest.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -use Jasny\Router\Route; -use Jasny\Router\Runner\RunnerFactory; -use Jasny\Router\Runner\Controller; -use Jasny\Router\Runner\Callback; -use Jasny\Router\Runner\PhpScript; - -class RunnerFactoryTest extends PHPUnit_Framework_TestCase -{ - /** - * Test creating Runner object using factory - * - * @dataProvider createProvider - * @param Route $route - * @param string $class Runner class to use - * @param boolean $positive - */ - public function testCreate($route, $class, $positive) - { - if (!$positive) $this->expectException(\InvalidArgumentException::class); - - $factory = new RunnerFactory(); - $runner = $factory($route); - - $this->assertInstanceOf($class, $runner, "Runner object has invalid class"); - } - - /** - * Provide data fpr testing 'create' method - */ - public function createProvider() - { - return [ - [Route::create(['controller' => 'TestController', 'value' => 'test']), Controller::class, true], - [Route::create(['fn' => 'testFunction', 'value' => 'test']), Callback::class, true], - [Route::create(['file' => 'some_file.php', 'value' => 'test']), PhpScript::class, true], - [Route::create(['test' => 'test']), '', false], - ]; - } -} |