Skip to content

Commit 65f3f5d

Browse files
authored
Merge pull request #8 from php-api-clients/feature-stateful-middlewares
Transactions ID for statefull middlewares
2 parents 3677a06 + 5a4e714 commit 65f3f5d

File tree

6 files changed

+69
-33
lines changed

6 files changed

+69
-33
lines changed

src/ErrorTrait.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ trait ErrorTrait
1414
* @param array $options
1515
* @return CancellablePromiseInterface
1616
*/
17-
public function error(Throwable $throwable, array $options = []): CancellablePromiseInterface
18-
{
17+
public function error(
18+
Throwable $throwable,
19+
array $options = [],
20+
string $transactionId = null
21+
): CancellablePromiseInterface {
1922
return reject($throwable);
2023
}
2124
}

src/MiddlewareInterface.php

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,26 +27,41 @@ public function priority(): int;
2727
*
2828
* @param RequestInterface $request
2929
* @param array $options
30+
* @param string $transactionId
3031
* @return CancellablePromiseInterface
3132
*/
32-
public function pre(RequestInterface $request, array $options = []): CancellablePromiseInterface;
33+
public function pre(
34+
RequestInterface $request,
35+
array $options = [],
36+
string $transactionId = null
37+
): CancellablePromiseInterface;
3338

3439
/**
3540
* Return the processed $response via a promise.
3641
*
3742
* @param ResponseInterface $response
3843
* @param array $options
44+
* @param string $transactionId
3945
* @return CancellablePromiseInterface
4046
*/
41-
public function post(ResponseInterface $response, array $options = []): CancellablePromiseInterface;
47+
public function post(
48+
ResponseInterface $response,
49+
array $options = [],
50+
string $transactionId = null
51+
): CancellablePromiseInterface;
4252

4353
/**
4454
* Transform the throwable into another throwable or exception,
4555
* but never turn it into a successful promise again.
4656
*
4757
* @param Throwable $throwable
4858
* @param array $options
59+
* @param string $transactionId
4960
* @return CancellablePromiseInterface
5061
*/
51-
public function error(Throwable $throwable, array $options = []): CancellablePromiseInterface;
62+
public function error(
63+
Throwable $throwable,
64+
array $options = [],
65+
string $transactionId = null
66+
): CancellablePromiseInterface;
5267
}

src/MiddlewareRunner.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ final class MiddlewareRunner
2121
*/
2222
private $middlewares;
2323

24+
/**
25+
* @var string
26+
*/
27+
private $id;
28+
2429
/**
2530
* MiddlewareRunner constructor.
2631
* @param array $options
@@ -30,6 +35,7 @@ public function __construct(array $options, MiddlewareInterface ...$middlewares)
3035
{
3136
$this->options = $options;
3237
$this->middlewares = $this->orderMiddlewares(...$middlewares);
38+
$this->id = bin2hex(random_bytes(32));
3339
}
3440

3541
/**
@@ -59,7 +65,7 @@ public function pre(
5965
foreach ($this->middlewares as $middleware) {
6066
$requestMiddleware = $middleware;
6167
$promise = $promise->then(function (RequestInterface $request) use ($requestMiddleware) {
62-
return $requestMiddleware->pre($request, $this->options);
68+
return $requestMiddleware->pre($request, $this->options, $this->id);
6369
});
6470
}
6571

@@ -80,7 +86,7 @@ public function post(
8086
foreach ($this->middlewares as $middleware) {
8187
$responseMiddleware = $middleware;
8288
$promise = $promise->then(function (ResponseInterface $response) use ($responseMiddleware) {
83-
return $responseMiddleware->post($response, $this->options);
89+
return $responseMiddleware->post($response, $this->options, $this->id);
8490
});
8591
}
8692

@@ -102,7 +108,7 @@ public function error(
102108
foreach ($this->middlewares as $middleware) {
103109
$errorMiddleware = $middleware;
104110
$promise = $promise->then(null, function (Throwable $throwable) use ($errorMiddleware) {
105-
return reject($errorMiddleware->error($throwable, $this->options));
111+
return reject($errorMiddleware->error($throwable, $this->options, $this->id));
106112
});
107113
}
108114

src/PostTrait.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ trait PostTrait
1313
* @param array $options
1414
* @return CancellablePromiseInterface
1515
*/
16-
public function post(ResponseInterface $response, array $options = []): CancellablePromiseInterface
17-
{
16+
public function post(
17+
ResponseInterface $response,
18+
array $options = [],
19+
string $transactionId = null
20+
): CancellablePromiseInterface {
1821
return resolve($response);
1922
}
2023
}

src/PreTrait.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ trait PreTrait
1313
* @param array $options
1414
* @return CancellablePromiseInterface
1515
*/
16-
public function pre(RequestInterface $request, array $options = []): CancellablePromiseInterface
17-
{
16+
public function pre(
17+
RequestInterface $request,
18+
array $options = [],
19+
string $transactionId = null
20+
): CancellablePromiseInterface {
1821
return resolve($request);
1922
}
2023
}

tests/MiddlewareRunnerTest.php

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use ApiClients\Foundation\Middleware\MiddlewareInterface;
66
use ApiClients\Foundation\Middleware\MiddlewareRunner;
77
use ApiClients\Tools\TestUtilities\TestCase;
8+
use Closure;
89
use Exception;
910
use GuzzleHttp\Psr7\Request;
1011
use GuzzleHttp\Psr7\Response;
@@ -27,22 +28,10 @@ public function testAll()
2728

2829
$middlewareOne = Phake::mock(MiddlewareInterface::class);
2930
Phake::when($middlewareOne)->priority()->thenReturn(1000);
30-
Phake::when($middlewareOne)->pre($request, $options)->thenReturn(resolve($request));
31-
Phake::when($middlewareOne)->post($response, $options)->thenReturn(resolve($response));
32-
Phake::when($middlewareOne)->error($exception, $options)->thenReturn(reject($exception));
33-
3431
$middlewareTwo = Phake::mock(MiddlewareInterface::class);
3532
Phake::when($middlewareTwo)->priority()->thenReturn(500);
36-
Phake::when($middlewareTwo)->pre($request, $options)->thenReturn(resolve($request));
37-
Phake::when($middlewareTwo)->post($response, $options)->thenReturn(resolve($response));
38-
Phake::when($middlewareTwo)->error($exception, $options)->thenReturn(reject($exception));
39-
4033
$middlewareThree = Phake::mock(MiddlewareInterface::class);
4134
Phake::when($middlewareThree)->priority()->thenReturn(0);
42-
Phake::when($middlewareThree)->pre($request, $options)->thenReturn(resolve($request));
43-
Phake::when($middlewareThree)->post($response, $options)->thenReturn(resolve($response));
44-
Phake::when($middlewareThree)->error($exception, $options)->thenReturn(reject($exception));
45-
4635
$args = [
4736
$options,
4837
$middlewareThree,
@@ -51,6 +40,23 @@ public function testAll()
5140
];
5241

5342
$executioner = new MiddlewareRunner(...$args);
43+
$id = Closure::bind(function ($executioner) {
44+
return $executioner->id;
45+
}, null, MiddlewareRunner::class)($executioner);
46+
47+
Phake::when($middlewareOne)->pre($request, $options, $id)->thenReturn(resolve($request));
48+
Phake::when($middlewareOne)->post($response, $options, $id)->thenReturn(resolve($response));
49+
Phake::when($middlewareOne)->error($exception, $options, $id)->thenReturn(reject($exception));
50+
51+
Phake::when($middlewareTwo)->pre($request, $options, $id)->thenReturn(resolve($request));
52+
Phake::when($middlewareTwo)->post($response, $options, $id)->thenReturn(resolve($response));
53+
Phake::when($middlewareTwo)->error($exception, $options, $id)->thenReturn(reject($exception));
54+
55+
Phake::when($middlewareThree)->pre($request, $options, $id)->thenReturn(resolve($request));
56+
Phake::when($middlewareThree)->post($response, $options, $id)->thenReturn(resolve($response));
57+
Phake::when($middlewareThree)->error($exception, $options, $id)->thenReturn(reject($exception));
58+
59+
5460
self::assertSame($request, await($executioner->pre($request), $loop));
5561
self::assertSame($response, await($executioner->post($response), $loop));
5662
try {
@@ -60,15 +66,15 @@ public function testAll()
6066
}
6167

6268
Phake::inOrder(
63-
Phake::verify($middlewareOne)->pre($request, $options),
64-
Phake::verify($middlewareTwo)->pre($request, $options),
65-
Phake::verify($middlewareThree)->pre($request, $options),
66-
Phake::verify($middlewareThree)->post($response, $options),
67-
Phake::verify($middlewareTwo)->post($response, $options),
68-
Phake::verify($middlewareOne)->post($response, $options),
69-
Phake::verify($middlewareOne)->error($exception, $options),
70-
Phake::verify($middlewareTwo)->error($exception, $options),
71-
Phake::verify($middlewareThree)->error($exception, $options)
69+
Phake::verify($middlewareOne)->pre($request, $options, $id),
70+
Phake::verify($middlewareTwo)->pre($request, $options, $id),
71+
Phake::verify($middlewareThree)->pre($request, $options, $id),
72+
Phake::verify($middlewareThree)->post($response, $options, $id),
73+
Phake::verify($middlewareTwo)->post($response, $options, $id),
74+
Phake::verify($middlewareOne)->post($response, $options, $id),
75+
Phake::verify($middlewareOne)->error($exception, $options, $id),
76+
Phake::verify($middlewareTwo)->error($exception, $options, $id),
77+
Phake::verify($middlewareThree)->error($exception, $options, $id)
7278
);
7379
}
7480
}

0 commit comments

Comments
 (0)