‪TYPO3CMS  ‪main
ResponseTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
22 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
23 
24 final class ‪ResponseTest extends UnitTestCase
25 {
27 
28  protected function ‪setUp(): void
29  {
30  parent::setUp();
31  $this->response = new ‪Response();
32  }
33 
37  public function ‪statusCodeIs200ByDefault(): void
38  {
39  self::assertEquals(200, $this->response->getStatusCode());
40  }
41 
46  {
47  ‪$response = $this->response->‪withStatus(400);
48  self::assertNotSame($this->response, ‪$response);
49  self::assertEquals(400, ‪$response->‪getStatusCode());
50  }
51 
52  public static function ‪invalidStatusCodesDataProvider(): array
53  {
54  return [
55  'too-low' => [99],
56  'too-high' => [600],
57  ];
58  }
59 
64  public function ‪cannotSetInvalidStatusCode($code): void
65  {
66  $this->expectException(\InvalidArgumentException::class);
67  $this->response->withStatus($code);
68  }
69 
73  public function ‪reasonPhraseDefaultsToStandards(): void
74  {
75  ‪$response = $this->response->‪withStatus(422);
76  self::assertEquals('Unprocessable Entity', ‪$response->‪getReasonPhrase());
77  }
78 
82  public function ‪canSetCustomReasonPhrase(): void
83  {
84  ‪$response = $this->response->‪withStatus(422, 'Foo Bar!');
85  self::assertEquals('Foo Bar!', ‪$response->‪getReasonPhrase());
86  }
87 
92  {
93  $this->expectException(\InvalidArgumentException::class);
94  new ‪Response(['TOTALLY INVALID']);
95  }
96 
101  {
102  $body = new ‪Stream('php://memory');
103  $status = 302;
104  $headers = [
105  'location' => ['http://example.com/'],
106  ];
107 
108  ‪$response = new ‪Response($body, $status, $headers);
109  self::assertSame($body, ‪$response->‪getBody());
110  self::assertEquals(302, ‪$response->‪getStatusCode());
111  self::assertEquals($headers, ‪$response->‪getHeaders());
112  }
113 
114  public static function ‪invalidStatusDataProvider(): array
115  {
116  return [
117  'too-small' => [1],
118  'too-big' => [600],
119  ];
120  }
121 
127  {
128  $this->expectException(\InvalidArgumentException::class);
129  $this->expectExceptionCode(1436717278);
130  new ‪Response('php://memory', $code);
131  }
132 
133  public static function ‪invalidResponseBodyDataProvider(): array
134  {
135  return [
136  'true' => [true],
137  'false' => [false],
138  'int' => [1],
139  'float' => [1.1],
140  'array' => [['BODY']],
141  'stdClass' => [(object)['body' => 'BODY']],
142  ];
143  }
144 
149  public function ‪constructorRaisesExceptionForInvalidBody($body): void
150  {
151  $this->expectException(\InvalidArgumentException::class);
152  $this->expectExceptionCode(1436717277);
153  new ‪Response($body);
154  }
155 
159  public function ‪constructorIgnoresInvalidHeaders(): void
160  {
161  $headers = [
162  ['INVALID'],
163  'x-invalid-null' => null,
164  'x-valid-true' => true,
165  'x-valid-false' => false,
166  'x-valid-int' => 1,
167  'x-valid-float' => 1.5,
168  'x-invalid-object' => (object)['INVALID'],
169  'x-valid-string' => 'VALID',
170  'x-valid-array' => ['VALID'],
171  ];
172  $expected = [
173  'x-valid-true' => ['1'],
174  'x-valid-false' => [''],
175  'x-valid-int' => ['1'],
176  'x-valid-float' => ['1.5'],
177  'x-valid-string' => ['VALID'],
178  'x-valid-array' => ['VALID'],
179  ];
180  ‪$response = new ‪Response('php://memory', 200, $headers);
181  self::assertEquals($expected, ‪$response->‪getHeaders());
182  }
183 
184  public static function ‪headersWithInjectionVectorsDataProvider(): array
185  {
186  return [
187  'name-with-cr' => ["X-Foo\r-Bar", 'value'],
188  'name-with-lf' => ["X-Foo\n-Bar", 'value'],
189  'name-with-crlf' => ["X-Foo\r\n-Bar", 'value'],
190  'name-with-2crlf' => ["X-Foo\r\n\r\n-Bar", 'value'],
191  'value-with-cr' => ['X-Foo-Bar', "value\rinjection"],
192  'value-with-lf' => ['X-Foo-Bar', "value\ninjection"],
193  'value-with-crlf' => ['X-Foo-Bar', "value\r\ninjection"],
194  'value-with-2crlf' => ['X-Foo-Bar', "value\r\n\r\ninjection"],
195  'array-value-with-cr' => ['X-Foo-Bar', ["value\rinjection"]],
196  'array-value-with-lf' => ['X-Foo-Bar', ["value\ninjection"]],
197  'array-value-with-crlf' => ['X-Foo-Bar', ["value\r\ninjection"]],
198  'array-value-with-2crlf' => ['X-Foo-Bar', ["value\r\n\r\ninjection"]],
199  ];
200  }
201 
206  public function ‪constructorRaisesExceptionForHeadersWithCRLFVectors($name, $value): void
207  {
208  $this->expectException(\InvalidArgumentException::class);
209  new ‪Response('php://memory', 200, [$name => $value]);
210  }
211 
216  {
217  $subject = new ‪Response('php://memory', 200, ['location' => 'foo']);
218  $expected = [
219  0 => 'foo',
220  ];
221  self::assertSame($expected, $subject->getHeader('location'));
222  }
223 }
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\invalidResponseBodyDataProvider
‪static invalidResponseBodyDataProvider()
Definition: ResponseTest.php:133
‪TYPO3\CMS\Core\Http\Message\getBody
‪StreamInterface getBody()
Definition: Message.php:287
‪TYPO3\CMS\Core\Http\Response\getStatusCode
‪int getStatusCode()
Definition: Response.php:156
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\setUp
‪setUp()
Definition: ResponseTest.php:28
‪TYPO3\CMS\Core\Http\Response\withStatus
‪static withStatus(int $code, string $reasonPhrase='')
Definition: Response.php:182
‪TYPO3\CMS\Core\Http\Message\getHeaders
‪array getHeaders()
Definition: Message.php:114
‪TYPO3\CMS\Core\Tests\Unit\Http
Definition: ApplicationTypeTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\constructorRaisesExceptionForInvalidBody
‪constructorRaisesExceptionForInvalidBody($body)
Definition: ResponseTest.php:149
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\$response
‪Response $response
Definition: ResponseTest.php:26
‪TYPO3\CMS\Core\Http\Response\getReasonPhrase
‪string getReasonPhrase()
Definition: Response.php:206
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\statusCodeMutatorReturnsCloneWithChanges
‪statusCodeMutatorReturnsCloneWithChanges()
Definition: ResponseTest.php:45
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\invalidStatusDataProvider
‪static invalidStatusDataProvider()
Definition: ResponseTest.php:114
‪TYPO3\CMS\Core\Http\Response
Definition: Response.php:32
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\constructorIgnoresInvalidHeaders
‪constructorIgnoresInvalidHeaders()
Definition: ResponseTest.php:159
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\statusCodeIs200ByDefault
‪statusCodeIs200ByDefault()
Definition: ResponseTest.php:37
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\constructorRaisesExceptionForInvalidStatus
‪constructorRaisesExceptionForInvalidStatus($code)
Definition: ResponseTest.php:126
‪TYPO3\CMS\Core\Http\Stream
Definition: Stream.php:31
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\cannotSetInvalidStatusCode
‪cannotSetInvalidStatusCode($code)
Definition: ResponseTest.php:64
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest
Definition: ResponseTest.php:25
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\invalidStatusCodesDataProvider
‪static invalidStatusCodesDataProvider()
Definition: ResponseTest.php:52
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\headersWithInjectionVectorsDataProvider
‪static headersWithInjectionVectorsDataProvider()
Definition: ResponseTest.php:184
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\getHeaderReturnsHeaderSetByConstructorArgument
‪getHeaderReturnsHeaderSetByConstructorArgument()
Definition: ResponseTest.php:215
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\reasonPhraseDefaultsToStandards
‪reasonPhraseDefaultsToStandards()
Definition: ResponseTest.php:73
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\constructorRaisesExceptionForHeadersWithCRLFVectors
‪constructorRaisesExceptionForHeadersWithCRLFVectors($name, $value)
Definition: ResponseTest.php:206
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\constructorRaisesExceptionForInvalidStream
‪constructorRaisesExceptionForInvalidStream()
Definition: ResponseTest.php:91
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\constructorCanAcceptAllMessageParts
‪constructorCanAcceptAllMessageParts()
Definition: ResponseTest.php:100
‪TYPO3\CMS\Core\Tests\Unit\Http\ResponseTest\canSetCustomReasonPhrase
‪canSetCustomReasonPhrase()
Definition: ResponseTest.php:82