From b899a995e2fd977fbf7497b36b2dbc8d641ef398 Mon Sep 17 00:00:00 2001 From: Sam Light Date: Wed, 10 Jun 2026 19:00:32 +0100 Subject: Started structure for middleware --- src/AbstractStrategy.php | 32 ++++++++++++++++++++++++++++++++ src/BasicStrategy.php | 3 +-- src/Contracts/Middleware.php | 16 ++++++++++++++++ src/Contracts/Strategy.php | 10 ++++++++++ tests/Unit/BasicStrategyTest.php | 6 +++++- tests/Unit/MiddlewareTest.php | 19 +++++++++++++++++++ tests/Utils/TestCallable.php | 2 +- tests/Utils/TestMiddleware.php | 27 +++++++++++++++++++++++++++ 8 files changed, 111 insertions(+), 4 deletions(-) create mode 100644 src/AbstractStrategy.php create mode 100644 src/Contracts/Middleware.php create mode 100644 tests/Unit/MiddlewareTest.php create mode 100644 tests/Utils/TestMiddleware.php diff --git a/src/AbstractStrategy.php b/src/AbstractStrategy.php new file mode 100644 index 0000000..54b78c1 --- /dev/null +++ b/src/AbstractStrategy.php @@ -0,0 +1,32 @@ + 0 ? array_reduce( + array_reverse($middlewares), + fn (callable $handler, Middleware $middleware) => fn (ServerRequestInterface $request) => $middleware->handle($request, $handler), + $handler + ) : $handler; + + return $handler($request); + } +} diff --git a/src/BasicStrategy.php b/src/BasicStrategy.php index 5043576..d2ee91a 100644 --- a/src/BasicStrategy.php +++ b/src/BasicStrategy.php @@ -4,13 +4,12 @@ declare(strict_types=1); namespace Lightscale\Router; -use Lightscale\Router\Contracts\Strategy; use Lightscale\Router\Exceptions\InvalidResponseException; use Lightscale\Router\Exceptions\NotFoundException; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; -class BasicStrategy implements Strategy +class BasicStrategy extends AbstractStrategy { public function runRoute(RouteCall $call): ResponseInterface { diff --git a/src/Contracts/Middleware.php b/src/Contracts/Middleware.php new file mode 100644 index 0000000..96037c8 --- /dev/null +++ b/src/Contracts/Middleware.php @@ -0,0 +1,16 @@ +assertIsCalled(); + $cb->assertCalled(); $call = $cb->getLastCall(); expect($call->args[0] ?? null)->toBe($rc); expect($res)->toBe($response); }); + +it('runs middleware', function() { + $factory = new +}); diff --git a/tests/Unit/MiddlewareTest.php b/tests/Unit/MiddlewareTest.php new file mode 100644 index 0000000..d81300d --- /dev/null +++ b/tests/Unit/MiddlewareTest.php @@ -0,0 +1,19 @@ +createServerRequest('get', 'testing'); + $response = $factory->createResponse(); + $middleware = new TestMiddleware; + $handler = new TestCallable(fn() => $response); + $result = $middleware->handle($request, $handler); + $middleware->assertCalled(); + $handler->assertCalled(); + expect($result)->toBe($response); +}); diff --git a/tests/Utils/TestCallable.php b/tests/Utils/TestCallable.php index 526ddf4..67b3d6c 100644 --- a/tests/Utils/TestCallable.php +++ b/tests/Utils/TestCallable.php @@ -51,7 +51,7 @@ class TestCallable return $this->calls[$this->getCallCount() - 1] ?? null; } - public function assertIsCalled(): void + public function assertCalled(): void { Assert::assertGreaterThan(0, $this->getCallCount(), 'Not been called'); } diff --git a/tests/Utils/TestMiddleware.php b/tests/Utils/TestMiddleware.php new file mode 100644 index 0000000..2f3ed32 --- /dev/null +++ b/tests/Utils/TestMiddleware.php @@ -0,0 +1,27 @@ +calls; + + return $next($request); + } + + public function assertCalled(): void + { + Assert::assertGreaterThan(0, $this->calls); + } +} -- cgit v1.2.3