RequestExceptionTest.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?php
  2. namespace GuzzleHttp\Tests\Exception;
  3. use GuzzleHttp\Exception\ClientException;
  4. use GuzzleHttp\Exception\RequestException;
  5. use GuzzleHttp\Exception\ServerException;
  6. use GuzzleHttp\Psr7\Request;
  7. use GuzzleHttp\Psr7\Response;
  8. use GuzzleHttp\Psr7\Stream;
  9. use PHPUnit\Framework\TestCase;
  10. use Psr\Http\Client\NetworkExceptionInterface;
  11. use Psr\Http\Client\RequestExceptionInterface;
  12. /**
  13. * @covers \GuzzleHttp\Exception\RequestException
  14. */
  15. class RequestExceptionTest extends TestCase
  16. {
  17. public function testHasRequestAndResponse()
  18. {
  19. $req = new Request('GET', '/');
  20. $res = new Response(200);
  21. $e = new RequestException('foo', $req, $res);
  22. self::assertInstanceOf(RequestExceptionInterface::class, $e);
  23. self::assertNotInstanceOf(NetworkExceptionInterface::class, $e);
  24. self::assertSame($req, $e->getRequest());
  25. self::assertSame($res, $e->getResponse());
  26. self::assertTrue($e->hasResponse());
  27. self::assertSame('foo', $e->getMessage());
  28. }
  29. public function testCreatesGenerateException()
  30. {
  31. $e = RequestException::create(new Request('GET', '/'));
  32. self::assertSame('Error completing request', $e->getMessage());
  33. self::assertInstanceOf(RequestException::class, $e);
  34. }
  35. public function testCreatesClientErrorResponseException()
  36. {
  37. $e = RequestException::create(new Request('GET', '/'), new Response(400));
  38. self::assertStringContainsString(
  39. 'GET /',
  40. $e->getMessage()
  41. );
  42. self::assertStringContainsString(
  43. '400 Bad Request',
  44. $e->getMessage()
  45. );
  46. self::assertInstanceOf(ClientException::class, $e);
  47. }
  48. public function testCreatesServerErrorResponseException()
  49. {
  50. $e = RequestException::create(new Request('GET', '/'), new Response(500));
  51. self::assertStringContainsString(
  52. 'GET /',
  53. $e->getMessage()
  54. );
  55. self::assertStringContainsString(
  56. '500 Internal Server Error',
  57. $e->getMessage()
  58. );
  59. self::assertInstanceOf(ServerException::class, $e);
  60. }
  61. public function testCreatesGenericErrorResponseException()
  62. {
  63. $e = RequestException::create(new Request('GET', '/'), new Response(300));
  64. self::assertStringContainsString(
  65. 'GET /',
  66. $e->getMessage()
  67. );
  68. self::assertStringContainsString(
  69. '300 ',
  70. $e->getMessage()
  71. );
  72. self::assertInstanceOf(RequestException::class, $e);
  73. }
  74. public function testThrowsInvalidArgumentExceptionOnOutOfBoundsResponseCode()
  75. {
  76. $this->expectException(\InvalidArgumentException::class);
  77. $this->expectExceptionMessage('Status code must be an integer value between 1xx and 5xx.');
  78. throw RequestException::create(new Request('GET', '/'), new Response(600));
  79. }
  80. public function dataPrintableResponses()
  81. {
  82. return [
  83. ['You broke the test!'],
  84. ['<h1>zlomený zkouška</h1>'],
  85. ['{"tester": "Philépe Gonzalez"}'],
  86. ["<xml>\n\t<text>Your friendly test</text>\n</xml>"],
  87. ['document.body.write("here comes a test");'],
  88. ["body:before {\n\tcontent: 'test style';\n}"],
  89. ];
  90. }
  91. /**
  92. * @dataProvider dataPrintableResponses
  93. */
  94. public function testCreatesExceptionWithPrintableBodySummary($content)
  95. {
  96. $response = new Response(
  97. 500,
  98. [],
  99. $content
  100. );
  101. $e = RequestException::create(new Request('GET', '/'), $response);
  102. self::assertStringContainsString(
  103. $content,
  104. $e->getMessage()
  105. );
  106. self::assertInstanceOf(RequestException::class, $e);
  107. }
  108. public function testCreatesExceptionWithTruncatedSummary()
  109. {
  110. $content = \str_repeat('+', 121);
  111. $response = new Response(500, [], $content);
  112. $e = RequestException::create(new Request('GET', '/'), $response);
  113. $expected = \str_repeat('+', 120).' (truncated...)';
  114. self::assertStringContainsString($expected, $e->getMessage());
  115. }
  116. public function testExceptionMessageIgnoresEmptyBody()
  117. {
  118. $e = RequestException::create(new Request('GET', '/'), new Response(500));
  119. self::assertStringEndsWith('response', $e->getMessage());
  120. }
  121. public function testHasStatusCodeAsExceptionCode()
  122. {
  123. $e = RequestException::create(new Request('GET', '/'), new Response(442));
  124. self::assertSame(442, $e->getCode());
  125. }
  126. public function testWrapsRequestExceptions()
  127. {
  128. $e = new \Exception('foo');
  129. $r = new Request('GET', 'http://www.oo.com');
  130. $ex = RequestException::wrapException($r, $e);
  131. self::assertInstanceOf(RequestException::class, $ex);
  132. self::assertSame($e, $ex->getPrevious());
  133. }
  134. public function testDoesNotWrapExistingRequestExceptions()
  135. {
  136. $r = new Request('GET', 'http://www.oo.com');
  137. $e = new RequestException('foo', $r);
  138. $e2 = RequestException::wrapException($r, $e);
  139. self::assertSame($e, $e2);
  140. }
  141. public function testCanProvideHandlerContext()
  142. {
  143. $r = new Request('GET', 'http://www.oo.com');
  144. $e = new RequestException('foo', $r, null, null, ['bar' => 'baz']);
  145. self::assertSame(['bar' => 'baz'], $e->getHandlerContext());
  146. }
  147. public function testObfuscateUrlWithUsername()
  148. {
  149. $r = new Request('GET', 'http://username@www.oo.com');
  150. $e = RequestException::create($r, new Response(500));
  151. self::assertStringContainsString('http://username@www.oo.com', $e->getMessage());
  152. }
  153. public function testObfuscateUrlWithUsernameAndPassword()
  154. {
  155. $r = new Request('GET', 'http://user:password@www.oo.com');
  156. $e = RequestException::create($r, new Response(500));
  157. self::assertStringContainsString('http://user:***@www.oo.com', $e->getMessage());
  158. }
  159. }
  160. final class ReadSeekOnlyStream extends Stream
  161. {
  162. public function __construct()
  163. {
  164. parent::__construct(\fopen('php://memory', 'wb'));
  165. }
  166. public function isSeekable(): bool
  167. {
  168. return true;
  169. }
  170. public function isReadable(): bool
  171. {
  172. return false;
  173. }
  174. }