summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/Controller/RouteActionTest.php202
-rw-r--r--tests/ControllerTest.php13
-rw-r--r--tests/support/RouteActionController.php10
-rw-r--r--tests/support/SessionController.php13
-rw-r--r--tests/support/TestHelper.php22
5 files changed, 162 insertions, 98 deletions
diff --git a/tests/Controller/RouteActionTest.php b/tests/Controller/RouteActionTest.php
index 6fa7f5e..49d71f5 100644
--- a/tests/Controller/RouteActionTest.php
+++ b/tests/Controller/RouteActionTest.php
@@ -4,112 +4,174 @@ namespace Jasny\Controller;
use Jasny\Controller\RouteActionController;
use Psr\Http\Message\ServerRequestInterface;
-use Psr\Http\Message\ResponseInterface;
-use Psr\Http\Message\StreamInterface;
+use Jasny\Controller\TestHelper;
/**
* @covers Jasny\Controller\RouteAction
*/
class RouteActionTest extends \PHPUnit_Framework_TestCase
{
- public function setUp()
+ use TestHelper {
+ getController as private _getController;
+ }
+
+ protected function getControllerClass()
{
- $this->markTestIncomplete();
+ return RouteActionController::class;
}
-
+
/**
- * Test running controller action
- *
- * @dataProvider runPositiveProvider
- * @param object $route
+ * Get mock controller
+ *
+ * @param array $methods
+ * @param string $className
+ * @return RouteActionController|\PHPUnit_Framework_MockObject_MockObject
*/
- public function testRunPositive($route)
+ protected function getController($methods = array(), $className = null)
{
- $controller = new RouteActionController();
- $request = $this->createMock(ServerRequestInterface::class);
- $response = $this->createMock(ResponseInterface::class);
-
- $request->method('getAttribute')->with($this->equalTo('route'))->will($this->returnValue($route));
+ return $this->_getController(
+ array_merge($methods, ['getRequest', 'defaultAction', 'runTestAction', 'notFound', 'isSuccessful']),
+ $className
+ );
+ }
- $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");
+ public function actionProvider()
+ {
+ return [
+ [(object)['args' => [1]], 'defaultAction', [1]],
+ [(object)['action' => 'test-run'], 'testRunAction', []],
+ [(object)['action' => 'non-existent'], 'notFound', []]
+ ];
+ }
+
+ /**
+ * Test running controller with different actions
+ * @dataProvider actionProvider
+ *
+ * @param object $route
+ * @param string $method
+ * @param array $args
+ */
+ public function testRunAction($route, $method, array $args)
+ {
+ $request = $this->createMock(ServerRequestInterface::class);
+ $request->method('getAttribute')->with('route')->willReturn($route);
+
+ $this->getMockBuilder($method);
+
+ $controller = $this->getController();
+ $controller->expects($this->any())->method('getRequest')->willReturn($request);
+ $controller->expects($method !== 'notFound' ? $this->once() : $this->never())->method('isSuccessful')
+ ->willReturn(true);
+
+ $controller->expects($this->once())->method($method)->with(...$args);
+
+ foreach (['defaultAction', 'runTestAction', 'notFound'] as $fn) {
+ if ($fn !== $method) {
+ $controller->expects($this->never())->method($fn);
+ }
}
+
+ $controller->run();
}
-
+
+
/**
* Provide data for testing run method
*/
- public function runPositiveProvider()
+ public function argumentsProvider()
{
return [
- [(object)['controller' => 'RouteActionController', 'param1' => 'value1']],
- [(object)['controller' => 'RouteActionController', 'param1' => 'value1', 'param2' => 'value2']],
- [(object)['controller' => 'RouteActionController', 'args' => ['value1', 'value2']]],
- [(object)['controller' => 'RouteActionController', 'action' => 'test-run', 'param1' => 'value1']],
- [(object)['controller' => 'RouteActionController', 'action' => 'test-run', 'param1' => 'value1', 'param2' => 'value2']],
- [(object)['controller' => 'RouteActionController', 'action' => 'test-run', 'args' => ['value1', 'value2']]]
+ [(object)['foo' => 'value1'], ['value1', null]],
+ [['foo' => 'value1'], ['value1', null]],
+ [(object)['foo' => 'value1', 'bar' => 'value2'], ['value1', 'value2']],
+ [(object)['bar' => 'value1', 'foo' => 'value2'], ['value2', 'value1']],
+ [(object)['qux' => 'value1', 'foo' => 'value2'], ['value2', null]],
+ [(object)['args' => ['value1', 'value2']], ['value1', 'value2']],
+ [(object)['args' => ['value1', 'value2', 'value3']], ['value1', 'value2', 'value3']],
];
}
/**
- * Test running controller action
- *
- * @dataProvider runNegativeProvider
+ * Test running controller with different arguments
+ * @dataProvider argumentsProvider
+ *
* @param object $route
- * @param int $errorCode
- * @param string $errorMessage
+ * @param array $expect
*/
- public function testRunNegative($route, $errorCode, $errorMessage)
+ public function testRunArgument($route, array $expect)
{
- $controller = new RouteActionController();
$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");
+ $request->method('getAttribute')->with('route')->willReturn($route);
+
+ $controller = $this->getController();
+ $controller->expects($this->any())->method('getRequest')->willReturn($request);
+ $controller->expects($this->once())->method('isSuccessful')->willReturn(true);
+
+ $controller->expects($this->once())->method('defaultAction')->with(...$expect);
+ $controller->expects($this->never())->method('runTestAction');
+ $controller->expects($this->never())->method('notFound');
+
+ $controller->run();
}
-
+
+
/**
- * Provide data for testing run method
+ * @expectedException \LogicException
*/
- public function runNegativeProvider()
+ public function testRunWithoutRoute()
{
- return [
- [(object)['controller' => 'RouteActionController', 'action' => 'nonExistMethod'], 404, 'Not Found'],
- [(object)['controller' => 'RouteActionController', 'action' => 'test-run'], 400, 'Bad Request'],
- [(object)['controller' => 'RouteActionController', 'action' => 'test-run', 'param2' => 'value2'], 400, 'Bad Request']
- ];
+ $request = $this->createMock(ServerRequestInterface::class);
+ $request->method('getAttribute')->with('route')->willReturn(null);
+
+ $controller = $this->getController();
+ $controller->expects($this->any())->method('getRequest')->willReturn($request);
+
+ $controller->run();
}
-
+
/**
- * Expect that response will be set to error state
- *
- * @param ResponseInterface $response
- * @param int $code
- * @param string $message
+ * @expectedException \UnexpectedValueException
+ * @expectedExceptionMessage Expected route to be a stdClass object, not a string
*/
- public function expectResponseError($response, $code, $message)
- {
- $stream = $this->createMock(StreamInterface::class);
- $stream->expects($this->once())->method('write')->with($this->equalTo($message));
+ public function testRunWithInvalidRoute()
+ {
+ $request = $this->createMock(ServerRequestInterface::class);
+ $request->method('getAttribute')->with('route')->willReturn('hello');
+
+ $controller = $this->getController();
+ $controller->expects($this->any())->method('getRequest')->willReturn($request);
+
+ $controller->run();
+ }
+
+ /**
+ * @expectedException RuntimeException
+ * @expectedExceptionMessage Missing argument 'foo' for RunMissingArgumentController::defaultAction()
+ */
+ public function testRunMissingArgument()
+ {
+ $request = $this->createMock(ServerRequestInterface::class);
+ $request->method('getAttribute')->with('route')->willReturn((object)['bar' => 20]);
+
+ $controller = $this->getController([], 'RunMissingArgumentController');
+ $controller->expects($this->any())->method('getRequest')->willReturn($request);
+ $controller->expects($this->once())->method('isSuccessful')->willReturn(true);
+
+ $controller->run();
+ }
+
+ public function testSkipActionIfNotSuccessful()
+ {
+ $request = $this->createMock(ServerRequestInterface::class);
+ $request->method('getAttribute')->with('route')->willReturn((object)[]);
+
+ $controller = $this->getController();
+ $controller->expects($this->any())->method('getRequest')->willReturn($request);
+ $controller->expects($this->once())->method('isSuccessful')->willReturn(false);
- $response->expects($this->once())->method('getBody')->will($this->returnValue($stream));
- $response->expects($this->once())->method('withStatus')->with($this->equalTo($code))->will($this->returnSelf());
+ $controller->run();
}
}
diff --git a/tests/ControllerTest.php b/tests/ControllerTest.php
index 04323a1..b980d48 100644
--- a/tests/ControllerTest.php
+++ b/tests/ControllerTest.php
@@ -31,7 +31,8 @@ class ControllerTest extends \PHPUnit_Framework_TestCase
$test->assertSame($request, $this->getRequest());
$test->assertSame($response, $this->getResponse());
- return $finalResponse;
+ $this->setResponse($finalResponse);
+ return null;
}, $controller, Controller::class));
$result = $controller($request, $response);
@@ -39,16 +40,6 @@ class ControllerTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($finalResponse, $result);
}
- public function testSetResponse()
- {
- $response = $this->createMock(ResponseInterface::class);
-
- $controller = $this->getController();
- $controller->setResponse($response);
-
- $this->assertSame($response, $controller->getResponse());
- }
-
/**
* @expectedException LogicException
*/
diff --git a/tests/support/RouteActionController.php b/tests/support/RouteActionController.php
index 66625a9..24be3bf 100644
--- a/tests/support/RouteActionController.php
+++ b/tests/support/RouteActionController.php
@@ -7,7 +7,15 @@ use Jasny\Controller;
/**
* Class for testing 'RouteAction' trait
*/
-class RouteActionController extends Controller
+abstract class RouteActionController
{
use Controller\RouteAction;
+
+ public function defaultAction($foo, $bar = null)
+ {
+ }
+
+ public function runTestAction()
+ {
+ }
}
diff --git a/tests/support/SessionController.php b/tests/support/SessionController.php
deleted file mode 100644
index 6758419..0000000
--- a/tests/support/SessionController.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-namespace Jasny\Controller;
-
-use Jasny\Controller;
-
-/**
- * Class for testing 'Session' trait
- */
-abstract class SessionController extends Controller
-{
- use Controller\Session;
-}
diff --git a/tests/support/TestHelper.php b/tests/support/TestHelper.php
index 8f4d2f9..8f7dff4 100644
--- a/tests/support/TestHelper.php
+++ b/tests/support/TestHelper.php
@@ -10,6 +10,15 @@ use Jasny\Controller;
trait TestHelper
{
/**
+ * Returns a builder object to create mock objects using a fluent interface.
+ *
+ * @param string $className
+ *
+ * @return \PHPUnit_Framework_MockObject_MockBuilder
+ */
+ abstract public function getMockBuilder($className);
+
+ /**
* Get the controller class
*
* @return string
@@ -25,13 +34,20 @@ trait TestHelper
* @param array $methods Methods to mock
* @return Controller|\PHPUnit_Framework_MockObject_MockObject
*/
- public function getController($methods = [])
+ public function getController($methods = [], $mockClassName = null)
{
- $builder = $this->getMockBuilder($this->getControllerClass())->disableOriginalConstructor();
+ $class = $this->getControllerClass();
+
+ $builder = $this->getMockBuilder($class)->disableOriginalConstructor();
if ($methods) {
$builder->setMethods($methods);
}
- return $builder->getMockForAbstractClass();
+ if (isset($mockClassName)) {
+ $builder->setMockClassName($mockClassName);
+ }
+
+ $getMock = trait_exists($class) ? 'getMockForTrait' : 'getMockForAbstractClass';
+ return $builder->$getMock();
}
}