1212use React \Tests \Http \Middleware \ProcessStack ;
1313use React \Tests \Http \TestCase ;
1414use RingCentral \Psr7 \Response ;
15+ use Psr \Http \Message \RequestInterface ;
16+ use React \Promise \CancellablePromiseInterface ;
1517
1618final class MiddlewareRunnerTest extends TestCase
1719{
@@ -28,6 +30,39 @@ public function testDefaultResponse()
2830 Block \await ($ middlewareStack ($ request ), Factory::create ());
2931 }
3032
33+ public function testReturnsRejectedPromiseIfHandlerThrowsException ()
34+ {
35+ $ middleware = new MiddlewareRunner (array (
36+ function (ServerRequestInterface $ request ) {
37+ throw new \RuntimeException ('hello ' );
38+ }
39+ ));
40+
41+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
42+
43+ $ promise = $ middleware ($ request );
44+
45+ $ promise ->then (null , $ this ->expectCallableOnceWith ($ this ->isInstanceOf ('RuntimeException ' )));
46+ }
47+
48+ /**
49+ * @requires PHP 7
50+ */
51+ public function testReturnsRejectedPromiseIfHandlerThrowsThrowable ()
52+ {
53+ $ middleware = new MiddlewareRunner (array (
54+ function (ServerRequestInterface $ request ) {
55+ throw new \Error ('hello ' );
56+ }
57+ ));
58+
59+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
60+
61+ $ promise = $ middleware ($ request );
62+
63+ $ promise ->then (null , $ this ->expectCallableOnceWith ($ this ->isInstanceOf ('Throwable ' )));
64+ }
65+
3166 public function provideProcessStackMiddlewares ()
3267 {
3368 $ processStackA = new ProcessStack ();
@@ -342,4 +377,69 @@ public function testUncommonMiddlewareArrayFormats($middlewareFactory, $expected
342377
343378 $ this ->assertSame ($ expectedSequence , (string ) $ response ->getBody ());
344379 }
380+
381+ public function testPendingNextRequestHandlersCanBeCalledConcurrently ()
382+ {
383+ $ called = 0 ;
384+ $ middleware = new MiddlewareRunner (array (
385+ function (RequestInterface $ request , $ next ) {
386+ $ first = $ next ($ request );
387+ $ second = $ next ($ request );
388+
389+ return new Response ();
390+ },
391+ function (RequestInterface $ request ) use (&$ called ) {
392+ ++$ called ;
393+
394+ return new Promise \Promise (function () { });
395+ }
396+ ));
397+
398+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
399+
400+ $ response = Block \await ($ middleware ($ request ), Factory::create ());
401+
402+ $ this ->assertTrue ($ response instanceof ResponseInterface);
403+ $ this ->assertEquals (2 , $ called );
404+ }
405+
406+ public function testCancelPendingNextHandler ()
407+ {
408+ $ once = $ this ->expectCallableOnce ();
409+ $ middleware = new MiddlewareRunner (array (
410+ function (RequestInterface $ request , $ next ) {
411+ $ ret = $ next ($ request );
412+ $ ret ->cancel ();
413+
414+ return $ ret ;
415+ },
416+ function (RequestInterface $ request ) use ($ once ) {
417+ return new Promise \Promise (function () { }, $ once );
418+ }
419+ ));
420+
421+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
422+
423+ $ middleware ($ request );
424+ }
425+
426+ public function testCancelResultingPromiseWillCancelPendingNextHandler ()
427+ {
428+ $ once = $ this ->expectCallableOnce ();
429+ $ middleware = new MiddlewareRunner (array (
430+ function (RequestInterface $ request , $ next ) {
431+ return $ next ($ request );
432+ },
433+ function (RequestInterface $ request ) use ($ once ) {
434+ return new Promise \Promise (function () { }, $ once );
435+ }
436+ ));
437+
438+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
439+
440+ $ promise = $ middleware ($ request );
441+
442+ $ this ->assertTrue ($ promise instanceof CancellablePromiseInterface);
443+ $ promise ->cancel ();
444+ }
345445}
0 commit comments