summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorminstel <minstel@yandex.ru>2016-10-08 00:55:28 +0300
committerminstel <minstel@yandex.ru>2016-10-08 00:55:28 +0300
commita5a76ab2a9674716aee1f4f19f77e76dbfd1b79f (patch)
treeb0a56538d39ba2d26ec7f7d0bcb0d04f9695ec3a
parent52bbfd6961b5193f18ad313c63f4d38cfe48e629 (diff)
downloadrouter-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.php8
-rw-r--r--tests/Router/Runner/CallbackTest.php67
-rw-r--r--tests/Router/RunnerTest.php21
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'");
}
}