MockHandlerTest.php 6.8 KB

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