Skip to content

Commit f7873e1

Browse files
committed
Middleware Runner
1 parent 2335ac8 commit f7873e1

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

src/MiddlewareRunner.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
use Psr\Http\Message\RequestInterface;
66
use Psr\Http\Message\ResponseInterface;
77
use React\Promise\CancellablePromiseInterface;
8+
use Throwable;
9+
use function React\Promise\reject;
810
use function React\Promise\resolve;
911

1012
final class MiddlewareRunner
@@ -84,4 +86,26 @@ public function post(
8486

8587
return $promise;
8688
}
89+
90+
/**
91+
* @param Throwable $throwable
92+
* @return CancellablePromiseInterface
93+
*/
94+
public function error(
95+
Throwable $throwable
96+
): CancellablePromiseInterface {
97+
98+
$promise = reject($throwable);
99+
100+
$this->middlewares = array_reverse($this->middlewares);
101+
102+
foreach ($this->middlewares as $middleware) {
103+
$errorMiddleware = $middleware;
104+
$promise = $promise->then(null, function (Throwable $throwable) use ($errorMiddleware) {
105+
return reject($errorMiddleware->error($throwable, $this->options));
106+
});
107+
}
108+
109+
return $promise;
110+
}
87111
}

tests/MiddlewareRunnerTest.php

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
namespace ApiClients\Tests\Foundation\Middleware;
44

5-
use ApiClients\Foundation\Middleware\MiddlewareRunner;
65
use ApiClients\Foundation\Middleware\MiddlewareInterface;
6+
use ApiClients\Foundation\Middleware\MiddlewareRunner;
77
use ApiClients\Tools\TestUtilities\TestCase;
8-
use function Clue\React\Block\await;
8+
use Exception;
99
use GuzzleHttp\Psr7\Request;
1010
use GuzzleHttp\Psr7\Response;
1111
use Phake;
12+
use function Clue\React\Block\await;
13+
use function React\Promise\reject;
1214
use function React\Promise\resolve;
1315

1416
class MiddlewareRunnerTest extends TestCase
@@ -17,22 +19,26 @@ public function testAll()
1719
{
1820
$request = new Request('GET', 'https://example.com/');
1921
$response = new Response(200);
22+
$exception = new Exception();
2023
$options = [];
2124

2225
$middlewareOne = Phake::mock(MiddlewareInterface::class);
2326
Phake::when($middlewareOne)->priority()->thenReturn(1000);
2427
Phake::when($middlewareOne)->pre($request, $options)->thenReturn(resolve($request));
2528
Phake::when($middlewareOne)->post($response, $options)->thenReturn(resolve($response));
29+
Phake::when($middlewareOne)->error($exception, $options)->thenReturn(reject($exception));
2630

2731
$middlewareTwo = Phake::mock(MiddlewareInterface::class);
2832
Phake::when($middlewareTwo)->priority()->thenReturn(500);
2933
Phake::when($middlewareTwo)->pre($request, $options)->thenReturn(resolve($request));
3034
Phake::when($middlewareTwo)->post($response, $options)->thenReturn(resolve($response));
35+
Phake::when($middlewareTwo)->error($exception, $options)->thenReturn(reject($exception));
3136

3237
$middlewareThree = Phake::mock(MiddlewareInterface::class);
3338
Phake::when($middlewareThree)->priority()->thenReturn(0);
3439
Phake::when($middlewareThree)->pre($request, $options)->thenReturn(resolve($request));
3540
Phake::when($middlewareThree)->post($response, $options)->thenReturn(resolve($response));
41+
Phake::when($middlewareThree)->error($exception, $options)->thenReturn(reject($exception));
3642

3743
$args = [
3844
$options,
@@ -44,14 +50,18 @@ public function testAll()
4450
$executioner = new MiddlewareRunner(...$args);
4551
$executioner->pre($request);
4652
$executioner->post($response);
53+
$executioner->error($exception);
4754

4855
Phake::inOrder(
4956
Phake::verify($middlewareOne)->pre($request, $options),
5057
Phake::verify($middlewareTwo)->pre($request, $options),
5158
Phake::verify($middlewareThree)->pre($request, $options),
5259
Phake::verify($middlewareThree)->post($response, $options),
5360
Phake::verify($middlewareTwo)->post($response, $options),
54-
Phake::verify($middlewareOne)->post($response, $options)
61+
Phake::verify($middlewareOne)->post($response, $options),
62+
Phake::verify($middlewareOne)->error($exception, $options),
63+
Phake::verify($middlewareTwo)->error($exception, $options),
64+
Phake::verify($middlewareThree)->error($exception, $options)
5565
);
5666
}
5767
}

0 commit comments

Comments
 (0)