Skip to content

Commit

Permalink
Add toArray to MiddlewarePipeInterface
Browse files Browse the repository at this point in the history
Returns the internal `SplQueue` as an array so that users can inspect the pipeline.

Signed-off-by: George Steel <[email protected]>
  • Loading branch information
gsteel committed Jul 17, 2024
1 parent d96d474 commit a80f851
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 5 deletions.
10 changes: 10 additions & 0 deletions src/MiddlewarePipe.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
use Psr\Http\Server\RequestHandlerInterface;
use SplQueue;

use function iterator_to_array;

/**
* Pipe middleware like unix pipes.
*
Expand Down Expand Up @@ -84,4 +86,12 @@ public function pipe(MiddlewareInterface $middleware): void
{
$this->pipeline->enqueue($middleware);
}

/** @return list<MiddlewareInterface> */
public function toArray(): array
{
$pipeline = clone $this->pipeline;

return iterator_to_array($pipeline, false);
}
}
3 changes: 3 additions & 0 deletions src/MiddlewarePipeInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,7 @@
interface MiddlewarePipeInterface extends MiddlewareInterface, RequestHandlerInterface
{
public function pipe(MiddlewareInterface $middleware): void;

/** @return list<MiddlewareInterface> */
public function toArray(): array;
}
43 changes: 38 additions & 5 deletions test/MiddlewarePipeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use ReflectionClass;
use ReflectionMethod;
use ReflectionObject;
use SplQueue;

use function sort;
use function spl_object_hash;
Expand Down Expand Up @@ -64,15 +65,15 @@ public function testCanPipeInteropMiddleware(): void
static function ($argument1): bool {
self::assertInstanceOf(ServerRequestInterface::class, $argument1);
return true;
}
},
),
self::callback(
/** @psalm-suppress MissingClosureParamType */
static function ($argument2): bool {
self::assertInstanceOf(RequestHandlerInterface::class, $argument2);
return true;
}
)
},
),
)
->willReturn($response);

Expand Down Expand Up @@ -177,12 +178,12 @@ public function testHandleProcessesEnqueuedMiddleware(): void
$middleware1
->method('process')
->with(
$this->request
$this->request,
)
->willReturnCallback(
static fn(
ServerRequestInterface $request,
RequestHandlerInterface $handler): ResponseInterface => $handler->handle($request)
RequestHandlerInterface $handler): ResponseInterface => $handler->handle($request),
);
$middleware2 = $this->createMock(MiddlewareInterface::class);
$middleware2
Expand Down Expand Up @@ -223,4 +224,36 @@ public function testMiddlewarePipeOnlyImplementsMiddlewarePipeInterfaceApi(): vo
self::assertEquals($expected, $actual);
self::assertInstanceOf(MiddlewarePipeInterface::class, $pipeline);
}

public function testThatToArrayReturnsEnqueuedMiddlewareAsAListInQueueOrder(): void
{
$pipeline = new MiddlewarePipe();
$a = $this->createMock(MiddlewareInterface::class);
$b = $this->createMock(MiddlewareInterface::class);
$c = $this->createMock(MiddlewareInterface::class);

$pipeline->pipe($c);
$pipeline->pipe($a);
$pipeline->pipe($b);

self::assertSame([$c, $a, $b], $pipeline->toArray());
}

public function testThatCloningThePipelineAlsoClonesTheInternalQueue(): void
{
$pipe = new MiddlewarePipe();
$pipe->pipe($this->createMock(MiddlewareInterface::class));

$clone = clone $pipe;

$reflectionClass = new ReflectionClass(MiddlewarePipe::class);
$property = $reflectionClass->getProperty('pipeline');

$queue1 = $property->getValue($pipe);
self::assertInstanceOf(SplQueue::class, $queue1);
$queue2 = $property->getValue($clone);
self::assertInstanceOf(SplQueue::class, $queue2);

self::assertNotSame($queue1, $queue2);
}
}

0 comments on commit a80f851

Please sign in to comment.