From c9d7e88cc70b6ad124c28be479a6e64c4b174ea6 Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Wed, 14 Nov 2018 02:17:27 +0100 Subject: Implemented controller permissions --- tests/Unit/Controllers/BaseControllerTest.php | 25 +++++++ .../Controllers/Stub/ControllerImplementation.php | 25 +++++++ .../Helpers/AuthenticatorServiceProviderTest.php | 1 + tests/Unit/Http/Exceptions/HttpForbiddenTest.php | 22 +++++++ tests/Unit/Middleware/CallableHandlerTest.php | 8 +-- tests/Unit/Middleware/RequestHandlerTest.php | 77 ++++++++++++++++++++++ .../Middleware/Stub/ControllerImplementation.php | 24 +++++++ 7 files changed, 176 insertions(+), 6 deletions(-) create mode 100644 tests/Unit/Controllers/BaseControllerTest.php create mode 100644 tests/Unit/Controllers/Stub/ControllerImplementation.php create mode 100644 tests/Unit/Http/Exceptions/HttpForbiddenTest.php create mode 100644 tests/Unit/Middleware/Stub/ControllerImplementation.php (limited to 'tests/Unit') diff --git a/tests/Unit/Controllers/BaseControllerTest.php b/tests/Unit/Controllers/BaseControllerTest.php new file mode 100644 index 00000000..738b538f --- /dev/null +++ b/tests/Unit/Controllers/BaseControllerTest.php @@ -0,0 +1,25 @@ +assertEquals([ + 'foo', + 'lorem' => [ + 'ipsum', + 'dolor', + ], + ], $controller->getPermissions()); + } +} diff --git a/tests/Unit/Controllers/Stub/ControllerImplementation.php b/tests/Unit/Controllers/Stub/ControllerImplementation.php new file mode 100644 index 00000000..01d9f250 --- /dev/null +++ b/tests/Unit/Controllers/Stub/ControllerImplementation.php @@ -0,0 +1,25 @@ + [ + 'ipsum', + 'dolor', + ], + ]; + + /** + * @param array $permissions + */ + public function setPermissions(array $permissions) + { + $this->permissions = $permissions; + } +} diff --git a/tests/Unit/Helpers/AuthenticatorServiceProviderTest.php b/tests/Unit/Helpers/AuthenticatorServiceProviderTest.php index f42e9dff..b1767ebc 100644 --- a/tests/Unit/Helpers/AuthenticatorServiceProviderTest.php +++ b/tests/Unit/Helpers/AuthenticatorServiceProviderTest.php @@ -24,5 +24,6 @@ class AuthenticatorServiceProviderTest extends ServiceProviderTest $this->assertInstanceOf(Authenticator::class, $app->get(Authenticator::class)); $this->assertInstanceOf(Authenticator::class, $app->get('authenticator')); + $this->assertInstanceOf(Authenticator::class, $app->get('auth')); } } diff --git a/tests/Unit/Http/Exceptions/HttpForbiddenTest.php b/tests/Unit/Http/Exceptions/HttpForbiddenTest.php new file mode 100644 index 00000000..765a20d2 --- /dev/null +++ b/tests/Unit/Http/Exceptions/HttpForbiddenTest.php @@ -0,0 +1,22 @@ +assertEquals(403, $exception->getStatusCode()); + $this->assertEquals('', $exception->getMessage()); + + $exception = new HttpForbidden('Go away!'); + $this->assertEquals('Go away!', $exception->getMessage()); + } +} diff --git a/tests/Unit/Middleware/CallableHandlerTest.php b/tests/Unit/Middleware/CallableHandlerTest.php index 29424480..a0dbfce8 100644 --- a/tests/Unit/Middleware/CallableHandlerTest.php +++ b/tests/Unit/Middleware/CallableHandlerTest.php @@ -11,7 +11,6 @@ use PHPUnit\Framework\TestCase; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use ReflectionClass as Reflection; use stdClass; class CallableHandlerTest extends TestCase @@ -28,17 +27,14 @@ class CallableHandlerTest extends TestCase /** * @dataProvider provideCallable * @covers \Engelsystem\Middleware\CallableHandler::__construct + * @covers \Engelsystem\Middleware\CallableHandler::getCallable * @param callable $callable */ public function testInit($callable) { $handler = new CallableHandler($callable); - $reflection = new Reflection(get_class($handler)); - $property = $reflection->getProperty('callable'); - $property->setAccessible(true); - - $this->assertEquals($callable, $property->getValue($handler)); + $this->assertEquals($callable, $handler->getCallable()); } /** diff --git a/tests/Unit/Middleware/RequestHandlerTest.php b/tests/Unit/Middleware/RequestHandlerTest.php index cb5fc4a6..7ff803d0 100644 --- a/tests/Unit/Middleware/RequestHandlerTest.php +++ b/tests/Unit/Middleware/RequestHandlerTest.php @@ -3,7 +3,11 @@ namespace Engelsystem\Test\Unit\Middleware; use Engelsystem\Application; +use Engelsystem\Helpers\Authenticator; +use Engelsystem\Http\Exceptions\HttpForbidden; +use Engelsystem\Middleware\CallableHandler; use Engelsystem\Middleware\RequestHandler; +use Engelsystem\Test\Unit\Middleware\Stub\ControllerImplementation; use InvalidArgumentException; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; @@ -131,6 +135,79 @@ class RequestHandlerTest extends TestCase $this->assertEquals($return, $response); } + /** + * @covers \Engelsystem\Middleware\RequestHandler::process + * @covers \Engelsystem\Middleware\RequestHandler::checkPermissions + */ + public function testCheckPermissions() + { + /** @var Application|MockObject $container */ + /** @var ServerRequestInterface|MockObject $request */ + /** @var RequestHandlerInterface|MockObject $handler */ + /** @var ResponseInterface|MockObject $response */ + list($container, $request, $handler, $response) = $this->getMocks(); + + /** @var Authenticator|MockObject $auth */ + $auth = $this->createMock(Authenticator::class); + + $class = new ControllerImplementation(); + /** @var CallableHandler|MockObject $callable */ + $callable = $this->getMockBuilder(CallableHandler::class) + ->setConstructorArgs([[$class, 'actionStub']]) + ->getMock(); + + $callable->expects($this->exactly(2)) + ->method('getCallable') + ->willReturn([$class, 'actionStub']); + + $callable->expects($this->exactly(1)) + ->method('process') + ->with($request, $handler) + ->willReturn($response); + + $request->expects($this->exactly(2)) + ->method('getAttribute') + ->with('route-request-handler') + ->willReturn($callable); + + + /** @var RequestHandler|MockObject $middleware */ + $middleware = $this->getMockBuilder(RequestHandler::class) + ->setConstructorArgs([$container]) + ->setMethods(['resolveRequestHandler']) + ->getMock(); + + $middleware->expects($this->exactly(2)) + ->method('resolveRequestHandler') + ->with($callable) + ->willReturn($callable); + + $container->expects($this->exactly(2)) + ->method('get') + ->with('auth') + ->willReturn($auth); + + $hasPermissions = []; + $auth->expects($this->atLeastOnce()) + ->method('can') + ->willReturnCallback(function ($permission) use (&$hasPermissions) { + return in_array($permission, $hasPermissions); + }); + + $hasPermissions = ['foo', 'test', 'user']; + $class->setPermissions([ + 'foo', + 'loremIpsumAction' => ['dolor', 'sit'], + 'actionStub' => ['test'], + 'user', + ]); + $middleware->process($request, $handler); + + $class->setPermissions(array_merge(['not.existing.permission'], $hasPermissions)); + $this->expectException(HttpForbidden::class); + $middleware->process($request, $handler); + } + /** * @return array */ diff --git a/tests/Unit/Middleware/Stub/ControllerImplementation.php b/tests/Unit/Middleware/Stub/ControllerImplementation.php new file mode 100644 index 00000000..939dde5b --- /dev/null +++ b/tests/Unit/Middleware/Stub/ControllerImplementation.php @@ -0,0 +1,24 @@ +permissions = $permissions; + } + + /** + * @return string + */ + public function actionStub() + { + return ''; + } +} -- cgit v1.2.3-54-g00ecf