reflector = $this->createMock(IControllerMethodReflector::class); } public static function dataAnnotation(): array { return [ [false, false, false, false, false], [false, false, true, false, false], [false, true, true, false, false], [true, false, false, false, true], [true, false, true, false, false], [true, true, false, false, false], [true, true, true, false, false], [false, false, false, true, false], [false, false, true, true, false], [false, true, true, true, false], [true, false, false, true, false], [true, false, true, true, false], [true, true, false, true, false], [true, true, true, true, false], ]; } /** * @dataProvider dataAnnotation */ public function testBeforeController(bool $subadminRequired, bool $isAdmin, bool $isSubAdmin, bool $hasSettingAuthorizationAnnotation, bool $shouldThrowException): void { $middleware = new ProvisioningApiMiddleware( $this->reflector, $isAdmin, $isSubAdmin ); $this->reflector->method('hasAnnotation') ->willReturnCallback(function ($annotation) use ($subadminRequired, $hasSettingAuthorizationAnnotation) { if ($annotation === 'NoSubAdminRequired') { return !$subadminRequired; } if ($annotation === 'AuthorizedAdminSetting') { return $hasSettingAuthorizationAnnotation; } return false; }); try { $middleware->beforeController( $this->createMock(Controller::class), 'myMethod' ); $this->assertFalse($shouldThrowException); } catch (NotSubAdminException $e) { $this->assertTrue($shouldThrowException); } } public static function dataAfterException(): array { return [ [new NotSubAdminException(), false], [new \Exception('test', 42), true], ]; } /** * @dataProvider dataAfterException */ public function testAfterException(\Exception $exception, bool $forwared): void { $middleware = new ProvisioningApiMiddleware( $this->reflector, false, false ); try { $middleware->afterException( $this->createMock(Controller::class), 'myMethod', $exception ); $this->fail(); } catch (OCSException $e) { $this->assertFalse($forwared); $this->assertSame($exception->getMessage(), $e->getMessage()); $this->assertSame(Http::STATUS_FORBIDDEN, $e->getCode()); } catch (\Exception $e) { $this->assertTrue($forwared); $this->assertSame($exception, $e); } } }