HttpKernelBrowserTest.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\HttpKernel\Tests;
  11. use PHPUnit\Framework\TestCase;
  12. use Symfony\Component\HttpFoundation\Cookie;
  13. use Symfony\Component\HttpFoundation\File\UploadedFile;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpFoundation\StreamedResponse;
  17. use Symfony\Component\HttpKernel\HttpKernelBrowser;
  18. use Symfony\Component\HttpKernel\Tests\Fixtures\TestClient;
  19. /**
  20. * @group time-sensitive
  21. */
  22. class HttpKernelBrowserTest extends TestCase
  23. {
  24. public function testDoRequest()
  25. {
  26. $client = new HttpKernelBrowser(new TestHttpKernel());
  27. $client->request('GET', '/');
  28. $this->assertEquals('Request: /', $client->getResponse()->getContent(), '->doRequest() uses the request handler to make the request');
  29. $this->assertInstanceOf(\Symfony\Component\BrowserKit\Request::class, $client->getInternalRequest());
  30. $this->assertInstanceOf(Request::class, $client->getRequest());
  31. $this->assertInstanceOf(\Symfony\Component\BrowserKit\Response::class, $client->getInternalResponse());
  32. $this->assertInstanceOf(Response::class, $client->getResponse());
  33. $client->request('GET', 'http://www.example.com/');
  34. $this->assertEquals('Request: /', $client->getResponse()->getContent(), '->doRequest() uses the request handler to make the request');
  35. $this->assertEquals('www.example.com', $client->getRequest()->getHost(), '->doRequest() uses the request handler to make the request');
  36. $client->request('GET', 'http://www.example.com/?parameter=http://example.com');
  37. $this->assertEquals('http://www.example.com/?parameter='.urlencode('http://example.com'), $client->getRequest()->getUri(), '->doRequest() uses the request handler to make the request');
  38. }
  39. public function testGetScript()
  40. {
  41. $client = new TestClient(new TestHttpKernel());
  42. $client->insulate();
  43. $client->request('GET', '/');
  44. $this->assertEquals('Request: /', $client->getResponse()->getContent(), '->getScript() returns a script that uses the request handler to make the request');
  45. }
  46. public function testFilterResponseConvertsCookies()
  47. {
  48. $client = new HttpKernelBrowser(new TestHttpKernel());
  49. $r = new \ReflectionObject($client);
  50. $m = $r->getMethod('filterResponse');
  51. $m->setAccessible(true);
  52. $response = new Response();
  53. $response->headers->setCookie($cookie1 = new Cookie('foo', 'bar', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true, false, null));
  54. $domResponse = $m->invoke($client, $response);
  55. $this->assertSame((string) $cookie1, $domResponse->getHeader('Set-Cookie'));
  56. $response = new Response();
  57. $response->headers->setCookie($cookie1 = new Cookie('foo', 'bar', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true, false, null));
  58. $response->headers->setCookie($cookie2 = new Cookie('foo1', 'bar1', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true, false, null));
  59. $domResponse = $m->invoke($client, $response);
  60. $this->assertSame((string) $cookie1, $domResponse->getHeader('Set-Cookie'));
  61. $this->assertSame([(string) $cookie1, (string) $cookie2], $domResponse->getHeader('Set-Cookie', false));
  62. }
  63. public function testFilterResponseSupportsStreamedResponses()
  64. {
  65. $client = new HttpKernelBrowser(new TestHttpKernel());
  66. $r = new \ReflectionObject($client);
  67. $m = $r->getMethod('filterResponse');
  68. $m->setAccessible(true);
  69. $response = new StreamedResponse(function () {
  70. echo 'foo';
  71. });
  72. $domResponse = $m->invoke($client, $response);
  73. $this->assertEquals('foo', $domResponse->getContent());
  74. }
  75. public function testUploadedFile()
  76. {
  77. $source = tempnam(sys_get_temp_dir(), 'source');
  78. file_put_contents($source, '1');
  79. $target = sys_get_temp_dir().'/sf.moved.file';
  80. @unlink($target);
  81. $kernel = new TestHttpKernel();
  82. $client = new HttpKernelBrowser($kernel);
  83. $files = [
  84. ['tmp_name' => $source, 'name' => 'original', 'type' => 'mime/original', 'size' => null, 'error' => \UPLOAD_ERR_OK],
  85. new UploadedFile($source, 'original', 'mime/original', \UPLOAD_ERR_OK, true),
  86. ];
  87. $file = null;
  88. foreach ($files as $file) {
  89. $client->request('POST', '/', [], ['foo' => $file]);
  90. $files = $client->getRequest()->files->all();
  91. $this->assertCount(1, $files);
  92. $file = $files['foo'];
  93. $this->assertEquals('original', $file->getClientOriginalName());
  94. $this->assertEquals('mime/original', $file->getClientMimeType());
  95. $this->assertEquals(1, $file->getSize());
  96. }
  97. $file->move(\dirname($target), basename($target));
  98. $this->assertFileExists($target);
  99. unlink($target);
  100. }
  101. public function testUploadedFileWhenNoFileSelected()
  102. {
  103. $kernel = new TestHttpKernel();
  104. $client = new HttpKernelBrowser($kernel);
  105. $file = ['tmp_name' => '', 'name' => '', 'type' => '', 'size' => 0, 'error' => \UPLOAD_ERR_NO_FILE];
  106. $client->request('POST', '/', [], ['foo' => $file]);
  107. $files = $client->getRequest()->files->all();
  108. $this->assertCount(1, $files);
  109. $this->assertNull($files['foo']);
  110. }
  111. public function testUploadedFileWhenSizeExceedsUploadMaxFileSize()
  112. {
  113. if (UploadedFile::getMaxFilesize() > \PHP_INT_MAX) {
  114. $this->markTestSkipped('Requires PHP_INT_MAX to be greater than "upload_max_filesize" and "post_max_size" ini settings');
  115. }
  116. $source = tempnam(sys_get_temp_dir(), 'source');
  117. $kernel = new TestHttpKernel();
  118. $client = new HttpKernelBrowser($kernel);
  119. $file = $this
  120. ->getMockBuilder(UploadedFile::class)
  121. ->setConstructorArgs([$source, 'original', 'mime/original', \UPLOAD_ERR_OK, true])
  122. ->onlyMethods(['getSize'])
  123. ->addMethods(['getClientSize'])
  124. ->getMock()
  125. ;
  126. /* should be modified when the getClientSize will be removed */
  127. $file->expects($this->any())
  128. ->method('getSize')
  129. ->willReturn(\PHP_INT_MAX)
  130. ;
  131. $file->expects($this->any())
  132. ->method('getClientSize')
  133. ->willReturn(\PHP_INT_MAX)
  134. ;
  135. $client->request('POST', '/', [], [$file]);
  136. $files = $client->getRequest()->files->all();
  137. $this->assertCount(1, $files);
  138. $file = $files[0];
  139. $this->assertFalse($file->isValid());
  140. $this->assertEquals(\UPLOAD_ERR_INI_SIZE, $file->getError());
  141. $this->assertEquals('mime/original', $file->getClientMimeType());
  142. $this->assertEquals('original', $file->getClientOriginalName());
  143. $this->assertEquals(0, $file->getSize());
  144. unlink($source);
  145. }
  146. public function testAcceptHeaderNotSet()
  147. {
  148. $client = new HttpKernelBrowser(new TestHttpKernel());
  149. $client->request('GET', '/');
  150. $this->assertFalse($client->getRequest()->headers->has('Accept'));
  151. $client->request('GET', '/', [], [], ['HTTP_ACCEPT' => 'application/ld+json']);
  152. $this->assertSame('application/ld+json', $client->getRequest()->headers->get('Accept'));
  153. }
  154. }