diff --git a/.gitignore b/.gitignore index 8f2077f..5ae9f1e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea vendor/ -composer.lock \ No newline at end of file +composer.lock +.phpunit.result.cache \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9d330c8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,2 @@ +# unreleased + - BREAKING: You can no longer add routes after the app has been dispatched \ No newline at end of file diff --git a/composer.json b/composer.json index 6c76544..1362248 100644 --- a/composer.json +++ b/composer.json @@ -15,11 +15,12 @@ ], "require": { "php": ">=5.3.0", - "slim/slim": "2.*" + "slim/slim": "3.*" }, "require-dev": { - "phpunit/phpunit": "4.3.5", - "mockery/mockery": "0.8.*" + "phpunit/phpunit": "^9", + "mockery/mockery": "0.8.*", + "rector/rector": "^0.12.15" }, "autoload": { "psr-0": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 3759e81..5a36130 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -8,17 +8,10 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="false" > ./tests/SlimController/Tests - ./tests/SlimController/Tests/Old/ - - - src - - \ No newline at end of file diff --git a/rector.php b/rector.php new file mode 100644 index 0000000..10cb00b --- /dev/null +++ b/rector.php @@ -0,0 +1,28 @@ +parameters(); + $parameters->set(Option::PATHS, [ + __DIR__ . '/src', + __DIR__ . '/tests', + ]); + + // Define what rule sets will be applied + $containerConfigurator->import(LevelSetList::UP_TO_PHP_74); + $containerConfigurator->import(PHPUnitLevelSetList::UP_TO_PHPUNIT_90 ); + + // get services (needed for register a single rule) + // $services = $containerConfigurator->services(); + + // register a single rule + // $services->set(TypedPropertyRector::class); +}; diff --git a/src/SlimController/Slim.php b/src/SlimController/Slim.php index abda757..c90f0e5 100644 --- a/src/SlimController/Slim.php +++ b/src/SlimController/Slim.php @@ -17,7 +17,7 @@ /** * Extended Slim base */ -class Slim extends \Slim\Slim +class Slim extends \Slim\App { /** @@ -108,19 +108,20 @@ public function addRoutes(array $routes, $globalMiddlewares = array()) throw new \InvalidArgumentException("Http method '$httpMethod' is not supported."); } + if ('ANY' === $httpMethod) { + $httpMethod = static::$ALLOWED_HTTP_METHODS; + } else { + $httpMethod = [ $httpMethod ]; + } + $routeMiddlewares = array_merge($localMiddlewares, $globalMiddlewares); - $route = $this->addControllerRoute($path, $classRoute, $routeMiddlewares); + $route = $this->addControllerRoute($httpMethod, $path, $classRoute, $routeMiddlewares); if (!isset($this->routeNames[$classRoute])) { - $route->name($classRoute); + $route->setName($classRoute); $this->routeNames[$classRoute] = 1; } - if ('any' === $httpMethod) { - call_user_func_array(array($route, 'via'), static::$ALLOWED_HTTP_METHODS); - } else { - $route->via($httpMethod); - } } } @@ -131,11 +132,11 @@ public function addRoutes(array $routes, $globalMiddlewares = array()) * Add a new controller route * * - * $app->addControllerRoute("/the/path", "className:methodName", array(function () { doSome(); })) - * ->via('GET')->condition(..); + * $app->addControllerRoute(['GET'], "/the/path", "className:methodName", array(function () { doSome(); })) + * ->condition(..); * - * $app->addControllerRoute("/the/path", "className:methodName") - * ->via('GET')->condition(..); + * $app->addControllerRoute(['GET'], "/the/path", "className:methodName") + * ->condition(..); * * * @param string $path @@ -144,11 +145,13 @@ public function addRoutes(array $routes, $globalMiddlewares = array()) * * @return \Slim\Route */ - public function addControllerRoute($path, $route, array $middleware = array()) + public function addControllerRoute($methods, $path, $route, array $middleware = array()) { $callback = $this->buildCallbackFromControllerRoute($route); + $methods = is_array($methods) ? $methods : [ $methods ]; array_unshift($middleware, $path); + array_unshift($middleware, $methods); array_push($middleware, $callback); $route = call_user_func_array(array($this, 'map'), $middleware); @@ -165,13 +168,13 @@ public function addControllerRoute($path, $route, array $middleware = array()) */ protected function buildCallbackFromControllerRoute($route) { - list($controller, $methodName) = $this->determineClassAndMethod($route); + [$controller, $methodName] = $this->determineClassAndMethod($route); $app = & $this; $callable = function () use ($app, $controller, $methodName) { // Get action arguments $args = func_get_args(); // Try to fetch the instance from Slim's container, otherwise lazy-instantiate it - $instance = $app->container->has($controller) ? $app->container->get($controller) : new $controller($app); + $instance = $app->getContainer()->has($controller) ? $app->getContainer()->get($controller) : new $controller($app); return call_user_func_array(array($instance, $methodName), $args); }; @@ -189,14 +192,14 @@ protected function determineClassAndMethod($classMethod) { // determine class prefix (eg "\Vendor\Bundle\Controller") and suffix (eg "Controller") - $classNamePrefix = $this->config('controller.class_prefix'); - if ($classNamePrefix && substr($classNamePrefix, -strlen($classNamePrefix) !== '\\')) { + $classNamePrefix = $this->getContainer()->get('settings')['controller.class_prefix']; + if ($classNamePrefix && substr($classNamePrefix, -strlen($classNamePrefix) !== 0)) { $classNamePrefix .= '\\'; } - $classNameSuffix = $this->config('controller.class_suffix') ? : ''; + $classNameSuffix = $this->getContainer()->get('settings')['controller.class_suffix'] ? : ''; // determine method suffix or default to "Action" - $methodNameSuffix = $this->config('controller.method_suffix'); + $methodNameSuffix = $this->getContainer()->get('settings')['controller.method_suffix']; if (is_null($methodNameSuffix)) { $methodNameSuffix = 'Action'; } diff --git a/src/SlimController/SlimController.php b/src/SlimController/SlimController.php index 303d99d..56707a9 100644 --- a/src/SlimController/SlimController.php +++ b/src/SlimController/SlimController.php @@ -25,7 +25,7 @@ abstract class SlimController /** * @const string */ - const VERSION = '0.1.4'; + public const VERSION = '0.1.4'; /** * @var Slim @@ -40,22 +40,22 @@ abstract class SlimController /** * @var string Prefix for params */ - private $paramPrefix = 'data.'; + private string $paramPrefix = 'data.'; /** * @var array Stash of GET & POST params */ - private $paramsParams = null; + private ?array $paramsParams = null; /** * @var array Stash of GET params */ - private $paramsGet = null; + private ?array $paramsGet = null; /** * @var array Stash of POST params */ - private $paramsPost = null; + private ?array $paramsPost = null; /** * Suffix was never specified and defaults to empty string @@ -67,22 +67,22 @@ abstract class SlimController /** * Constructor for TodoQueue\Controller\Login * - * @param \Slim\Slim $app Ref to slim app + * @param \Slim\App $app Ref to slim app */ - public function __construct(\Slim\Slim &$app) + public function __construct(\Slim\App &$app) { $this->app = $app; - if ($renderTemplateSuffix = $app->config('controller.template_suffix')) { + if ($renderTemplateSuffix = $app->getContainer()->get('settings')['controller.template_suffix']) { $this->renderTemplateSuffix = $renderTemplateSuffix; } - if (!is_null($paramPrefix = $app->config('controller.param_prefix'))) { + if (!is_null($paramPrefix = $app->getContainer()->get('settings')['controller.param_prefix'])) { $this->paramPrefix = $paramPrefix; $prefixLength = strlen($this->paramPrefix); if ($prefixLength > 0 && substr($this->paramPrefix, -$prefixLength) !== '.') { $this->paramPrefix .= '.'; } } - if ($app->config('controller.cleanup_params')) { + if ($app->getContainer()->get('settings')['controller.cleanup_params']) { $this->paramCleanup = true; } } @@ -277,11 +277,7 @@ private function getAllParamNames($reqMode) $names = array_keys($namesPre); if ($prefix = $this->paramPrefix) { $prefixLen = strlen($prefix); - $names = array_map(function ($key) use ($prefixLen) { - return substr($key, $prefixLen); - }, array_filter($names, function ($in) use ($prefix) { - return strpos($in, $prefix) === 0; - })); + $names = array_map(fn($key) => substr($key, $prefixLen), array_filter($names, fn($in) => strpos($in, $prefix) === 0)); } return $names; diff --git a/tests/SlimController/Tests/Fixtures/Controller/TestController.php b/tests/SlimController/Tests/Fixtures/Controller/TestController.php index 21e2b64..97cbcb9 100644 --- a/tests/SlimController/Tests/Fixtures/Controller/TestController.php +++ b/tests/SlimController/Tests/Fixtures/Controller/TestController.php @@ -31,31 +31,31 @@ public function paramSingleArrayAction() public function paramMultiAction() { $params = $this->params(array('Some.param', 'Other.param', 'Other.missing')); - echo json_encode($params); + echo json_encode($params, JSON_THROW_ON_ERROR); } public function paramMultiMissingReqAction() { $params = $this->params(array('Some.param', 'Other.param'), 'get', true); - echo json_encode($params); + echo json_encode($params, JSON_THROW_ON_ERROR); } public function paramMultiDefaultAction() { $params = $this->params(array('Some.param', 'Other.param', 'Other.bla'), 'get', array('Other.bla' => 'great')); - echo json_encode($params); + echo json_encode($params, JSON_THROW_ON_ERROR); } public function paramGetAllAction() { $params = $this->params(); - echo json_encode($params); + echo json_encode($params, JSON_THROW_ON_ERROR); } public function paramCleanupAction() { $messedUp = array('foo', 'Notgood'); - echo json_encode($this->cleanupParam($messedUp)); + echo json_encode($this->cleanupParam($messedUp), JSON_THROW_ON_ERROR); } public function renderAction() diff --git a/tests/SlimController/Tests/Integration/CanCreateApplicationTest.php b/tests/SlimController/Tests/Integration/CanCreateApplicationTest.php index 9dd5ca3..7ea887d 100644 --- a/tests/SlimController/Tests/Integration/CanCreateApplicationTest.php +++ b/tests/SlimController/Tests/Integration/CanCreateApplicationTest.php @@ -2,13 +2,13 @@ namespace SlimController\Tests\Integration; -class CanCreateApplicationTest extends \PHPUnit_Framework_TestCase +class CanCreateApplicationTest extends \PHPUnit\Framework\TestCase { public function testCanCreateSimpleApplication() { $app = new \SlimController\Slim(); - $this->assertTrue(true); // if we got this far then creating the application worked + static::assertTrue(true); // if we got this far then creating the application worked } } diff --git a/tests/SlimController/Tests/Old/ControllerTest.php b/tests/SlimController/Tests/Old/ControllerTest.php deleted file mode 100644 index 7674100..0000000 --- a/tests/SlimController/Tests/Old/ControllerTest.php +++ /dev/null @@ -1,44 +0,0 @@ -expectOutputString('What is up?'); - $this->setUrl('/'); - $this->app->addRoutes(array( - '/' => 'Test:index', - )); - - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - //$this->app->router()->dispatch($route); - $route->dispatch(); - } - - public function testControllerExtended() - { - $this->expectOutputString('What is up YOU?'); - $this->setUrl('/hello/YOU'); - $this->app->addRoutes(array( - '/hello/:name' => 'Test:hello', - )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - //$this->app->router()->dispatch($route); - $route->dispatch(); - } - - public function testControllerAbsPath() - { - $this->expectOutputString('What is up YOU?'); - $this->setUrl('/hello/YOU'); - $this->app->addRoutes(array( - '/hello/:name' => 'Test:hello', - )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - //$this->app->router()->dispatch($route); - $route->dispatch(); - } -} diff --git a/tests/SlimController/Tests/Old/ParamsTest.php b/tests/SlimController/Tests/Old/ParamsTest.php deleted file mode 100644 index 984d5da..0000000 --- a/tests/SlimController/Tests/Old/ParamsTest.php +++ /dev/null @@ -1,109 +0,0 @@ -expectOutputString('Param is 123'); - $this->setUrl('/', 'data[Some][param]=123'); - $this->app->addRoutes(array( - '/' => 'Test:paramSingle', - )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - //$this->app->router()->dispatch($route); - $route->dispatch(); - } - - - public function testParamsSingleObject() - { - $this->expectOutputString('Param is 123123123'); - $this->setUrl('/', 'data[Some][attrib1]=123&data[Some][attrib2]=123&data[Some][attrib3]=123'); - $this->app->addRoutes(array( - '/' => 'Test:paramSingleObject', - )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - //$this->app->router()->dispatch($route); - $route->dispatch(); - } - - public function testParamsMulti() - { - $this->expectOutputString('All is foo bar'); - $this->setUrl('/', 'data[Some][param]=foo&data[Other][param]=bar'); - $this->app->addRoutes(array( - '/' => 'Test:paramMulti', - )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - //$this->app->router()->dispatch($route); - $route->dispatch(); - } - - public function testParamsMultiMissing() - { - $this->expectOutputString('All is foo bar'); - $this->setUrl('/', 'data[Some][param]=foo&data[Other][param]=bar'); - $this->app->addRoutes(array( - '/' => 'Test:paramMultiMissing', - )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - //$this->app->router()->dispatch($route); - $route->dispatch(); - } - - public function testParamsMultiMissingReq() - { - $this->expectOutputString('OK'); - $this->setUrl('/', 'data[Some][param]=foo&data[Other][param]=bar'); - $this->app->addRoutes(array( - '/' => 'Test:paramMultiMissingReq', - )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - //$this->app->router()->dispatch($route); - $route->dispatch(); - } - - public function testParamsMultiDefault() - { - $this->expectOutputString('All is foo bar and great'); - $this->setUrl('/', 'data[Some][param]=foo&data[Other][param]=bar'); - $this->app->addRoutes(array( - '/' => 'Test:paramMultiDefault', - )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - //$this->app->router()->dispatch($route); - $route->dispatch(); - } - - public function testParamsDifferentPrefix() - { - $this->expectOutputString('GOT OK'); - $this->setUrl('/', 'data[Foo]=bar&other[Foo]=bar', array( - 'controller.param_prefix' => 'other.' - )); - $this->app->addRoutes(array( - '/' => 'Test:paramDifferentPrefix', - )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - //$this->app->router()->dispatch($route); - $route->dispatch(); - } - - public function testParamsNoPrefix() - { - $this->expectOutputString('All params: data.Foo=bar - other.Foo=bar'); - $this->setUrl('/', 'data[Foo]=bar&other[Foo]=bar', array( - 'controller.param_prefix' => '' - )); - $this->app->addRoutes(array( - '/' => 'Test:paramNoPrefix', - )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - //$this->app->router()->dispatch($route); - $route->dispatch(); - } -} diff --git a/tests/SlimController/Tests/Old/RenderTest.php b/tests/SlimController/Tests/Old/RenderTest.php deleted file mode 100644 index 9f4ccbf..0000000 --- a/tests/SlimController/Tests/Old/RenderTest.php +++ /dev/null @@ -1,19 +0,0 @@ -expectOutputString('This is orotound and grandios'); - $this->setUrl('/', 'data[Some][param]=foo&data[Other][param]=bar'); - $this->app->addRoutes(array( - '/' => 'Test:render', - )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - //$this->app->router()->dispatch($route); - $route->dispatch(); - } -} diff --git a/tests/SlimController/Tests/Old/RoutingTest.php b/tests/SlimController/Tests/Old/RoutingTest.php deleted file mode 100644 index d3cb095..0000000 --- a/tests/SlimController/Tests/Old/RoutingTest.php +++ /dev/null @@ -1,45 +0,0 @@ -setUrl('/'); - $this->app->addRoutes(array( - '/' => 'Controller:index', - )); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); - - $this->setUrl('/foo'); - $this->assertEquals(0, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); - - $this->setUrl('/other'); - - $this->app->addRoutes(array( - '/other' => 'Controller:other', - )); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); - } - - public function testRoutesWithVariables() - { - $this->setUrl('/hello/you'); - $this->app->addRoutes(array( - '/hello/:name' => 'Controller:index', - )); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); - } - - public function testRoutesWithExtendedFormat() - { - $this->setUrl('/bla'); - $this->app->addRoutes(array( - '/bla' => array('Controller:index', 'get') - )); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); - } - -} diff --git a/tests/SlimController/Tests/SlimControllerTest.php b/tests/SlimController/Tests/SlimControllerTest.php index 3fdbdb6..599d5c7 100644 --- a/tests/SlimController/Tests/SlimControllerTest.php +++ b/tests/SlimController/Tests/SlimControllerTest.php @@ -9,20 +9,20 @@ use SlimController\SlimController; use SlimController\Tests\Fixtures\Controller\TestController; -class SlimControllerTest extends \PHPUnit_Framework_TestCase +class SlimControllerTest extends \PHPUnit\Framework\TestCase { /** * @var \Mockery\MockInterface */ protected $slim; - public function setUp() + protected function setUp(): void { - $this->slim = m::mock('\Slim\Slim'); + $this->slim = m::mock(\Slim\App::class); parent::setUp(); } - public function tearDown() + protected function tearDown(): void { $this->addToAssertionCount($this->slim->mockery_getExpectationCount()); m::close(); @@ -44,7 +44,7 @@ public function testControllerConfigParamsAreUsed() ->with('controller.cleanup_params') ->andReturnNull(); $controller = new TestController($this->slim); - $this->assertTrue(true); + static::assertTrue(true); } public function testRenderingWorksFine() diff --git a/tests/SlimController/Tests/SlimTest.php b/tests/SlimController/Tests/SlimTest.php index 24f13c5..4b9d9ea 100644 --- a/tests/SlimController/Tests/SlimTest.php +++ b/tests/SlimController/Tests/SlimTest.php @@ -5,7 +5,6 @@ namespace SlimController\Tests; - use SlimController\Tests\Fixtures\Controller\TestController; @@ -20,9 +19,12 @@ public function testAddingRoutesToSameMethod() '/alb' => array('get' => 'Controller:index') )); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); + static::assertEquals( + \FastRoute\Dispatcher::FOUND, + $this->app->getContainer()->get('router')->dispatch($this->req)[0] + ); // $this->assertTrue($this->app->router->hasNamedRoute('Controller:index')); - $this->assertEquals('/bla', $this->app->urlFor('Controller:index')); + static::assertEquals('/bla', $this->app->getContainer()->get('router')->pathFor('Controller:index')); } public function testAddingroutesWithOldSyntaxWithoutMiddlewares() @@ -32,7 +34,10 @@ public function testAddingroutesWithOldSyntaxWithoutMiddlewares() '/bla' => array('Controller:index'), )); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); + static::assertEquals( + \FastRoute\Dispatcher::FOUND, + $this->app->getContainer()->get('router')->dispatch($this->req)[0] + ); } public function testAddRoutesWithOldSyntaxWithoutMiddlewareArray() @@ -43,7 +48,10 @@ public function testAddRoutesWithOldSyntaxWithoutMiddlewareArray() // }) )); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); + static::assertEquals( + \FastRoute\Dispatcher::FOUND, + $this->app->getContainer()->get('router')->dispatch($this->req)[0] + ); } public function testAddRoutesWithOldSyntaxWithMiddlewareArray() @@ -54,7 +62,10 @@ public function testAddRoutesWithOldSyntaxWithMiddlewareArray() // })) )); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); + static::assertEquals( + \FastRoute\Dispatcher::FOUND, + $this->app->getContainer()->get('router')->dispatch($this->req)[0] + ); } public function testAddSimpleRoutes() @@ -63,26 +74,36 @@ public function testAddSimpleRoutes() $this->app->addRoutes(array( '/' => 'Controller:index', )); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); + /** @var \Slim\Router $router */ + $router = $this->app->getContainer()->get('router'); + + static::assertEquals(\FastRoute\Dispatcher::FOUND, $router->dispatch($this->req)[0]); $this->setUrl('/foo'); - $this->assertEquals(0, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); + static::assertEquals(\FastRoute\Dispatcher::NOT_FOUND, $router->dispatch($this->req)[0]); $this->setUrl('/other'); + // Adding a route after we've dispatched no longer works. I suspect this is a change in + // Slim v3. I've not found the cause or a workaround, but also can't see a real world + // use-case so I won't be spending any more time trying to fix it. $this->app->addRoutes(array( '/other' => 'Controller:other', )); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); + + static::assertEquals(\FastRoute\Dispatcher::NOT_FOUND, $router->dispatch($this->req)[0]); } public function testAddRoutesWithVariables() { $this->setUrl('/hello/you'); $this->app->addRoutes(array( - '/hello/:name' => 'Controller:index', + '/hello/{name}' => 'Controller:index', )); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); + static::assertEquals( + \FastRoute\Dispatcher::FOUND, + $this->app->getContainer()->get('router')->dispatch($this->req)[0] + ); } public function testAddRoutesInExtendedFormat() @@ -91,15 +112,16 @@ public function testAddRoutesInExtendedFormat() $this->app->addRoutes(array( '/bla' => array('get' => 'Controller:index') )); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); + static::assertEquals( + \FastRoute\Dispatcher::FOUND, + $this->app->getContainer()->get('router')->dispatch($this->req)[0] + ); } - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Malformed class action for 'Controller:index:foo'. Use 'className:methodName' format. - */ public function testFailToAddInvalidClassMethodFormat() { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Malformed class action for \'Controller:index:foo\'. Use \'className:methodName\' format.'); $this->setUrl('/bla'); $this->app->addRoutes(array( '/bla' => 'Controller:index:foo' @@ -111,24 +133,20 @@ public function testGlobalMiddlewareIsAddedToRoute() $this->setUrl('/bla'); $this->app->addRoutes(array( '/bla' => 'Controller:index' - ), function() { - return false; - }); + ), fn() => false); - /** @var \Slim\Route[] $routes */ - $routes = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - $this->assertEquals(1, count($routes)); + $router = $this->app->getContainer()->get('router'); $middleware = $routes[0]->getMiddleware(); - $this->assertInternalType('array', $middleware); - $this->assertSame(1, count($middleware)); + static::assertIsArray($middleware); + static::assertSame(1, count($middleware)); } public function testGlobalMiddlewareIsAddedToRouteAsArray() { $middlewares = array( - function() { return false; }, - function() { return false; } + fn() => false, + fn() => false ); $this->setUrl('/bla'); @@ -137,37 +155,33 @@ function() { return false; } ), $middlewares); /** @var \Slim\Route[] $routes */ - $routes = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - $this->assertEquals(1, count($routes)); + $routes = $this->app->getContainer()->get('router')->dispatch($this->req); $middleware = $routes[0]->getMiddleware(); - $this->assertInternalType('array', $middleware); - $this->assertSame(2, count($middleware)); + static::assertIsArray($middleware); + static::assertSame(2, count($middleware)); } public function testLocalMiddlewareIsAddedToRoute() { $this->setUrl('/bla'); $this->app->addRoutes(array( - '/bla' => array('get' => array('Controller:index', function() { - return false; - })) + '/bla' => array('get' => array('Controller:index', fn() => false)) )); /** @var \Slim\Route[] $routes */ - $routes = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - $this->assertEquals(1, count($routes)); + $routes = $this->app->getContainer()->get('router')->dispatch($this->req); $middleware = $routes[0]->getMiddleware(); - $this->assertInternalType('array', $middleware); - $this->assertSame(1, count($middleware)); + static::assertIsArray($middleware); + static::assertSame(1, count($middleware)); } public function testArrayOfLocalMiddlewareIsAddedToRoute() { $middlewares = array( - function() { return false; }, - function() { return false; } + fn() => false, + fn() => false ); $this->setUrl('/bla'); @@ -176,19 +190,18 @@ function() { return false; } )); /** @var \Slim\Route[] $routes */ - $routes = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - $this->assertEquals(1, count($routes)); + $routes = $this->app->getContainer()->get('router')->dispatch($this->req); $middleware = $routes[0]->getMiddleware(); - $this->assertInternalType('array', $middleware); - $this->assertSame(2, count($middleware)); + static::assertIsArray($middleware); + static::assertSame(2, count($middleware)); } public function testLocalMiddlewaresAreAddedToRoute() { $middlewares = array( - function() { return false; }, - function() { return false; } + fn() => false, + fn() => false ); $this->setUrl('/bla'); @@ -197,42 +210,32 @@ function() { return false; } )); /** @var \Slim\Route[] $routes */ - $routes = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - $this->assertEquals(1, count($routes)); + $routes = $this->app->getContainer()->get('router')->dispatch($this->req); $middleware = $routes[0]->getMiddleware(); - $this->assertInternalType('array', $middleware); - $this->assertSame(2, count($middleware)); + static::assertIsArray($middleware); + static::assertSame(2, count($middleware)); } public function testGlobalAndLocalMiddlewareIsAddedToRoute() { $this->setUrl('/bla'); $this->app->addRoutes(array( - '/bla' => array('get' => array('Controller:index', function() { - return false; - })) - ), array(function() { - return false; - }, function() { - return false; - })); + '/bla' => array('get' => array('Controller:index', fn() => false)) + ), array(fn() => false, fn() => false)); /** @var \Slim\Route[] $routes */ - $routes = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - $this->assertEquals(1, count($routes)); + $routes = $this->app->getContainer()->get('router')->dispatch($this->req); $middleware = $routes[0]->getMiddleware(); - $this->assertInternalType('array', $middleware); - $this->assertSame(3, count($middleware)); + static::assertIsArray($middleware); + static::assertSame(3, count($middleware)); } - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Http method 'FOO' is not supported. - */ public function testFailToAddRouteForUnsupportedHttpMethod() { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Http method \'FOO\' is not supported.'); $this->setUrl('/bla'); $this->app->addRoutes(array( '/bla' => array('foo' => 'Controller:index') @@ -246,8 +249,7 @@ public function testRouteCallbacksAreFiredOnDispatch() $this->app->addRoutes(array( '/bla' => 'Test:index' )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - $route->dispatch(); + ($this->app)($this->req, $this->res); } public function testEmptyButNotNullMethodSuffixAccepted() @@ -259,38 +261,39 @@ public function testEmptyButNotNullMethodSuffixAccepted() $this->app->addRoutes(array( '/bla' => 'Test:notSuffixedMethod' )); - list($route) = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - $route->dispatch(); + ($this->app)($this->req, $this->res); } - public function testAddControllerRoute() + public function testAddControllerRouteSimple() { $this->setUrl('/'); $this->app->addControllerRoute( + 'GET', '/', 'Controller:index' - )->via('GET'); + ); - $this->assertEquals(1, count($this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()))); + static::assertEquals( + \FastRoute\Dispatcher::FOUND, + $this->app->getContainer()->get('router')->dispatch($this->req)[0] + ); } public function testAddControllerRouteWithMiddleware() { $this->setUrl('/'); $this->app->addControllerRoute( + 'GET', '/', 'Controller:index', array( - function() { - return false; - }, + fn() => false, ) - )->via('GET'); + ); /** @var \Slim\Route[] $routes */ - $routes = $this->app->router()->getMatchedRoutes($this->req->getMethod(), $this->req->getResourceUri()); - $this->assertEquals(1, count($routes)); + $routes = $this->app->getContainer()->get('router')->dispatch($this->req); $middleware = $routes[0]->getMiddleware(); - $this->assertInternalType('array', $middleware); - $this->assertSame(1, count($middleware)); + static::assertIsArray($middleware); + static::assertSame(1, count($middleware)); } public function testNamedRoutes() @@ -299,31 +302,30 @@ public function testNamedRoutes() $this->app->addRoutes(array( '/' => 'Controller:index', '/bla' => 'Bla:Index', - '/something/:id' => 'Something:show' + '/something[/{id}]' => 'Something:show' )); - $this->assertEquals('/', $this->app->urlFor('Controller:index')); - $this->assertEquals('/bla', $this->app->urlFor('Bla:Index')); - $this->assertEquals('/something/:id', $this->app->urlFor('Something:show')); + static::assertEquals('/', $this->app->getContainer()->get('router')->pathFor('Controller:index')); + static::assertEquals('/bla', $this->app->getContainer()->get('router')->pathFor('Bla:Index')); + static::assertEquals('/something', $this->app->getContainer()->get('router')->pathFor('Something:show')); + static::assertEquals('/something/10', $this->app->getContainer()->get('router')->pathFor('Something:show', [ 'id' => 10])); } - /** - * @expectedException \RuntimeException - * @expectedExceptionMessage Named route not found for name: this is not a named route - */ public function testNamedRoutesThrowsExceptionIfLookingForARouteThatDoesNotExist() { + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('Named route does not exist for name: this is not a named route'); $this->setUrl('/'); $this->app->addRoutes(array( '/' => 'Controller:index', '/bla' => 'Bla:Index', - '/something/:id' => 'Something:show' + '/something/{id}' => 'Something:show' )); - $this->assertEquals('/', $this->app->urlFor('this is not a named route')); + static::assertEquals('/', $this->app->getContainer()->get('router')->pathFor('this is not a named route')); } - public function testServiceControllersAreFetched() + public function testServiceControllersAreFetchedSimple() { $this->expectOutputString("What is up?"); @@ -333,17 +335,15 @@ public function testServiceControllersAreFetched() ); $this->setUrl('/', '', $config); $app = $this->app; - $app->container->singleton('TestController', function () use ($app) { - return new TestController($app); - }); + $app->getContainer()['TestController'] = fn() => new TestController($app); $route = $this->app->addControllerRoute( - '/', 'TestController:index' - )->via('GET'); + 'GET', '/', 'TestController:index' + ); // If the route could be dispatched, then the service was found - $result = $route->dispatch(); - $this->assertTrue($result); + $result = ($this->app)($this->req, $this->res); + static::assertEquals(200, $result->getStatusCode()); } public function testServiceControllersAreFetchedWithParams() @@ -353,19 +353,20 @@ public function testServiceControllersAreFetchedWithParams() $config = array( 'controller.class_prefix' => '', 'controller.class_suffix' => '', - ); - $this->setUrl('/', '', $config); + ); + $this->setUrl('/another/foo', '', $config); $app = $this->app; - $app->container->singleton('TestController', function () use ($app) { - return new TestController($app); - }); + $app->getContainer()['TestController'] = fn () => new TestController($app); - $app->addRoutes(array( - '/another/:name' => 'TestController:hello' - )); - $route = $app->router()->getNamedRoute('TestController:hello'); - $route->setParams(array('name' => 'foo')); - $this->assertTrue($route->dispatch()); + $route = $this->app->addControllerRoute( + 'GET', + '/another/{name}', + 'TestController:hello' + ); + + // If the route could be dispatched, then the service was found + $result = ($this->app)($this->req, $this->res); + static::assertEquals(200, $result->getStatusCode()); } public function testServiceControllersAreFetchedEvenIfTheirNameIsAnInvalidPHPClassName() @@ -378,17 +379,15 @@ public function testServiceControllersAreFetchedEvenIfTheirNameIsAnInvalidPHPCla ); $this->setUrl('/', '', $config); $app = $this->app; - $app->container->singleton('String\\Controller', function () use ($app) { - return new TestController($app); - }); + $app->getContainer()['String\\Controller'] = fn() => new TestController($app); $route = $this->app->addControllerRoute( - '/', 'String\\Controller:index' - )->via('GET'); + 'GET', '/', 'String\\Controller:index' + ); // If the route could be dispatched, then the service was found $result = $route->dispatch(); - $this->assertTrue($result); + static::assertTrue($result); } } diff --git a/tests/SlimController/Tests/TestCase.php b/tests/SlimController/Tests/TestCase.php index 4eb2fef..5aeb888 100644 --- a/tests/SlimController/Tests/TestCase.php +++ b/tests/SlimController/Tests/TestCase.php @@ -2,12 +2,12 @@ namespace SlimController\Tests; -use Slim\Environment; +use Slim\Http\Environment; use Slim\Http\Request; use Slim\Http\Response; use SlimController\Slim; -class TestCase extends \PHPUnit_Framework_TestCase +class TestCase extends \PHPUnit\Framework\TestCase { /** @@ -31,30 +31,25 @@ class TestCase extends \PHPUnit_Framework_TestCase protected $app; - protected function setUrl($path, $params = '', $config = array()) + protected function setUrl($path, $params = '', $settings = array()) { - Environment::mock(array( - 'REQUEST_METHOD' => 'GET', - 'REMOTE_ADDR' => '127.0.0.1', - 'SCRIPT_NAME' => '', //<-- Physical - 'PATH_INFO' => $path, //<-- Virtual + $this->env = Environment::mock(array( + 'REQUEST_URI' => $path, 'QUERY_STRING' => $params, - 'SERVER_NAME' => 'slim', - 'SERVER_PORT' => 80, - 'slim.url_scheme' => 'http', - 'slim.input' => '', 'slim.errors' => fopen('php://stderr', 'w'), 'HTTP_HOST' => 'slim' )); - $this->env = Environment::getInstance(); - $this->req = new Request($this->env); + $this->req = Request::createFromEnvironment($this->env); $this->res = new Response(); - $this->app = new Slim(array_merge(array( - 'controller.class_prefix' => '\\SlimController\\Tests\\Fixtures\\Controller', - 'controller.class_suffix' => 'Controller', - 'controller.method_suffix' => 'Action', - 'controller.template_suffix' => 'php', - 'templates.path' => __DIR__ . '/Fixtures/templates' - ), $config)); + $this->app = new Slim(array( + 'settings' => array_merge(array( + 'controller.class_prefix' => '\\SlimController\\Tests\\Fixtures\\Controller', + 'controller.class_suffix' => 'Controller', + 'controller.method_suffix' => 'Action', + 'controller.template_suffix' => 'php', + 'templates.path' => __DIR__ . '/Fixtures/templates' + ), $settings) + ) + ); } } \ No newline at end of file