‪TYPO3CMS  10.4
ResponseTest.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  * This file is part of the TYPO3 CMS project.
5  *
6  * It is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License, either version 2
8  * of the License, or any later version.
9  *
10  * For the full copyright and license information, please read the
11  * LICENSE.txt file that was distributed with this source code.
12  *
13  * The TYPO3 project - inspiring people to share!
14  */
15 
17 
20 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
21 
27 class ‪ResponseTest extends UnitTestCase
28 {
32  protected ‪$response;
33 
34  protected function ‪setUp(): void
35  {
36  parent::setUp();
37  $this->response = new ‪Response();
38  }
39 
43  public function ‪testStatusCodeIs200ByDefault()
44  {
45  self::assertEquals(200, $this->response->getStatusCode());
46  }
47 
52  {
53  ‪$response = $this->response->‪withStatus(400);
54  self::assertNotSame($this->response, ‪$response);
55  self::assertEquals(400, ‪$response->‪getStatusCode());
56  }
57 
61  public function ‪invalidStatusCodesDataProvider()
62  {
63  return [
64  'too-low' => [99],
65  'too-high' => [600],
66  'null' => [null],
67  'bool' => [true],
68  'string' => ['foo'],
69  'array' => [[200]],
70  'object' => [(object)[200]],
71  ];
72  }
73 
78  public function ‪testCannotSetInvalidStatusCode($code)
79  {
80  $this->expectException(\InvalidArgumentException::class);
81  $this->response->withStatus($code);
82  }
83 
88  {
89  ‪$response = $this->response->‪withStatus(422);
90  self::assertEquals('Unprocessable Entity', ‪$response->‪getReasonPhrase());
91  }
92 
96  public function ‪testCanSetCustomReasonPhrase()
97  {
98  ‪$response = $this->response->‪withStatus(422, 'Foo Bar!');
99  self::assertEquals('Foo Bar!', ‪$response->‪getReasonPhrase());
100  }
101 
106  {
107  $this->expectException(\InvalidArgumentException::class);
108  new Response(['TOTALLY INVALID']);
109  }
110 
115  {
116  $body = new Stream('php://memory');
117  $status = 302;
118  $headers = [
119  'location' => ['http://example.com/'],
120  ];
121 
122  ‪$response = new Response($body, $status, $headers);
123  self::assertSame($body, ‪$response->‪getBody());
124  self::assertEquals(302, ‪$response->‪getStatusCode());
125  self::assertEquals($headers, ‪$response->‪getHeaders());
126  }
127 
131  public function ‪invalidStatusDataProvider()
132  {
133  return [
134  'true' => [true],
135  'false' => [false],
136  'float' => [100.1],
137  'bad-string' => ['Two hundred'],
138  'array' => [[200]],
139  'object' => [(object)['statusCode' => 200]],
140  'too-small' => [1],
141  'too-big' => [600],
142  ];
143  }
144 
150  {
151  $this->expectException(\InvalidArgumentException::class);
152  $this->expectExceptionCode(1436717278);
153  new Response('php://memory', $code);
154  }
155 
159  public function ‪invalidResponseBodyDataProvider()
160  {
161  return [
162  'true' => [true],
163  'false' => [false],
164  'int' => [1],
165  'float' => [1.1],
166  'array' => [['BODY']],
167  'stdClass' => [(object)['body' => 'BODY']],
168  ];
169  }
170 
176  {
177  $this->expectException(\InvalidArgumentException::class);
178  $this->expectExceptionCode(1436717277);
179  new Response($body);
180  }
181 
185  public function ‪constructorIgnoresInvalidHeaders()
186  {
187  $headers = [
188  ['INVALID'],
189  'x-invalid-null' => null,
190  'x-invalid-true' => true,
191  'x-invalid-false' => false,
192  'x-invalid-int' => 1,
193  'x-invalid-object' => (object)['INVALID'],
194  'x-valid-string' => 'VALID',
195  'x-valid-array' => ['VALID'],
196  ];
197  $expected = [
198  'x-valid-string' => ['VALID'],
199  'x-valid-array' => ['VALID'],
200  ];
201  ‪$response = new Response('php://memory', 200, $headers);
202  self::assertEquals($expected, ‪$response->‪getHeaders());
203  }
204 
209  {
210  return [
211  'name-with-cr' => ["X-Foo\r-Bar", 'value'],
212  'name-with-lf' => ["X-Foo\n-Bar", 'value'],
213  'name-with-crlf' => ["X-Foo\r\n-Bar", 'value'],
214  'name-with-2crlf' => ["X-Foo\r\n\r\n-Bar", 'value'],
215  'value-with-cr' => ['X-Foo-Bar', "value\rinjection"],
216  'value-with-lf' => ['X-Foo-Bar', "value\ninjection"],
217  'value-with-crlf' => ['X-Foo-Bar', "value\r\ninjection"],
218  'value-with-2crlf' => ['X-Foo-Bar', "value\r\n\r\ninjection"],
219  'array-value-with-cr' => ['X-Foo-Bar', ["value\rinjection"]],
220  'array-value-with-lf' => ['X-Foo-Bar', ["value\ninjection"]],
221  'array-value-with-crlf' => ['X-Foo-Bar', ["value\r\ninjection"]],
222  'array-value-with-2crlf' => ['X-Foo-Bar', ["value\r\n\r\ninjection"]],
223  ];
224  }
225 
230  public function ‪constructorRaisesExceptionForHeadersWithCRLFVectors($name, $value)
231  {
232  $this->expectException(\InvalidArgumentException::class);
233  new Response('php://memory', 200, [$name => $value]);
234  }
235 
240  {
241  $subject = new Response('php://memory', 200, ['location' => 'foo']);
242  $expected = [
243  0 => 'foo',
244  ];
245  self::assertSame($expected, $subject->getHeader('location'));
246  }
247 }
‪TYPO3\CMS\Core\Http\Response\getStatusCode
‪int getStatusCode()
Definition: Response.php:156
‪TYPO3\CMS\Core\Http\Response\withStatus
‪static withStatus($code, $reasonPhrase='')
Definition: Response.php:182
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\testConstructorRaisesExceptionForInvalidStream
‪testConstructorRaisesExceptionForInvalidStream()
Definition: ResponseTest.php:104
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\setUp
‪setUp()
Definition: ResponseTest.php:33
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\invalidStatusDataProvider
‪array invalidStatusDataProvider()
Definition: ResponseTest.php:130
‪TYPO3\CMS\Core\Http\Message\getHeaders
‪array getHeaders()
Definition: Message.php:110
‪TYPO3\CMS\Core\Tests\Unit\Http
Definition: ApplicationTypeTest.php:16
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\testCanSetCustomReasonPhrase
‪testCanSetCustomReasonPhrase()
Definition: ResponseTest.php:95
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\$response
‪Response $response
Definition: ResponseTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\testCannotSetInvalidStatusCode
‪testCannotSetInvalidStatusCode($code)
Definition: ResponseTest.php:77
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\testConstructorCanAcceptAllMessageParts
‪testConstructorCanAcceptAllMessageParts()
Definition: ResponseTest.php:113
‪TYPO3\CMS\Core\Http\Response\getReasonPhrase
‪string getReasonPhrase()
Definition: Response.php:206
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\invalidResponseBodyDataProvider
‪array invalidResponseBodyDataProvider()
Definition: ResponseTest.php:158
‪TYPO3\CMS\Core\Http\Response
Definition: Response.php:30
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\testConstructorRaisesExceptionForInvalidBody
‪testConstructorRaisesExceptionForInvalidBody($body)
Definition: ResponseTest.php:174
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\constructorIgnoresInvalidHeaders
‪constructorIgnoresInvalidHeaders()
Definition: ResponseTest.php:184
‪TYPO3\CMS\Core\Http\Stream
Definition: Stream.php:29
‪TYPO3\CMS\Core\Http\Message\getBody
‪Psr Http Message StreamInterface getBody()
Definition: Message.php:283
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\headersWithInjectionVectorsDataProvider
‪array headersWithInjectionVectorsDataProvider()
Definition: ResponseTest.php:207
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest
Definition: ResponseTest.php:28
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\testConstructorRaisesExceptionForInvalidStatus
‪testConstructorRaisesExceptionForInvalidStatus($code)
Definition: ResponseTest.php:148
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\testStatusCodeMutatorReturnsCloneWithChanges
‪testStatusCodeMutatorReturnsCloneWithChanges()
Definition: ResponseTest.php:50
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\invalidStatusCodesDataProvider
‪array invalidStatusCodesDataProvider()
Definition: ResponseTest.php:60
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\getHeaderReturnsHeaderSetByConstructorArgument
‪getHeaderReturnsHeaderSetByConstructorArgument()
Definition: ResponseTest.php:238
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\testStatusCodeIs200ByDefault
‪testStatusCodeIs200ByDefault()
Definition: ResponseTest.php:42
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\constructorRaisesExceptionForHeadersWithCRLFVectors
‪constructorRaisesExceptionForHeadersWithCRLFVectors($name, $value)
Definition: ResponseTest.php:229
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\testReasonPhraseDefaultsToStandards
‪testReasonPhraseDefaultsToStandards()
Definition: ResponseTest.php:86