summaryrefslogtreecommitdiffstats
path: root/tests/Router/Runner
diff options
context:
space:
mode:
authorArnold Daniels <arnold@jasny.net>2016-11-03 23:45:36 +0100
committerGitHub <noreply@github.com>2016-11-03 23:45:36 +0100
commitf3d05dfca77843a869e938028824f19307780939 (patch)
tree846c5e559360e530d200d897f67b5af02f8795e5 /tests/Router/Runner
parentaa31c40618b0cc7b43b7a1cb107e97b49e2c06f1 (diff)
parentbd4cb77fbf04923fa31a08fdd1f33f2c0db87864 (diff)
downloadrouter-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.php89
-rw-r--r--tests/Router/Runner/ControllerTest.php182
-rw-r--r--tests/Router/Runner/PhpScriptTest.php152
-rw-r--r--tests/Router/Runner/RunnerFactoryTest.php41
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],
- ];
- }
-}