ClientTest.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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\HttpKernel\Client;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\HttpFoundation\StreamedResponse;
  15. use Symfony\Component\HttpFoundation\Cookie;
  16. use Symfony\Component\HttpFoundation\File\UploadedFile;
  17. use Symfony\Component\HttpKernel\Tests\Fixtures\TestClient;
  18. /**
  19. * @group time-sensitive
  20. */
  21. class ClientTest extends TestCase
  22. {
  23. public function testDoRequest()
  24. {
  25. $client = new Client(new TestHttpKernel());
  26. $client->request('GET', '/');
  27. $this->assertEquals('Request: /', $client->getResponse()->getContent(), '->doRequest() uses the request handler to make the request');
  28. $this->assertInstanceOf('Symfony\Component\BrowserKit\Request', $client->getInternalRequest());
  29. $this->assertInstanceOf('Symfony\Component\HttpFoundation\Request', $client->getRequest());
  30. $this->assertInstanceOf('Symfony\Component\BrowserKit\Response', $client->getInternalResponse());
  31. $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $client->getResponse());
  32. $client->request('GET', 'http://www.example.com/');
  33. $this->assertEquals('Request: /', $client->getResponse()->getContent(), '->doRequest() uses the request handler to make the request');
  34. $this->assertEquals('www.example.com', $client->getRequest()->getHost(), '->doRequest() uses the request handler to make the request');
  35. $client->request('GET', 'http://www.example.com/?parameter=http://google.com');
  36. $this->assertEquals('http://www.example.com/?parameter='.urlencode('http://google.com'), $client->getRequest()->getUri(), '->doRequest() uses the request handler to make the request');
  37. }
  38. public function testGetScript()
  39. {
  40. $client = new TestClient(new TestHttpKernel());
  41. $client->insulate();
  42. $client->request('GET', '/');
  43. $this->assertEquals('Request: /', $client->getResponse()->getContent(), '->getScript() returns a script that uses the request handler to make the request');
  44. }
  45. public function testFilterResponseConvertsCookies()
  46. {
  47. $client = new Client(new TestHttpKernel());
  48. $r = new \ReflectionObject($client);
  49. $m = $r->getMethod('filterResponse');
  50. $m->setAccessible(true);
  51. $expected31 = array(
  52. 'foo=bar; expires=Sun, 15 Feb 2009 20:00:00 GMT; domain=http://example.com; path=/foo; secure; httponly',
  53. 'foo1=bar1; expires=Sun, 15 Feb 2009 20:00:00 GMT; domain=http://example.com; path=/foo; secure; httponly',
  54. );
  55. $expected33 = array(
  56. 'foo=bar; expires=Sun, 15-Feb-2009 20:00:00 GMT; max-age='.(strtotime('Sun, 15-Feb-2009 20:00:00 GMT') - time()).'; path=/foo; domain=http://example.com; secure; httponly',
  57. 'foo1=bar1; expires=Sun, 15-Feb-2009 20:00:00 GMT; max-age='.(strtotime('Sun, 15-Feb-2009 20:00:00 GMT') - time()).'; path=/foo; domain=http://example.com; secure; httponly',
  58. );
  59. $response = new Response();
  60. $response->headers->setCookie(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));
  61. $domResponse = $m->invoke($client, $response);
  62. try {
  63. $this->assertEquals($expected31[0], $domResponse->getHeader('Set-Cookie'));
  64. } catch (\PHPUnit\Framework\ExpectationFailedException $e) {
  65. $this->assertEquals($expected33[0], $domResponse->getHeader('Set-Cookie'));
  66. } catch (\PHPUnit_Framework_ExpectationFailedException $e) {
  67. $this->assertEquals($expected33[0], $domResponse->getHeader('Set-Cookie'));
  68. }
  69. $response = new Response();
  70. $response->headers->setCookie(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));
  71. $response->headers->setCookie(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));
  72. $domResponse = $m->invoke($client, $response);
  73. try {
  74. $this->assertEquals($expected31[0], $domResponse->getHeader('Set-Cookie'));
  75. } catch (\PHPUnit\Framework\ExpectationFailedException $e) {
  76. $this->assertEquals($expected33[0], $domResponse->getHeader('Set-Cookie'));
  77. } catch (\PHPUnit_Framework_ExpectationFailedException $e) {
  78. $this->assertEquals($expected33[0], $domResponse->getHeader('Set-Cookie'));
  79. }
  80. try {
  81. $this->assertEquals($expected31, $domResponse->getHeader('Set-Cookie', false));
  82. } catch (\PHPUnit\Framework\ExpectationFailedException $e) {
  83. $this->assertEquals($expected33, $domResponse->getHeader('Set-Cookie', false));
  84. } catch (\PHPUnit_Framework_ExpectationFailedException $e) {
  85. $this->assertEquals($expected33, $domResponse->getHeader('Set-Cookie', false));
  86. }
  87. }
  88. public function testFilterResponseSupportsStreamedResponses()
  89. {
  90. $client = new Client(new TestHttpKernel());
  91. $r = new \ReflectionObject($client);
  92. $m = $r->getMethod('filterResponse');
  93. $m->setAccessible(true);
  94. $response = new StreamedResponse(function () {
  95. echo 'foo';
  96. });
  97. $domResponse = $m->invoke($client, $response);
  98. $this->assertEquals('foo', $domResponse->getContent());
  99. }
  100. public function testUploadedFile()
  101. {
  102. $source = tempnam(sys_get_temp_dir(), 'source');
  103. $target = sys_get_temp_dir().'/sf.moved.file';
  104. @unlink($target);
  105. $kernel = new TestHttpKernel();
  106. $client = new Client($kernel);
  107. $files = array(
  108. array('tmp_name' => $source, 'name' => 'original', 'type' => 'mime/original', 'size' => 123, 'error' => UPLOAD_ERR_OK),
  109. new UploadedFile($source, 'original', 'mime/original', 123, UPLOAD_ERR_OK, true),
  110. );
  111. $file = null;
  112. foreach ($files as $file) {
  113. $client->request('POST', '/', array(), array('foo' => $file));
  114. $files = $client->getRequest()->files->all();
  115. $this->assertCount(1, $files);
  116. $file = $files['foo'];
  117. $this->assertEquals('original', $file->getClientOriginalName());
  118. $this->assertEquals('mime/original', $file->getClientMimeType());
  119. $this->assertEquals('123', $file->getClientSize());
  120. $this->assertTrue($file->isValid());
  121. }
  122. $file->move(dirname($target), basename($target));
  123. $this->assertFileExists($target);
  124. unlink($target);
  125. }
  126. public function testUploadedFileWhenNoFileSelected()
  127. {
  128. $kernel = new TestHttpKernel();
  129. $client = new Client($kernel);
  130. $file = array('tmp_name' => '', 'name' => '', 'type' => '', 'size' => 0, 'error' => UPLOAD_ERR_NO_FILE);
  131. $client->request('POST', '/', array(), array('foo' => $file));
  132. $files = $client->getRequest()->files->all();
  133. $this->assertCount(1, $files);
  134. $this->assertNull($files['foo']);
  135. }
  136. public function testUploadedFileWhenSizeExceedsUploadMaxFileSize()
  137. {
  138. $source = tempnam(sys_get_temp_dir(), 'source');
  139. $kernel = new TestHttpKernel();
  140. $client = new Client($kernel);
  141. $file = $this
  142. ->getMockBuilder('Symfony\Component\HttpFoundation\File\UploadedFile')
  143. ->setConstructorArgs(array($source, 'original', 'mime/original', 123, UPLOAD_ERR_OK, true))
  144. ->setMethods(array('getSize'))
  145. ->getMock()
  146. ;
  147. $file->expects($this->once())
  148. ->method('getSize')
  149. ->will($this->returnValue(INF))
  150. ;
  151. $client->request('POST', '/', array(), array($file));
  152. $files = $client->getRequest()->files->all();
  153. $this->assertCount(1, $files);
  154. $file = $files[0];
  155. $this->assertFalse($file->isValid());
  156. $this->assertEquals(UPLOAD_ERR_INI_SIZE, $file->getError());
  157. $this->assertEquals('mime/original', $file->getClientMimeType());
  158. $this->assertEquals('original', $file->getClientOriginalName());
  159. $this->assertEquals(0, $file->getClientSize());
  160. unlink($source);
  161. }
  162. }