config = $this->createMock(IConfig::class); $this->appManager = $this->createMock(IAppManager::class); $this->controllerMock = $this->createMock(Controller::class); $this->reflector = $this->createMock(IControllerMethodReflector::class); $this->shareManager = $this->createMock(IManager::class); $this->request = $this->createMock(IRequest::class); $this->sharingCheckMiddleware = new SharingCheckMiddleware( 'files_sharing', $this->config, $this->appManager, $this->reflector, $this->shareManager, $this->request); } public function testIsSharingEnabledWithAppEnabled(): void { $this->appManager ->expects($this->once()) ->method('isEnabledForUser') ->with('files_sharing') ->willReturn(true); $this->assertTrue(self::invokePrivate($this->sharingCheckMiddleware, 'isSharingEnabled')); } public function testIsSharingEnabledWithAppDisabled(): void { $this->appManager ->expects($this->once()) ->method('isEnabledForUser') ->with('files_sharing') ->willReturn(false); $this->assertFalse(self::invokePrivate($this->sharingCheckMiddleware, 'isSharingEnabled')); } public function externalSharesChecksDataProvider() { $data = []; foreach ([false, true] as $annIn) { foreach ([false, true] as $annOut) { foreach ([false, true] as $confIn) { foreach ([false, true] as $confOut) { $res = true; if (!$annIn && !$confIn) { $res = false; } elseif (!$annOut && !$confOut) { $res = false; } $d = [ [ ['NoIncomingFederatedSharingRequired', $annIn], ['NoOutgoingFederatedSharingRequired', $annOut], ], [ ['files_sharing', 'incoming_server2server_share_enabled', 'yes', $confIn ? 'yes' : 'no'], ['files_sharing', 'outgoing_server2server_share_enabled', 'yes', $confOut ? 'yes' : 'no'], ], $res ]; $data[] = $d; } } } } return $data; } /** * @dataProvider externalSharesChecksDataProvider */ public function testExternalSharesChecks($annotations, $config, $expectedResult): void { $this->reflector ->expects($this->atLeastOnce()) ->method('hasAnnotation') ->willReturnMap($annotations); $this->config ->method('getAppValue') ->willReturnMap($config); $this->assertEquals($expectedResult, self::invokePrivate($this->sharingCheckMiddleware, 'externalSharesChecks')); } /** * @dataProvider externalSharesChecksDataProvider */ public function testBeforeControllerWithExternalShareControllerWithSharingEnabled($annotations, $config, $noException): void { $this->appManager ->expects($this->once()) ->method('isEnabledForUser') ->with('files_sharing') ->willReturn(true); $this->reflector ->expects($this->atLeastOnce()) ->method('hasAnnotation') ->willReturnMap($annotations); $this->config ->method('getAppValue') ->willReturnMap($config); $controller = $this->createMock(ExternalSharesController::class); $exceptionThrown = false; try { $this->sharingCheckMiddleware->beforeController($controller, 'myMethod'); } catch (S2SException $exception) { $exceptionThrown = true; } $this->assertNotEquals($noException, $exceptionThrown); } public function testBeforeControllerWithShareControllerWithSharingEnabled(): void { $share = $this->createMock(IShare::class); $this->appManager ->expects($this->once()) ->method('isEnabledForUser') ->with('files_sharing') ->willReturn(true); $controller = $this->createMock(ShareController::class); $this->sharingCheckMiddleware->beforeController($controller, 'myMethod'); } public function testBeforeControllerWithSharingDisabled(): void { $this->expectException(NotFoundException::class); $this->expectExceptionMessage('Sharing is disabled.'); $this->appManager ->expects($this->once()) ->method('isEnabledForUser') ->with('files_sharing') ->willReturn(false); $this->sharingCheckMiddleware->beforeController($this->controllerMock, 'myMethod'); } public function testAfterExceptionWithRegularException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('My Exception message'); $this->sharingCheckMiddleware->afterException($this->controllerMock, 'myMethod', new \Exception('My Exception message')); } public function testAfterExceptionWithNotFoundException(): void { $this->assertEquals(new NotFoundResponse(), $this->sharingCheckMiddleware->afterException($this->controllerMock, 'myMethod', new NotFoundException('My Exception message'))); } public function testAfterExceptionWithS2SException(): void { $this->assertEquals(new JSONResponse('My Exception message', 405), $this->sharingCheckMiddleware->afterException($this->controllerMock, 'myMethod', new S2SException('My Exception message'))); } }