diff --git a/src/frankenphp-symfony/src/Exception/InvalidMiddlewareException.php b/src/frankenphp-symfony/src/Exception/InvalidMiddlewareException.php new file mode 100644 index 00000000..cc34f2eb --- /dev/null +++ b/src/frankenphp-symfony/src/Exception/InvalidMiddlewareException.php @@ -0,0 +1,17 @@ +send(); }; + foreach ($this->middlewares as $middlewareClass) { + if (!is_a($middlewareClass, MiddlewareInterface::class, true)) { + throw new InvalidMiddlewareException($middlewareClass, 1761117929733); + } + + $middleware = new $middlewareClass(); + $handler = fn () => $middleware->wrap($handler, $server); + } + $loops = 0; do { $ret = \frankenphp_handle_request($handler); diff --git a/src/frankenphp-symfony/src/Runtime.php b/src/frankenphp-symfony/src/Runtime.php index efae98bc..1323287b 100644 --- a/src/frankenphp-symfony/src/Runtime.php +++ b/src/frankenphp-symfony/src/Runtime.php @@ -18,11 +18,14 @@ class Runtime extends SymfonyRuntime /** * @param array{ * frankenphp_loop_max?: int, + * frankenphp_middlewares?: string * } $options */ public function __construct(array $options = []) { $options['frankenphp_loop_max'] = (int) ($options['frankenphp_loop_max'] ?? $_SERVER['FRANKENPHP_LOOP_MAX'] ?? $_ENV['FRANKENPHP_LOOP_MAX'] ?? 500); + $options['frankenphp_middlewares'] = (string) ($options['frankenphp_middlewares'] ?? $_SERVER['FRANKENPHP_MIDDLEWARES'] ?? $_ENV['FRANKENPHP_MIDDLEWARES'] ?? ''); + $options['frankenphp_middlewares'] = array_filter(explode("\n", $options['frankenphp_middlewares'])); parent::__construct($options); } diff --git a/src/frankenphp-symfony/tests/RunnerTest.php b/src/frankenphp-symfony/tests/RunnerTest.php index 8d3caa76..2eb0ccf1 100644 --- a/src/frankenphp-symfony/tests/RunnerTest.php +++ b/src/frankenphp-symfony/tests/RunnerTest.php @@ -7,7 +7,10 @@ require_once __DIR__.'/function-mock.php'; use PHPUnit\Framework\TestCase; +use Runtime\FrankenPhpSymfony\Exception\InvalidMiddlewareException; use Runtime\FrankenPhpSymfony\Runner; +use Runtime\FrankenPhpSymfony\Tests\Support\InvalidMiddleware; +use Runtime\FrankenPhpSymfony\Tests\Support\TestMiddleware; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\HttpKernelInterface; @@ -22,22 +25,62 @@ interface TestAppInterface extends HttpKernelInterface, TerminableInterface */ class RunnerTest extends TestCase { - public function testRun(): void + public static function runData(): iterable { + yield 'basic' => []; + + yield 'middleware' => [ + 'middleware' => TestMiddleware::class, + ]; + + yield 'Invalid middleware' => [ + 'middleware' => InvalidMiddleware::class, + 'expectException' => InvalidMiddlewareException::class, + ]; + } + + /** + * @dataProvider runData + */ + public function testRun( + ?string $middleware = null, + ?string $expectException = null, + ): void { $application = $this->createMock(TestAppInterface::class); - $application - ->expects($this->once()) - ->method('handle') - ->willReturnCallback(function (Request $request, int $type = HttpKernelInterface::MAIN_REQUEST, bool $catch = true): Response { - $this->assertSame('bar', $request->server->get('FOO')); - return new Response(); - }); - $application->expects($this->once())->method('terminate'); + if (null === $expectException) { + $application + ->expects($this->once()) + ->method('handle') + ->willReturnCallback( + function ( + Request $request, + int $type = HttpKernelInterface::MAIN_REQUEST, + bool $catch = true + ): Response { + $this->assertSame('bar', $request->server->get('FOO')); + + return new Response(); + } + ); + $application->expects($this->once())->method('terminate'); + } else { + $this->expectException($expectException); + } $_SERVER['FOO'] = 'bar'; - $runner = new Runner($application, 500); + $runner = new Runner($application, 500, array_filter([$middleware])); + + $assertMiddlewareInvoked = null === $expectException && $middleware && method_exists($middleware, 'isInvoked'); + if ($assertMiddlewareInvoked) { + $this->assertFalse($middleware::isInvoked()); + } + $this->assertSame(0, $runner->run()); + + if ($assertMiddlewareInvoked) { + $this->assertTrue($middleware::isInvoked()); + } } } diff --git a/src/frankenphp-symfony/tests/Support/InvalidMiddleware.php b/src/frankenphp-symfony/tests/Support/InvalidMiddleware.php new file mode 100644 index 00000000..356dbdec --- /dev/null +++ b/src/frankenphp-symfony/tests/Support/InvalidMiddleware.php @@ -0,0 +1,9 @@ +