MockHandlerTest.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. <?php
  2. namespace GuzzleHttp\Test\Handler;
  3. use GuzzleHttp\Exception\BadResponseException;
  4. use GuzzleHttp\Exception\RequestException;
  5. use GuzzleHttp\Handler\MockHandler;
  6. use GuzzleHttp\Psr7\Request;
  7. use GuzzleHttp\Psr7\Response;
  8. use GuzzleHttp\Psr7\Stream;
  9. use GuzzleHttp\TransferStats;
  10. use PHPUnit\Framework\TestCase;
  11. /**
  12. * @covers \GuzzleHttp\Handler\MockHandler
  13. */
  14. class MockHandlerTest extends TestCase
  15. {
  16. public function testReturnsMockResponse()
  17. {
  18. $res = new Response();
  19. $mock = new MockHandler([$res]);
  20. $request = new Request('GET', 'http://example.com');
  21. $p = $mock($request, []);
  22. self::assertSame($res, $p->wait());
  23. }
  24. public function testIsCountable()
  25. {
  26. $res = new Response();
  27. $mock = new MockHandler([$res, $res]);
  28. self::assertCount(2, $mock);
  29. }
  30. public function testEmptyHandlerIsCountable()
  31. {
  32. self::assertCount(0, new MockHandler());
  33. }
  34. public function testEnsuresEachAppendOnCreationIsValid()
  35. {
  36. $this->expectException(\TypeError::class);
  37. new MockHandler(['a']);
  38. }
  39. public function testEnsuresEachAppendIsValid()
  40. {
  41. $mock = new MockHandler();
  42. $this->expectException(\TypeError::class);
  43. $mock->append(['a']);
  44. }
  45. public function testCanQueueExceptions()
  46. {
  47. $e = new \Exception('a');
  48. $mock = new MockHandler([$e]);
  49. $request = new Request('GET', 'http://example.com');
  50. $p = $mock($request, []);
  51. try {
  52. $p->wait();
  53. self::fail();
  54. } catch (\Exception $e2) {
  55. self::assertSame($e, $e2);
  56. }
  57. }
  58. public function testCanGetLastRequestAndOptions()
  59. {
  60. $res = new Response();
  61. $mock = new MockHandler([$res]);
  62. $request = new Request('GET', 'http://example.com');
  63. $mock($request, ['foo' => 'bar']);
  64. self::assertSame($request, $mock->getLastRequest());
  65. self::assertSame(['foo' => 'bar'], $mock->getLastOptions());
  66. }
  67. public function testSinkFilename()
  68. {
  69. $filename = \sys_get_temp_dir().'/mock_test_'.\uniqid();
  70. $res = new Response(200, [], 'TEST CONTENT');
  71. $mock = new MockHandler([$res]);
  72. $request = new Request('GET', '/');
  73. $p = $mock($request, ['sink' => $filename]);
  74. $p->wait();
  75. self::assertFileExists($filename);
  76. self::assertStringEqualsFile($filename, 'TEST CONTENT');
  77. \unlink($filename);
  78. }
  79. public function testSinkResource()
  80. {
  81. $file = \tmpfile();
  82. $meta = \stream_get_meta_data($file);
  83. $res = new Response(200, [], 'TEST CONTENT');
  84. $mock = new MockHandler([$res]);
  85. $request = new Request('GET', '/');
  86. $p = $mock($request, ['sink' => $file]);
  87. $p->wait();
  88. self::assertFileExists($meta['uri']);
  89. self::assertStringEqualsFile($meta['uri'], 'TEST CONTENT');
  90. }
  91. public function testSinkStream()
  92. {
  93. $stream = new Stream(\tmpfile());
  94. $res = new Response(200, [], 'TEST CONTENT');
  95. $mock = new MockHandler([$res]);
  96. $request = new Request('GET', '/');
  97. $p = $mock($request, ['sink' => $stream]);
  98. $p->wait();
  99. self::assertFileExists($stream->getMetadata('uri'));
  100. self::assertStringEqualsFile($stream->getMetadata('uri'), 'TEST CONTENT');
  101. }
  102. public function testCanEnqueueCallables()
  103. {
  104. $r = new Response();
  105. $fn = static function ($req, $o) use ($r) {
  106. return $r;
  107. };
  108. $mock = new MockHandler([$fn]);
  109. $request = new Request('GET', 'http://example.com');
  110. $p = $mock($request, ['foo' => 'bar']);
  111. self::assertSame($r, $p->wait());
  112. }
  113. public function testEnsuresOnHeadersIsCallable()
  114. {
  115. $res = new Response();
  116. $mock = new MockHandler([$res]);
  117. $request = new Request('GET', 'http://example.com');
  118. $this->expectException(\InvalidArgumentException::class);
  119. $mock($request, ['on_headers' => 'error!']);
  120. }
  121. public function testRejectsPromiseWhenOnHeadersFails()
  122. {
  123. $res = new Response();
  124. $mock = new MockHandler([$res]);
  125. $request = new Request('GET', 'http://example.com');
  126. $promise = $mock($request, [
  127. 'on_headers' => static function () {
  128. throw new \Exception('test');
  129. },
  130. ]);
  131. $this->expectException(RequestException::class);
  132. $this->expectExceptionMessage('An error was encountered during the on_headers event');
  133. $promise->wait();
  134. }
  135. public function testInvokesOnFulfilled()
  136. {
  137. $res = new Response();
  138. $mock = new MockHandler([$res], static function ($v) use (&$c) {
  139. $c = $v;
  140. });
  141. $request = new Request('GET', 'http://example.com');
  142. $mock($request, [])->wait();
  143. self::assertSame($res, $c);
  144. }
  145. public function testInvokesOnRejected()
  146. {
  147. $e = new \Exception('a');
  148. $c = null;
  149. $mock = new MockHandler([$e], null, static function ($v) use (&$c) {
  150. $c = $v;
  151. });
  152. $request = new Request('GET', 'http://example.com');
  153. $mock($request, [])->wait(false);
  154. self::assertSame($e, $c);
  155. }
  156. public function testThrowsWhenNoMoreResponses()
  157. {
  158. $mock = new MockHandler();
  159. $request = new Request('GET', 'http://example.com');
  160. $this->expectException(\OutOfBoundsException::class);
  161. $mock($request, []);
  162. }
  163. public function testCanCreateWithDefaultMiddleware()
  164. {
  165. $r = new Response(500);
  166. $mock = MockHandler::createWithMiddleware([$r]);
  167. $request = new Request('GET', 'http://example.com');
  168. $this->expectException(BadResponseException::class);
  169. $mock($request, ['http_errors' => true])->wait();
  170. }
  171. public function testInvokesOnStatsFunctionForResponse()
  172. {
  173. $res = new Response();
  174. $mock = new MockHandler([$res]);
  175. $request = new Request('GET', 'http://example.com');
  176. /** @var TransferStats|null $stats */
  177. $stats = null;
  178. $onStats = static function (TransferStats $s) use (&$stats) {
  179. $stats = $s;
  180. };
  181. $p = $mock($request, ['on_stats' => $onStats]);
  182. $p->wait();
  183. self::assertSame($res, $stats->getResponse());
  184. self::assertSame($request, $stats->getRequest());
  185. }
  186. public function testInvokesOnStatsFunctionForError()
  187. {
  188. $e = new \Exception('a');
  189. $c = null;
  190. $mock = new MockHandler([$e], null, static function ($v) use (&$c) {
  191. $c = $v;
  192. });
  193. $request = new Request('GET', 'http://example.com');
  194. /** @var TransferStats|null $stats */
  195. $stats = null;
  196. $onStats = static function (TransferStats $s) use (&$stats) {
  197. $stats = $s;
  198. };
  199. $mock($request, ['on_stats' => $onStats])->wait(false);
  200. self::assertSame($e, $stats->getHandlerErrorData());
  201. self::assertNull($stats->getResponse());
  202. self::assertSame($request, $stats->getRequest());
  203. }
  204. public function testTransferTime()
  205. {
  206. $e = new \Exception('a');
  207. $c = null;
  208. $mock = new MockHandler([$e], null, static function ($v) use (&$c) {
  209. $c = $v;
  210. });
  211. $request = new Request('GET', 'http://example.com');
  212. $stats = null;
  213. $onStats = static function (TransferStats $s) use (&$stats) {
  214. $stats = $s;
  215. };
  216. $mock($request, ['on_stats' => $onStats, 'transfer_time' => 0.4])->wait(false);
  217. self::assertEquals(0.4, $stats->getTransferTime());
  218. }
  219. public function testResetQueue()
  220. {
  221. $mock = new MockHandler([new Response(200), new Response(204)]);
  222. self::assertCount(2, $mock);
  223. $mock->reset();
  224. self::assertEmpty($mock);
  225. $mock->append(new Response(500));
  226. self::assertCount(1, $mock);
  227. }
  228. }