Skip to content

Commit 5f6d05c

Browse files
committed
ADDED TEST: PSR Adapters.
1 parent f244319 commit 5f6d05c

File tree

3 files changed

+171
-3
lines changed

3 files changed

+171
-3
lines changed

Src/PipelineBridge.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ public static function toMiddleware( mixed $middleware ): object {
7777
if ( null === $middleware ) {
7878
throw new TypeError(
7979
sprintf(
80-
'Non-existing class "%1$s". Middleware must be a Closure, an instance of %2$s'
81-
. ' or classname of a class that implements %2$s.',
82-
$provided,
80+
'Invalid or Non-existing class "%1$s". Middleware must be a Closure, an'
81+
. ' instance of %2$sor classname of a class that implements %2$s.',
82+
$isClassName ? $provided : $provided::class,
8383
$interface
8484
)
8585
);

Tests/BridgeTest.php

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
/**
3+
* Pipeline bridge test.
4+
*
5+
* @package TheWebSolver\Codegarage\Test
6+
*/
7+
8+
declare( strict_types = 1 );
9+
10+
namespace TheWebSolver\Codegarage\Lib;
11+
12+
use MiddlewareAdapter;
13+
use PHPUnit\Framework\TestCase;
14+
use TheWebSolver\Codegarage\Lib\PipelineBridge;
15+
use TheWebSolver\Codegarage\Lib\Psr7Adapter\Request;
16+
use TheWebSolver\Codegarage\Lib\Psr7Adapter\Response;
17+
use TheWebSolver\Codegarage\Lib\Psr15Adapter\Middleware;
18+
use TheWebSolver\Codegarage\Lib\Psr7Adapter\ResponseInterface;
19+
use TheWebSolver\Codegarage\Lib\Psr15Adapter\MiddlewareInterface;
20+
use TheWebSolver\Codegarage\Lib\Psr7Adapter\ServerRequestInterface;
21+
use TheWebSolver\Codegarage\Lib\Psr15Adapter\RequestHandlerInterface;
22+
23+
class BridgeTest extends TestCase {
24+
protected function setUp(): void {
25+
require_once __DIR__ . '/Stub/PsrStubs.php';
26+
}
27+
28+
public function testPSRBridge() {
29+
PipelineBridge::setMiddlewareAdapter(
30+
interface: MiddlewareInterface::class,
31+
className: MiddlewareAdapter::class
32+
);
33+
34+
$request = new Request();
35+
$handler = new class() implements RequestHandlerInterface {
36+
public function handle( ServerRequestInterface $request ): ResponseInterface {
37+
$middlewares[] = Middleware::class;
38+
$middlewares[] = static fn ( ServerRequestInterface $request, RequestHandlerInterface $h )
39+
=> $request
40+
->getAttribute( PipelineBridge::MIDDLEWARE_RESPONSE )
41+
->withStatus( code: 300 );
42+
43+
$middlewares[] = new class() implements MiddlewareInterface {
44+
public function process(
45+
ServerRequestInterface $request,
46+
RequestHandlerInterface $handler
47+
): ResponseInterface {
48+
$response = $request
49+
->getAttribute( PipelineBridge::MIDDLEWARE_RESPONSE )
50+
->withStatus( code: 350 );
51+
52+
return $response;
53+
}
54+
};
55+
56+
return ( new Pipeline() )
57+
->use( $request, $this )
58+
->send( subject: ( new Response() )->withStatus( code: 100 ) )
59+
->through(
60+
pipes: array_map( fn( $m ) => PipelineBridge::middlewareToPipe( $m ), $middlewares )
61+
)->thenReturn();
62+
}
63+
};
64+
65+
$this->assertSame( expected: 350, actual: $handler->handle( $request )->getStatusCode() );
66+
}
67+
}

Tests/Stub/PsrStubs.php

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?php
2+
/**
3+
* Stub adapters for PSR7 and PSR15.
4+
*
5+
* @package TheWebSolver\Codegarage\Test
6+
*
7+
* @phpcs:disable Universal.Namespaces.DisallowCurlyBraceSyntax.Forbidden
8+
* @phpcs:disable Generic.Files.OneObjectStructurePerFile.MultipleFound
9+
* @phpcs:disable Universal.Namespaces.OneDeclarationPerFile.MultipleFound
10+
* @phpcs:disable Universal.Namespaces.DisallowDeclarationWithoutName.Forbidden
11+
*/
12+
13+
declare( strict_types = 1 );
14+
15+
namespace TheWebSolver\Codegarage\Lib\Psr7Adapter {
16+
interface ServerRequestInterface {
17+
public function withAttribute( string $name, mixed $value ): static;
18+
public function getAttribute( string $name, mixed $default = null ): mixed;
19+
}
20+
21+
interface ResponseInterface {
22+
public function withStatus( int $code ): static;
23+
public function getStatusCode(): int;
24+
}
25+
26+
class Request implements ServerRequestInterface {
27+
/** @var array<string,mixed> */
28+
private array $attribute;
29+
30+
public function withAttribute( string $name, mixed $value ): static {
31+
$new = clone $this;
32+
$new->attribute[ $name ] = $value;
33+
34+
return $new;
35+
}
36+
37+
public function getAttribute( string $name, mixed $default = null ): mixed {
38+
return $this->attribute[ $name ] ?? $default;
39+
}
40+
}
41+
42+
class Response implements ResponseInterface {
43+
private int $statusCode;
44+
45+
public function withStatus( int $code ): static {
46+
$new = clone $this;
47+
$new->statusCode = $code;
48+
49+
return $new;
50+
}
51+
52+
public function getStatusCode(): int {
53+
return $this->statusCode;
54+
}
55+
}
56+
}
57+
58+
namespace TheWebSolver\Codegarage\Lib\Psr15Adapter {
59+
use TheWebSolver\Codegarage\Lib\PipelineBridge;
60+
use TheWebSolver\Codegarage\Lib\Psr7Adapter\{ ServerRequestInterface, ResponseInterface };
61+
62+
interface RequestHandlerInterface {
63+
public function handle( ServerRequestInterface $request ): ResponseInterface;
64+
}
65+
66+
interface MiddlewareInterface {
67+
public function process(
68+
ServerRequestInterface $request,
69+
RequestHandlerInterface $handler
70+
): ResponseInterface;
71+
}
72+
73+
class Middleware implements MiddlewareInterface {
74+
public function process(
75+
ServerRequestInterface $request,
76+
RequestHandlerInterface $handler
77+
): ResponseInterface {
78+
$response = $request
79+
->getAttribute( name: PipelineBridge::MIDDLEWARE_RESPONSE )
80+
->withStatus( code: 200 );
81+
82+
return $response;
83+
}
84+
}
85+
}
86+
87+
namespace {
88+
use TheWebSolver\Codegarage\Lib\Psr7Adapter\{ ServerRequestInterface, ResponseInterface };
89+
use TheWebSolver\Codegarage\Lib\Psr15Adapter\{ MiddlewareInterface, RequestHandlerInterface };
90+
91+
class MiddlewareAdapter implements MiddlewareInterface {
92+
public function __construct( private readonly \Closure $middleware ) {}
93+
94+
public function process(
95+
ServerRequestInterface $request,
96+
RequestHandlerInterface $handler
97+
): ResponseInterface {
98+
return ( $this->middleware )( $request, $handler );
99+
}
100+
}
101+
}

0 commit comments

Comments
 (0)