|
3 | 3 | namespace React\Tests\Http\Middleware; |
4 | 4 |
|
5 | 5 | use Psr\Http\Message\ServerRequestInterface; |
| 6 | +use React\EventLoop\Factory; |
6 | 7 | use React\Http\Io\HttpBodyStream; |
7 | 8 | use React\Http\Io\ServerRequest; |
8 | 9 | use React\Http\Middleware\RequestBodyBufferMiddleware; |
9 | 10 | use React\Stream\ThroughStream; |
10 | 11 | use React\Tests\Http\TestCase; |
11 | 12 | use RingCentral\Psr7\BufferStream; |
| 13 | +use Clue\React\Block; |
12 | 14 |
|
13 | 15 | final class RequestBodyBufferMiddlewareTest extends TestCase |
14 | 16 | { |
@@ -63,45 +65,90 @@ function (ServerRequestInterface $request) use (&$exposedRequest) { |
63 | 65 | $this->assertSame($body, $exposedRequest->getBody()->getContents()); |
64 | 66 | } |
65 | 67 |
|
66 | | - public function testUnknownSizeReturnsError411() |
| 68 | + public function testExcessiveSizeImmediatelyReturnsError413ForKnownSize() |
67 | 69 | { |
68 | | - $body = $this->getMockBuilder('Psr\Http\Message\StreamInterface')->getMock(); |
69 | | - $body->expects($this->once())->method('getSize')->willReturn(null); |
70 | | - |
| 70 | + $loop = Factory::create(); |
| 71 | + |
| 72 | + $stream = new ThroughStream(); |
| 73 | + $stream->end('aa'); |
71 | 74 | $serverRequest = new ServerRequest( |
72 | 75 | 'GET', |
73 | 76 | 'https://example.com/', |
74 | 77 | array(), |
75 | | - $body |
| 78 | + new HttpBodyStream($stream, 2) |
76 | 79 | ); |
77 | 80 |
|
78 | | - $buffer = new RequestBodyBufferMiddleware(); |
| 81 | + $buffer = new RequestBodyBufferMiddleware(1); |
79 | 82 | $response = $buffer( |
80 | 83 | $serverRequest, |
81 | | - function () {} |
| 84 | + function (ServerRequestInterface $request) { |
| 85 | + return $request; |
| 86 | + } |
82 | 87 | ); |
83 | 88 |
|
84 | | - $this->assertSame(411, $response->getStatusCode()); |
| 89 | + $this->assertSame(413, $response->getStatusCode()); |
85 | 90 | } |
86 | 91 |
|
87 | 92 | public function testExcessiveSizeReturnsError413() |
88 | 93 | { |
89 | | - $stream = new BufferStream(2); |
90 | | - $stream->write('aa'); |
| 94 | + $loop = Factory::create(); |
91 | 95 |
|
| 96 | + $stream = new ThroughStream(); |
92 | 97 | $serverRequest = new ServerRequest( |
93 | 98 | 'GET', |
94 | 99 | 'https://example.com/', |
95 | 100 | array(), |
96 | | - $stream |
| 101 | + new HttpBodyStream($stream, null) |
97 | 102 | ); |
98 | 103 |
|
99 | 104 | $buffer = new RequestBodyBufferMiddleware(1); |
100 | | - $response = $buffer( |
| 105 | + $promise = $buffer( |
101 | 106 | $serverRequest, |
102 | | - function () {} |
| 107 | + function (ServerRequestInterface $request) { |
| 108 | + return $request; |
| 109 | + } |
103 | 110 | ); |
104 | 111 |
|
105 | | - $this->assertSame(413, $response->getStatusCode()); |
| 112 | + $stream->end('aa'); |
| 113 | + |
| 114 | + $exposedResponse = null; |
| 115 | + $promise->then( |
| 116 | + function($response) use (&$exposedResponse) { |
| 117 | + $exposedResponse = $response; |
| 118 | + }, |
| 119 | + $this->expectCallableNever() |
| 120 | + ); |
| 121 | + |
| 122 | + $this->assertSame(413, $exposedResponse->getStatusCode()); |
| 123 | + |
| 124 | + Block\await($promise, $loop); |
| 125 | + } |
| 126 | + |
| 127 | + /** |
| 128 | + * @expectedException RuntimeException |
| 129 | + */ |
| 130 | + public function testBufferingErrorThrows() |
| 131 | + { |
| 132 | + $loop = Factory::create(); |
| 133 | + |
| 134 | + $stream = new ThroughStream(); |
| 135 | + $serverRequest = new ServerRequest( |
| 136 | + 'GET', |
| 137 | + 'https://example.com/', |
| 138 | + array(), |
| 139 | + new HttpBodyStream($stream, null) |
| 140 | + ); |
| 141 | + |
| 142 | + $buffer = new RequestBodyBufferMiddleware(1); |
| 143 | + $promise = $buffer( |
| 144 | + $serverRequest, |
| 145 | + function (ServerRequestInterface $request) { |
| 146 | + return $request; |
| 147 | + } |
| 148 | + ); |
| 149 | + |
| 150 | + $stream->emit('error', array(new \RuntimeException())); |
| 151 | + |
| 152 | + Block\await($promise, $loop); |
106 | 153 | } |
107 | 154 | } |
0 commit comments