Security update for Core, with self-updated composer
[yaffs-website] / vendor / symfony / psr-http-message-bridge / Tests / Factory / HttpFoundationFactoryTest.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Bridge\PsrHttpMessage\Tests\Factory;
13
14 use PHPUnit\Framework\TestCase;
15 use Psr\Http\Message\UploadedFileInterface;
16 use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;
17 use Symfony\Bridge\PsrHttpMessage\Tests\Fixtures\Response;
18 use Symfony\Bridge\PsrHttpMessage\Tests\Fixtures\ServerRequest;
19 use Symfony\Bridge\PsrHttpMessage\Tests\Fixtures\Stream;
20 use Symfony\Bridge\PsrHttpMessage\Tests\Fixtures\UploadedFile;
21 use Symfony\Bridge\PsrHttpMessage\Tests\Fixtures\Uri;
22
23 /**
24  * @author Kévin Dunglas <dunglas@gmail.com>
25  */
26 class HttpFoundationFactoryTest extends TestCase
27 {
28     /** @var HttpFoundationFactory */
29     private $factory;
30
31     /** @var string */
32     private $tmpDir;
33
34     public function setup()
35     {
36         $this->factory = new HttpFoundationFactory();
37         $this->tmpDir = sys_get_temp_dir();
38     }
39
40     public function testCreateRequest()
41     {
42         $stdClass = new \stdClass();
43         $serverRequest = new ServerRequest(
44             '1.1',
45             array(
46                 'X-Dunglas-API-Platform' => '1.0',
47                 'X-data' => array('a', 'b'),
48             ),
49             new Stream('The body'),
50             '/about/kevin',
51             'GET',
52             'http://les-tilleuls.coop/about/kevin',
53             array('country' => 'France'),
54             array('city' => 'Lille'),
55             array('url' => 'http://les-tilleuls.coop'),
56             array(
57                 'doc1' => $this->createUploadedFile('Doc 1', UPLOAD_ERR_OK, 'doc1.txt', 'text/plain'),
58                 'nested' => array(
59                     'docs' => array(
60                         $this->createUploadedFile('Doc 2', UPLOAD_ERR_OK, 'doc2.txt', 'text/plain'),
61                         $this->createUploadedFile('Doc 3', UPLOAD_ERR_OK, 'doc3.txt', 'text/plain'),
62                     ),
63                 ),
64             ),
65             array('url' => 'http://dunglas.fr'),
66             array('custom' => $stdClass)
67         );
68
69         $symfonyRequest = $this->factory->createRequest($serverRequest);
70         $files = $symfonyRequest->files->all();
71
72         $this->assertEquals('http://les-tilleuls.coop', $symfonyRequest->query->get('url'));
73         $this->assertEquals('doc1.txt', $files['doc1']->getClientOriginalName());
74         $this->assertEquals('doc2.txt', $files['nested']['docs'][0]->getClientOriginalName());
75         $this->assertEquals('doc3.txt', $files['nested']['docs'][1]->getClientOriginalName());
76         $this->assertEquals('http://dunglas.fr', $symfonyRequest->request->get('url'));
77         $this->assertEquals($stdClass, $symfonyRequest->attributes->get('custom'));
78         $this->assertEquals('Lille', $symfonyRequest->cookies->get('city'));
79         $this->assertEquals('France', $symfonyRequest->server->get('country'));
80         $this->assertEquals('The body', $symfonyRequest->getContent());
81         $this->assertEquals('1.0', $symfonyRequest->headers->get('X-Dunglas-API-Platform'));
82         $this->assertEquals(array('a', 'b'), $symfonyRequest->headers->get('X-data', null, false));
83     }
84
85     public function testCreateRequestWithNullParsedBody()
86     {
87         $serverRequest = new ServerRequest(
88             '1.1',
89             array(),
90             new Stream(),
91             '/',
92             'GET',
93             null,
94             array(),
95             array(),
96             array(),
97             array(),
98             null,
99             array()
100         );
101
102         $this->assertCount(0, $this->factory->createRequest($serverRequest)->request);
103     }
104
105     public function testCreateRequestWithObjectParsedBody()
106     {
107         $serverRequest = new ServerRequest(
108             '1.1',
109             array(),
110             new Stream(),
111             '/',
112             'GET',
113             null,
114             array(),
115             array(),
116             array(),
117             array(),
118             new \stdClass(),
119             array()
120         );
121
122         $this->assertCount(0, $this->factory->createRequest($serverRequest)->request);
123     }
124
125     public function testCreateRequestWithUri()
126     {
127         $serverRequest = new ServerRequest(
128             '1.1',
129             array(),
130             new Stream(),
131             '/',
132             'GET',
133             new Uri('http://les-tilleuls.coop/about/kevin'),
134             array(),
135             array(),
136             array(),
137             array(),
138             null,
139             array()
140         );
141
142         $this->assertEquals('/about/kevin', $this->factory->createRequest($serverRequest)->getPathInfo());
143     }
144
145     public function testCreateUploadedFile()
146     {
147         $uploadedFile = $this->createUploadedFile('An uploaded file.', UPLOAD_ERR_OK, 'myfile.txt', 'text/plain');
148         $symfonyUploadedFile = $this->callCreateUploadedFile($uploadedFile);
149
150         $uniqid = uniqid();
151         $symfonyUploadedFile->move($this->tmpDir, $uniqid);
152
153         $this->assertEquals($uploadedFile->getSize(), $symfonyUploadedFile->getClientSize());
154         $this->assertEquals(UPLOAD_ERR_OK, $symfonyUploadedFile->getError());
155         $this->assertEquals('myfile.txt', $symfonyUploadedFile->getClientOriginalName());
156         $this->assertEquals('txt', $symfonyUploadedFile->getClientOriginalExtension());
157         $this->assertEquals('text/plain', $symfonyUploadedFile->getClientMimeType());
158         $this->assertEquals('An uploaded file.', file_get_contents($this->tmpDir.'/'.$uniqid));
159     }
160
161     /**
162      * @expectedException        \Symfony\Component\HttpFoundation\File\Exception\FileException
163      * @expectedExceptionMessage The file "e" could not be written on disk.
164      */
165     public function testCreateUploadedFileWithError()
166     {
167         $uploadedFile = $this->createUploadedFile('Error.', UPLOAD_ERR_CANT_WRITE, 'e', 'text/plain');
168         $symfonyUploadedFile = $this->callCreateUploadedFile($uploadedFile);
169
170         $this->assertEquals(UPLOAD_ERR_CANT_WRITE, $symfonyUploadedFile->getError());
171
172         $symfonyUploadedFile->move($this->tmpDir, 'shouldFail.txt');
173     }
174
175     private function createUploadedFile($content, $error, $clientFileName, $clientMediaType)
176     {
177         $filePath = tempnam($this->tmpDir, uniqid());
178         file_put_contents($filePath, $content);
179
180         return new UploadedFile($filePath, filesize($filePath), $error, $clientFileName, $clientMediaType);
181     }
182
183     private function callCreateUploadedFile(UploadedFileInterface $uploadedFile)
184     {
185         $reflection = new \ReflectionClass($this->factory);
186         $createUploadedFile = $reflection->getMethod('createUploadedFile');
187         $createUploadedFile->setAccessible(true);
188
189         return $createUploadedFile->invokeArgs($this->factory, array($uploadedFile));
190     }
191
192     public function testCreateResponse()
193     {
194         $response = new Response(
195             '1.0',
196             array(
197                 'X-Symfony' => array('2.8'),
198                 'Set-Cookie' => array(
199                     'theme=light',
200                     'test',
201                     'ABC=AeD; Domain=dunglas.fr; Path=/kevin; Expires=Wed, 13 Jan 2021 22:23:01 GMT; Secure; HttpOnly',
202                 ),
203             ),
204             new Stream('The response body'),
205             200
206         );
207
208         $symfonyResponse = $this->factory->createResponse($response);
209
210         $this->assertEquals('1.0', $symfonyResponse->getProtocolVersion());
211         $this->assertEquals('2.8', $symfonyResponse->headers->get('X-Symfony'));
212
213         $cookies = $symfonyResponse->headers->getCookies();
214         $this->assertEquals('theme', $cookies[0]->getName());
215         $this->assertEquals('light', $cookies[0]->getValue());
216         $this->assertEquals(0, $cookies[0]->getExpiresTime());
217         $this->assertNull($cookies[0]->getDomain());
218         $this->assertEquals('/', $cookies[0]->getPath());
219         $this->assertFalse($cookies[0]->isSecure());
220         $this->assertFalse($cookies[0]->isHttpOnly());
221
222         $this->assertEquals('test', $cookies[1]->getName());
223         $this->assertNull($cookies[1]->getValue());
224
225         $this->assertEquals('ABC', $cookies[2]->getName());
226         $this->assertEquals('AeD', $cookies[2]->getValue());
227         $this->assertEquals(strtotime('Wed, 13 Jan 2021 22:23:01 GMT'), $cookies[2]->getExpiresTime());
228         $this->assertEquals('dunglas.fr', $cookies[2]->getDomain());
229         $this->assertEquals('/kevin', $cookies[2]->getPath());
230         $this->assertTrue($cookies[2]->isSecure());
231         $this->assertTrue($cookies[2]->isHttpOnly());
232
233         $this->assertEquals('The response body', $symfonyResponse->getContent());
234         $this->assertEquals(200, $symfonyResponse->getStatusCode());
235     }
236 }