diff options
author | minstel <minstel@yandex.ru> | 2016-10-08 00:55:28 +0300 |
---|---|---|
committer | minstel <minstel@yandex.ru> | 2016-10-08 00:55:28 +0300 |
commit | a5a76ab2a9674716aee1f4f19f77e76dbfd1b79f (patch) | |
tree | b0a56538d39ba2d26ec7f7d0bcb0d04f9695ec3a | |
parent | 52bbfd6961b5193f18ad313c63f4d38cfe48e629 (diff) | |
download | router-a5a76ab2a9674716aee1f4f19f77e76dbfd1b79f.zip router-a5a76ab2a9674716aee1f4f19f77e76dbfd1b79f.tar.gz router-a5a76ab2a9674716aee1f4f19f77e76dbfd1b79f.tar.bz2 |
Implementation and tests for Runner/Callback. Minor fixes
-rw-r--r-- | src/Router/Runner/Callback.php | 8 | ||||
-rw-r--r-- | tests/Router/Runner/CallbackTest.php | 67 | ||||
-rw-r--r-- | tests/Router/RunnerTest.php | 21 |
3 files changed, 86 insertions, 10 deletions
diff --git a/src/Router/Runner/Callback.php b/src/Router/Runner/Callback.php index 17fceee..cf1063b 100644 --- a/src/Router/Runner/Callback.php +++ b/src/Router/Runner/Callback.php @@ -14,7 +14,7 @@ use Psr\Http\Message\ResponseInterface; class Callback extends Runner { /** - * Route to a file + * Use function to handle request and response * * @param RequestInterface $request * @param ResponseInterface $response @@ -22,6 +22,12 @@ class Callback extends Runner */ public function run(RequestInterface $request, ResponseInterface $response) { + $callback = !empty($this->route->fn) ? $this->route->fn : null; + if (!is_callable($callback)) { + throw new \RuntimeException("'fn' property of route shoud be a callable"); + } + + return call_user_func($callback, $request, $response); } } diff --git a/tests/Router/Runner/CallbackTest.php b/tests/Router/Runner/CallbackTest.php new file mode 100644 index 0000000..8016865 --- /dev/null +++ b/tests/Router/Runner/CallbackTest.php @@ -0,0 +1,67 @@ +<?php + +use Jasny\Router\Route; +use Jasny\Router\Runner; +use Jasny\Router\Runner\Controller; +use Jasny\Router\Runner\Callback; +use Jasny\Router\Runner\PhpScript; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; + +class CallbackTest extends PHPUnit_Framework_TestCase +{ + /** + * Test creating Callback runner + * + * @dataProvider callbackProvider + * @param Route $route + * @param boolean $positive + */ + public function testCallback($route, $positive) + { + $runner = new Callback($route); + $this->assertEquals($route, $runner->getRoute(), "Route was not set correctly"); + + $request = $this->createMock(RequestInterface::class); + $response = $this->createMock(ResponseInterface::class); + + 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"); + } + + + /** + * Provide data fpr testing 'create' method + */ + public function callbackProvider() + { + $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], + ]; + } + + /** + * Testable callback for creating Route + * + * @param RequestInterface $request + * @param ResponseInterface $response + * @return array + */ + public function getCallback($request, $response) + { + return ['request' => $request, 'response' => $response]; + } +} diff --git a/tests/Router/RunnerTest.php b/tests/Router/RunnerTest.php index b92b40f..b6e2baf 100644 --- a/tests/Router/RunnerTest.php +++ b/tests/Router/RunnerTest.php @@ -14,6 +14,9 @@ class RunnerTest extends PHPUnit_Framework_TestCase * Test creating Runner object using factory method * * @dataProvider createProvider + * @param Route $route + * @param string $class Runner class to use + * @param boolean $positive */ public function testCreate($route, $class, $positive) { @@ -24,7 +27,7 @@ class RunnerTest extends PHPUnit_Framework_TestCase if (!$positive) return; $this->assertInstanceOf($class, $runner, "Runner object has invalid class"); - $this->assertEquals($route, $runner->getRoute()); + $this->assertEquals($route, $runner->getRoute(), "Route was not set correctly"); } /** @@ -57,20 +60,20 @@ class RunnerTest extends PHPUnit_Framework_TestCase })); $result = $runner($queries['request'], $queries['response']); - $this->assertEquals($result['request'], $queries['request']); - $this->assertEquals($result['response'], $queries['response']); + $this->assertEquals($result['request'], $queries['request'], "Request was not returned correctly from 'run'"); + $this->assertEquals($result['response'], $queries['response'], "Response was not returned correctly from 'run'"); #The same test with calling 'next' callback $result = $runner($queries['request'], $queries['response'], function($request, $prevResponse) use ($queries) { - $this->assertEquals($request, $queries['request']); - $this->assertEquals($prevResponse['request'], $queries['request']); - $this->assertEquals($prevResponse['response'], $queries['response']); + $this->assertEquals($request, $queries['request'], "Request is not correct in 'next'"); + $this->assertEquals($prevResponse['request'], $queries['request'], "Prev response was not passed correctly to 'next'"); + $this->assertEquals($prevResponse['response'], $queries['response'], "Prev response was not passed correctly to 'next'"); return $queries + ['next_called' => true]; }); - $this->assertTrue($result['next_called']); - $this->assertEquals($result['request'], $queries['request']); - $this->assertEquals($result['response'], $queries['response']); + $this->assertTrue($result['next_called'], "'Next' callback was not called"); + $this->assertEquals($result['request'], $queries['request'], "Request was not returned correctly from 'run' with 'next'"); + $this->assertEquals($result['response'], $queries['response'], "Request was not returned correctly from 'run' with 'next'"); } } |