|
@@ -1,4 +1,7 @@
|
|
|
<?php
|
|
|
+
|
|
|
+declare(strict_types=1);
|
|
|
+
|
|
|
/**
|
|
|
* ownCloud - App Framework
|
|
|
*
|
|
@@ -14,84 +17,128 @@ namespace Test\AppFramework\Middleware;
|
|
|
use OC\AppFramework\Middleware\SessionMiddleware;
|
|
|
use OC\AppFramework\Utility\ControllerMethodReflector;
|
|
|
use OCP\AppFramework\Controller;
|
|
|
+use OCP\AppFramework\Http\Attribute\UseSession;
|
|
|
use OCP\AppFramework\Http\Response;
|
|
|
+use OCP\IRequest;
|
|
|
+use OCP\ISession;
|
|
|
+use PHPUnit\Framework\MockObject\MockObject;
|
|
|
+use Test\TestCase;
|
|
|
|
|
|
-class SessionMiddlewareTest extends \Test\TestCase {
|
|
|
- /** @var ControllerMethodReflector */
|
|
|
- private $reflector;
|
|
|
-
|
|
|
- /** @var Controller */
|
|
|
- private $controller;
|
|
|
+class SessionMiddlewareTest extends TestCase {
|
|
|
+ private ControllerMethodReflector|MockObject $reflector;
|
|
|
+ private ISession|MockObject $session;
|
|
|
+ private Controller $controller;
|
|
|
+ private SessionMiddleware $middleware;
|
|
|
|
|
|
protected function setUp(): void {
|
|
|
parent::setUp();
|
|
|
|
|
|
- $this->reflector = new ControllerMethodReflector();
|
|
|
- $this->controller = $this->createMock(Controller::class);
|
|
|
+ $this->reflector = $this->createMock(ControllerMethodReflector::class);
|
|
|
+ $this->session = $this->createMock(ISession::class);
|
|
|
+ $this->controller = new class('app', $this->createMock(IRequest::class)) extends Controller {
|
|
|
+ /**
|
|
|
+ * @UseSession
|
|
|
+ */
|
|
|
+ public function withAnnotation() {
|
|
|
+ }
|
|
|
+ #[UseSession]
|
|
|
+ public function withAttribute() {
|
|
|
+ }
|
|
|
+ public function without() {
|
|
|
+ }
|
|
|
+ };
|
|
|
+ $this->middleware = new SessionMiddleware(
|
|
|
+ $this->reflector,
|
|
|
+ $this->session,
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testSessionNotClosedOnBeforeController(): void {
|
|
|
+ $this->configureSessionMock(0, 1);
|
|
|
+ $this->reflector->expects(self::once())
|
|
|
+ ->method('hasAnnotation')
|
|
|
+ ->with('UseSession')
|
|
|
+ ->willReturn(true);
|
|
|
+
|
|
|
+ $this->middleware->beforeController($this->controller, 'withAnnotation');
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * @UseSession
|
|
|
- */
|
|
|
- public function testSessionNotClosedOnBeforeController() {
|
|
|
- $session = $this->getSessionMock(0, 1);
|
|
|
+ public function testSessionNotClosedOnBeforeControllerWithAttribute(): void {
|
|
|
+ $this->configureSessionMock(0, 1);
|
|
|
+ $this->reflector->expects(self::once())
|
|
|
+ ->method('hasAnnotation')
|
|
|
+ ->with('UseSession')
|
|
|
+ ->willReturn(false);
|
|
|
|
|
|
- $this->reflector->reflect($this, __FUNCTION__);
|
|
|
- $middleware = new SessionMiddleware($this->reflector, $session);
|
|
|
- $middleware->beforeController($this->controller, __FUNCTION__);
|
|
|
+ $this->middleware->beforeController($this->controller, 'withAttribute');
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * @UseSession
|
|
|
- */
|
|
|
- public function testSessionClosedOnAfterController() {
|
|
|
- $session = $this->getSessionMock(1);
|
|
|
+ public function testSessionClosedOnAfterController(): void {
|
|
|
+ $this->configureSessionMock(1);
|
|
|
+ $this->reflector->expects(self::once())
|
|
|
+ ->method('hasAnnotation')
|
|
|
+ ->with('UseSession')
|
|
|
+ ->willReturn(true);
|
|
|
|
|
|
- $this->reflector->reflect($this, __FUNCTION__);
|
|
|
- $middleware = new SessionMiddleware($this->reflector, $session);
|
|
|
- $middleware->afterController($this->controller, __FUNCTION__, new Response());
|
|
|
+ $this->middleware->afterController($this->controller, 'withAnnotation', new Response());
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * @UseSession
|
|
|
- */
|
|
|
- public function testSessionReopenedAndClosedOnBeforeController() {
|
|
|
- $session = $this->getSessionMock(1, 1);
|
|
|
+ public function testSessionClosedOnAfterControllerWithAttribute(): void {
|
|
|
+ $this->configureSessionMock(1);
|
|
|
+ $this->reflector->expects(self::once())
|
|
|
+ ->method('hasAnnotation')
|
|
|
+ ->with('UseSession')
|
|
|
+ ->willReturn(true);
|
|
|
|
|
|
- $this->reflector->reflect($this, __FUNCTION__);
|
|
|
- $middleware = new SessionMiddleware($this->reflector, $session);
|
|
|
- $middleware->beforeController($this->controller, __FUNCTION__);
|
|
|
- $middleware->afterController($this->controller, __FUNCTION__, new Response());
|
|
|
+ $this->middleware->afterController($this->controller, 'withAttribute', new Response());
|
|
|
}
|
|
|
|
|
|
- public function testSessionClosedOnBeforeController() {
|
|
|
- $session = $this->getSessionMock(0);
|
|
|
+ public function testSessionReopenedAndClosedOnBeforeController(): void {
|
|
|
+ $this->configureSessionMock(1, 1);
|
|
|
+ $this->reflector->expects(self::exactly(2))
|
|
|
+ ->method('hasAnnotation')
|
|
|
+ ->with('UseSession')
|
|
|
+ ->willReturn(true);
|
|
|
|
|
|
- $this->reflector->reflect($this, __FUNCTION__);
|
|
|
- $middleware = new SessionMiddleware($this->reflector, $session);
|
|
|
- $middleware->beforeController($this->controller, __FUNCTION__);
|
|
|
+ $this->middleware->beforeController($this->controller, 'withAnnotation');
|
|
|
+ $this->middleware->afterController($this->controller, 'withAnnotation', new Response());
|
|
|
}
|
|
|
|
|
|
- public function testSessionNotClosedOnAfterController() {
|
|
|
- $session = $this->getSessionMock(0);
|
|
|
+ public function testSessionReopenedAndClosedOnBeforeControllerWithAttribute(): void {
|
|
|
+ $this->configureSessionMock(1, 1);
|
|
|
+ $this->reflector->expects(self::exactly(2))
|
|
|
+ ->method('hasAnnotation')
|
|
|
+ ->with('UseSession')
|
|
|
+ ->willReturn(false);
|
|
|
|
|
|
- $this->reflector->reflect($this, __FUNCTION__);
|
|
|
- $middleware = new SessionMiddleware($this->reflector, $session);
|
|
|
- $middleware->afterController($this->controller, __FUNCTION__, new Response());
|
|
|
+ $this->middleware->beforeController($this->controller, 'withAttribute');
|
|
|
+ $this->middleware->afterController($this->controller, 'withAttribute', new Response());
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * @return mixed
|
|
|
- */
|
|
|
- private function getSessionMock(int $expectedCloseCount, int $expectedReopenCount = 0) {
|
|
|
- $session = $this->getMockBuilder('\OC\Session\Memory')
|
|
|
- ->disableOriginalConstructor()
|
|
|
- ->getMock();
|
|
|
+ public function testSessionClosedOnBeforeController(): void {
|
|
|
+ $this->configureSessionMock(0);
|
|
|
+ $this->reflector->expects(self::once())
|
|
|
+ ->method('hasAnnotation')
|
|
|
+ ->with('UseSession')
|
|
|
+ ->willReturn(false);
|
|
|
+
|
|
|
+ $this->middleware->beforeController($this->controller, 'without');
|
|
|
+ }
|
|
|
+
|
|
|
+ public function testSessionNotClosedOnAfterController(): void {
|
|
|
+ $this->configureSessionMock(0);
|
|
|
+ $this->reflector->expects(self::once())
|
|
|
+ ->method('hasAnnotation')
|
|
|
+ ->with('UseSession')
|
|
|
+ ->willReturn(false);
|
|
|
+
|
|
|
+ $this->middleware->afterController($this->controller, 'without', new Response());
|
|
|
+ }
|
|
|
|
|
|
- $session->expects($this->exactly($expectedCloseCount))
|
|
|
+ private function configureSessionMock(int $expectedCloseCount, int $expectedReopenCount = 0): void {
|
|
|
+ $this->session->expects($this->exactly($expectedCloseCount))
|
|
|
->method('close');
|
|
|
- $session->expects($this->exactly($expectedReopenCount))
|
|
|
+ $this->session->expects($this->exactly($expectedReopenCount))
|
|
|
->method('reopen');
|
|
|
- return $session;
|
|
|
}
|
|
|
}
|