diff options
author | Arnold Daniels <arnold@jasny.net> | 2016-11-03 20:50:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-03 20:50:09 +0100 |
commit | 1716a891f63dcab37cd810d7234e6b4061dd821a (patch) | |
tree | 815647e163b3d0a3644e7445abcd03d27f542f3b /tests | |
parent | 6a5cdfbc4d2669d098e0e0ba9e2407e654466565 (diff) | |
parent | e9d38ac2fb40c3f156700e143e3227fed17a3e33 (diff) | |
download | controller-1716a891f63dcab37cd810d7234e6b4061dd821a.zip controller-1716a891f63dcab37cd810d7234e6b4061dd821a.tar.gz controller-1716a891f63dcab37cd810d7234e6b4061dd821a.tar.bz2 |
Merge branch 'master' into Controller-encodeData_method
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Controller/RouteActionTest.php | 110 | ||||
-rw-r--r-- | tests/support/TestController.php | 50 |
2 files changed, 160 insertions, 0 deletions
diff --git a/tests/Controller/RouteActionTest.php b/tests/Controller/RouteActionTest.php new file mode 100644 index 0000000..edc4bd7 --- /dev/null +++ b/tests/Controller/RouteActionTest.php @@ -0,0 +1,110 @@ +<?php + +require_once dirname(__DIR__) . '/support/TestController.php'; + +use Jasny\Controller\RouteAction; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\StreamInterface; + +/** + * @covers Jasny\Controller\RouteAction + */ +class RouteActionTest extends PHPUnit_Framework_TestCase +{ + /** + * Test running controller action + * + * @dataProvider runPositiveProvider + * @param object $route + */ + public function testRunPositive($route) + { + $controller = new TestController(); + $request = $this->createMock(ServerRequestInterface::class); + $response = $this->createMock(ResponseInterface::class); + + $request->method('getAttribute')->with($this->equalTo('route'))->will($this->returnValue($route)); + + $result = $controller($request, $response); + $args = !empty($route->args) ? $route->args : [$route->param1, isset($route->param2) ? $route->param2 : 'defaultValue']; + + $this->assertEquals(get_class($response), get_class($result), "Controller should return 'ResponseInterface' instance"); + $this->assertEquals($args[0], $result->param1, "First route parameter was not passed correctly"); + $this->assertEquals($args[1], $result->param2, "Second route parameter was not passed correctly"); + + if (isset($route->action)) { + $this->assertTrue($result->actionCalled, "Controller action was not called"); + $this->assertFalse(isset($result->defaultActionCalled), "Controller default action was called"); + } else { + $this->assertTrue($result->defaultActionCalled, "Controller default action was not called"); + $this->assertFalse(isset($result->actionCalled), "Controller non-default action was called"); + } + } + + /** + * Provide data for testing run method + */ + public function runPositiveProvider() + { + return [ + [(object)['controller' => 'TestController', 'param1' => 'value1']], + [(object)['controller' => 'TestController', 'param1' => 'value1', 'param2' => 'value2']], + [(object)['controller' => 'TestController', 'args' => ['value1', 'value2']]], + [(object)['controller' => 'TestController', 'action' => 'test-run', 'param1' => 'value1']], + [(object)['controller' => 'TestController', 'action' => 'test-run', 'param1' => 'value1', 'param2' => 'value2']], + [(object)['controller' => 'TestController', 'action' => 'test-run', 'args' => ['value1', 'value2']]] + ]; + } + + /** + * Test running controller action + * + * @dataProvider runNegativeProvider + * @param object $route + * @param int $errorCode + * @param string $errorMessage + */ + public function testRunNegative($route, $errorCode, $errorMessage) + { + $controller = new TestController(); + $request = $this->createMock(ServerRequestInterface::class); + $response = $this->createMock(ResponseInterface::class); + + $request->method('getAttribute')->with($this->equalTo('route'))->will($this->returnValue($route)); + + $this->expectResponseError($response, $errorCode, $errorMessage); + + $result = $controller($request, $response); + + $this->assertEquals(get_class($response), get_class($result), "Controller should return 'ResponseInterface' instance"); + } + + /** + * Provide data for testing run method + */ + public function runNegativeProvider() + { + return [ + [(object)['controller' => 'TestController', 'action' => 'nonExistMethod'], 404, 'Not Found'], + [(object)['controller' => 'TestController', 'action' => 'test-run'], 400, 'Bad Request'], + [(object)['controller' => 'TestController', 'action' => 'test-run', 'param2' => 'value2'], 400, 'Bad Request'] + ]; + } + + /** + * Expect that response will be set to error state + * + * @param ResponseInterface $response + * @param int $code + * @param string $message + */ + public function expectResponseError($response, $code, $message) + { + $stream = $this->createMock(StreamInterface::class); + $stream->expects($this->once())->method('write')->with($this->equalTo($message)); + + $response->expects($this->once())->method('getBody')->will($this->returnValue($stream)); + $response->expects($this->once())->method('withStatus')->with($this->equalTo($code))->will($this->returnSelf()); + } +} diff --git a/tests/support/TestController.php b/tests/support/TestController.php new file mode 100644 index 0000000..e0bdb7b --- /dev/null +++ b/tests/support/TestController.php @@ -0,0 +1,50 @@ +<?php + +use Jasny\Controller; +use Jasny\Controller\RouteAction; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * Class for testing 'RouteAction' trait + */ +class TestController extends Controller +{ + use RouteAction; + + /** + * Test action for executing router + * + * @param mixed $param1 + * @param mixed $param2 + * @return ResponseInterface + */ + public function testRunAction($param1, $param2 = 'defaultValue') + { + $response = $this->getResponse(); + + $response->actionCalled = true; + $response->param1 = $param1; + $response->param2 = $param2; + + return $response; + } + + /** + * Test action for executing router + * + * @param mixed $param1 + * @param mixed $param2 + * @return ResponseInterface + */ + public function defaultAction($param1, $param2 = 'defaultValue') + { + $response = $this->getResponse(); + + $response->defaultActionCalled = true; + $response->param1 = $param1; + $response->param2 = $param2; + + return $response; + } +} |