Version 1
[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 Psr\Http\Message\UploadedFileInterface;
15 use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;
16 use Symfony\Bridge\PsrHttpMessage\Tests\Fixtures\Response;
17 use Symfony\Bridge\PsrHttpMessage\Tests\Fixtures\ServerRequest;
18 use Symfony\Bridge\PsrHttpMessage\Tests\Fixtures\Stream;
19 use Symfony\Bridge\PsrHttpMessage\Tests\Fixtures\UploadedFile;
20 use Symfony\Bridge\PsrHttpMessage\Tests\Fixtures\Uri;
21
22 /**
23  * @author Kévin Dunglas <dunglas@gmail.com>
24  */
25 class HttpFoundationFactoryTest extends \PHPUnit_Framework_TestCase
26 {
27     /** @var HttpFoundationFactory */
28     private $factory;
29
30     /** @var string */
31     private $tmpDir;
32
33     public function setup()
34     {
35         $this->factory = new HttpFoundationFactory();
36         $this->tmpDir = sys_get_temp_dir();
37     }
38
39     public function testCreateRequest()
40     {
41         $stdClass = new \stdClass();
42         $serverRequest = new ServerRequest(
43             '1.1',
44             array(
45                 'X-Dunglas-API-Platform' => '1.0',
46                 'X-data' => array('a', 'b'),
47             ),
48             new Stream('The body'),
49             '/about/kevin',
50             'GET',
51             'http://les-tilleuls.coop/about/kevin',
52             array('country' => 'France'),
53             array('city' => 'Lille'),
54             array('url' => 'http://les-tilleuls.coop'),
55             array(
56                 'doc1' => $this->createUploadedFile('Doc 1', UPLOAD_ERR_OK, 'doc1.txt', 'text/plain'),
57                 'nested' => array(
58                     'docs' => array(
59                         $this->createUploadedFile('Doc 2', UPLOAD_ERR_OK, 'doc2.txt', 'text/plain'),
60                         $this->createUploadedFile('Doc 3', UPLOAD_ERR_OK, 'doc3.txt', 'text/plain'),
61                     ),
62                 ),
63             ),
64             array('url' => 'http://dunglas.fr'),
65             array('custom' => $stdClass)
66         );
67
68         $symfonyRequest = $this->factory->createRequest($serverRequest);
69         $files = $symfonyRequest->files->all();
70
71         $this->assertEquals('http://les-tilleuls.coop', $symfonyRequest->query->get('url'));
72         $this->assertEquals('doc1.txt', $files['doc1']->getClientOriginalName());
73         $this->assertEquals('doc2.txt', $files['nested']['docs'][0]->getClientOriginalName());
74         $this->assertEquals('doc3.txt', $files['nested']['docs'][1]->getClientOriginalName());
75         $this->assertEquals('http://dunglas.fr', $symfonyRequest->request->get('url'));
76         $this->assertEquals($stdClass, $symfonyRequest->attributes->get('custom'));
77         $this->assertEquals('Lille', $symfonyRequest->cookies->get('city'));
78         $this->assertEquals('France', $symfonyRequest->server->get('country'));
79         $this->assertEquals('The body', $symfonyRequest->getContent());
80         $this->assertEquals('1.0', $symfonyRequest->headers->get('X-Dunglas-API-Platform'));
81         $this->assertEquals(array('a', 'b'), $symfonyRequest->headers->get('X-data', null, false));
82     }
83
84     public function testCreateRequestWithNullParsedBody()
85     {
86         $serverRequest = new ServerRequest(
87             '1.1',
88             array(),
89             new Stream(),
90             '/',
91             'GET',
92             null,
93             array(),
94             array(),
95             array(),
96             array(),
97             null,
98             array()
99         );
100
101         $this->assertCount(0, $this->factory->createRequest($serverRequest)->request);
102     }
103
104     public function testCreateRequestWithObjectParsedBody()
105     {
106         $serverRequest = new ServerRequest(
107             '1.1',
108             array(),
109             new Stream(),
110             '/',
111             'GET',
112             null,
113             array(),
114             array(),
115             array(),
116             array(),
117             new \stdClass(),
118             array()
119         );
120
121         $this->assertCount(0, $this->factory->createRequest($serverRequest)->request);
122     }
123
124     public function testCreateRequestWithUri()
125     {
126         $serverRequest = new ServerRequest(
127             '1.1',
128             array(),
129             new Stream(),
130             '/',
131             'GET',
132             new Uri('http://les-tilleuls.coop/about/kevin'),
133             array(),
134             array(),
135             array(),
136             array(),
137             null,
138             array()
139         );
140
141         $this->assertEquals('/about/kevin', $this->factory->createRequest($serverRequest)->getPathInfo());
142     }
143
144     public function testCreateUploadedFile()
145     {
146         $uploadedFile = $this->createUploadedFile('An uploaded file.', UPLOAD_ERR_OK, 'myfile.txt', 'text/plain');
147         $symfonyUploadedFile = $this->callCreateUploadedFile($uploadedFile);
148
149         $uniqid = uniqid();
150         $symfonyUploadedFile->move($this->tmpDir, $uniqid);
151
152         $this->assertEquals($uploadedFile->getSize(), $symfonyUploadedFile->getClientSize());
153         $this->assertEquals(UPLOAD_ERR_OK, $symfonyUploadedFile->getError());
154         $this->assertEquals('myfile.txt', $symfonyUploadedFile->getClientOriginalName());
155         $this->assertEquals('txt', $symfonyUploadedFile->getClientOriginalExtension());
156         $this->assertEquals('text/plain', $symfonyUploadedFile->getClientMimeType());
157         $this->assertEquals('An uploaded file.', file_get_contents($this->tmpDir.'/'.$uniqid));
158     }
159
160     /**
161      * @expectedException        \Symfony\Component\HttpFoundation\File\Exception\FileException
162      * @expectedExceptionMessage The file "e" could not be written on disk.
163      */
164     public function testCreateUploadedFileWithError()
165     {
166         $uploadedFile = $this->createUploadedFile('Error.', UPLOAD_ERR_CANT_WRITE, 'e', 'text/plain');
167         $symfonyUploadedFile = $this->callCreateUploadedFile($uploadedFile);
168
169         $this->assertEquals(UPLOAD_ERR_CANT_WRITE, $symfonyUploadedFile->getError());
170
171         $symfonyUploadedFile->move($this->tmpDir, 'shouldFail.txt');
172     }
173
174     private function createUploadedFile($content, $error, $clientFileName, $clientMediaType)
175     {
176         $filePath = tempnam($this->tmpDir, uniqid());
177         file_put_contents($filePath, $content);
178
179         return new UploadedFile($filePath, filesize($filePath), $error, $clientFileName, $clientMediaType);
180     }
181
182     private function callCreateUploadedFile(UploadedFileInterface $uploadedFile)
183     {
184         $reflection = new \ReflectionClass($this->factory);
185         $createUploadedFile = $reflection->getMethod('createUploadedFile');
186         $createUploadedFile->setAccessible(true);
187
188         return $createUploadedFile->invokeArgs($this->factory, array($uploadedFile));
189     }
190
191     public function testCreateResponse()
192     {
193         $response = new Response(
194             '1.0',
195             array(
196                 'X-Symfony' => array('2.8'),
197                 'Set-Cookie' => array(
198                     'theme=light',
199                     'test',
200                     'ABC=AeD; Domain=dunglas.fr; Path=/kevin; Expires=Wed, 13 Jan 2021 22:23:01 GMT; Secure; HttpOnly',
201
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 }