123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- <?php
- namespace GuzzleHttp\Test\Handler;
- use GuzzleHttp\Exception\BadResponseException;
- use GuzzleHttp\Exception\RequestException;
- use GuzzleHttp\Handler\MockHandler;
- use GuzzleHttp\Psr7\Request;
- use GuzzleHttp\Psr7\Response;
- use GuzzleHttp\Psr7\Stream;
- use GuzzleHttp\TransferStats;
- use PHPUnit\Framework\TestCase;
- /**
- * @covers \GuzzleHttp\Handler\MockHandler
- */
- class MockHandlerTest extends TestCase
- {
- public function testReturnsMockResponse()
- {
- $res = new Response();
- $mock = new MockHandler([$res]);
- $request = new Request('GET', 'http://example.com');
- $p = $mock($request, []);
- self::assertSame($res, $p->wait());
- }
- public function testIsCountable()
- {
- $res = new Response();
- $mock = new MockHandler([$res, $res]);
- self::assertCount(2, $mock);
- }
- public function testEmptyHandlerIsCountable()
- {
- self::assertCount(0, new MockHandler());
- }
- public function testEnsuresEachAppendOnCreationIsValid()
- {
- $this->expectException(\TypeError::class);
- new MockHandler(['a']);
- }
- public function testEnsuresEachAppendIsValid()
- {
- $mock = new MockHandler();
- $this->expectException(\TypeError::class);
- $mock->append(['a']);
- }
- public function testCanQueueExceptions()
- {
- $e = new \Exception('a');
- $mock = new MockHandler([$e]);
- $request = new Request('GET', 'http://example.com');
- $p = $mock($request, []);
- try {
- $p->wait();
- self::fail();
- } catch (\Exception $e2) {
- self::assertSame($e, $e2);
- }
- }
- public function testCanGetLastRequestAndOptions()
- {
- $res = new Response();
- $mock = new MockHandler([$res]);
- $request = new Request('GET', 'http://example.com');
- $mock($request, ['foo' => 'bar']);
- self::assertSame($request, $mock->getLastRequest());
- self::assertSame(['foo' => 'bar'], $mock->getLastOptions());
- }
- public function testSinkFilename()
- {
- $filename = \sys_get_temp_dir().'/mock_test_'.\uniqid();
- $res = new Response(200, [], 'TEST CONTENT');
- $mock = new MockHandler([$res]);
- $request = new Request('GET', '/');
- $p = $mock($request, ['sink' => $filename]);
- $p->wait();
- self::assertFileExists($filename);
- self::assertStringEqualsFile($filename, 'TEST CONTENT');
- \unlink($filename);
- }
- public function testSinkResource()
- {
- $file = \tmpfile();
- $meta = \stream_get_meta_data($file);
- $res = new Response(200, [], 'TEST CONTENT');
- $mock = new MockHandler([$res]);
- $request = new Request('GET', '/');
- $p = $mock($request, ['sink' => $file]);
- $p->wait();
- self::assertFileExists($meta['uri']);
- self::assertStringEqualsFile($meta['uri'], 'TEST CONTENT');
- }
- public function testSinkStream()
- {
- $stream = new Stream(\tmpfile());
- $res = new Response(200, [], 'TEST CONTENT');
- $mock = new MockHandler([$res]);
- $request = new Request('GET', '/');
- $p = $mock($request, ['sink' => $stream]);
- $p->wait();
- self::assertFileExists($stream->getMetadata('uri'));
- self::assertStringEqualsFile($stream->getMetadata('uri'), 'TEST CONTENT');
- }
- public function testCanEnqueueCallables()
- {
- $r = new Response();
- $fn = static function ($req, $o) use ($r) {
- return $r;
- };
- $mock = new MockHandler([$fn]);
- $request = new Request('GET', 'http://example.com');
- $p = $mock($request, ['foo' => 'bar']);
- self::assertSame($r, $p->wait());
- }
- public function testEnsuresOnHeadersIsCallable()
- {
- $res = new Response();
- $mock = new MockHandler([$res]);
- $request = new Request('GET', 'http://example.com');
- $this->expectException(\InvalidArgumentException::class);
- $mock($request, ['on_headers' => 'error!']);
- }
- public function testRejectsPromiseWhenOnHeadersFails()
- {
- $res = new Response();
- $mock = new MockHandler([$res]);
- $request = new Request('GET', 'http://example.com');
- $promise = $mock($request, [
- 'on_headers' => static function () {
- throw new \Exception('test');
- },
- ]);
- $this->expectException(RequestException::class);
- $this->expectExceptionMessage('An error was encountered during the on_headers event');
- $promise->wait();
- }
- public function testInvokesOnFulfilled()
- {
- $res = new Response();
- $mock = new MockHandler([$res], static function ($v) use (&$c) {
- $c = $v;
- });
- $request = new Request('GET', 'http://example.com');
- $mock($request, [])->wait();
- self::assertSame($res, $c);
- }
- public function testInvokesOnRejected()
- {
- $e = new \Exception('a');
- $c = null;
- $mock = new MockHandler([$e], null, static function ($v) use (&$c) {
- $c = $v;
- });
- $request = new Request('GET', 'http://example.com');
- $mock($request, [])->wait(false);
- self::assertSame($e, $c);
- }
- public function testThrowsWhenNoMoreResponses()
- {
- $mock = new MockHandler();
- $request = new Request('GET', 'http://example.com');
- $this->expectException(\OutOfBoundsException::class);
- $mock($request, []);
- }
- public function testCanCreateWithDefaultMiddleware()
- {
- $r = new Response(500);
- $mock = MockHandler::createWithMiddleware([$r]);
- $request = new Request('GET', 'http://example.com');
- $this->expectException(BadResponseException::class);
- $mock($request, ['http_errors' => true])->wait();
- }
- public function testInvokesOnStatsFunctionForResponse()
- {
- $res = new Response();
- $mock = new MockHandler([$res]);
- $request = new Request('GET', 'http://example.com');
- /** @var TransferStats|null $stats */
- $stats = null;
- $onStats = static function (TransferStats $s) use (&$stats) {
- $stats = $s;
- };
- $p = $mock($request, ['on_stats' => $onStats]);
- $p->wait();
- self::assertSame($res, $stats->getResponse());
- self::assertSame($request, $stats->getRequest());
- }
- public function testInvokesOnStatsFunctionForError()
- {
- $e = new \Exception('a');
- $c = null;
- $mock = new MockHandler([$e], null, static function ($v) use (&$c) {
- $c = $v;
- });
- $request = new Request('GET', 'http://example.com');
- /** @var TransferStats|null $stats */
- $stats = null;
- $onStats = static function (TransferStats $s) use (&$stats) {
- $stats = $s;
- };
- $mock($request, ['on_stats' => $onStats])->wait(false);
- self::assertSame($e, $stats->getHandlerErrorData());
- self::assertNull($stats->getResponse());
- self::assertSame($request, $stats->getRequest());
- }
- public function testTransferTime()
- {
- $e = new \Exception('a');
- $c = null;
- $mock = new MockHandler([$e], null, static function ($v) use (&$c) {
- $c = $v;
- });
- $request = new Request('GET', 'http://example.com');
- $stats = null;
- $onStats = static function (TransferStats $s) use (&$stats) {
- $stats = $s;
- };
- $mock($request, ['on_stats' => $onStats, 'transfer_time' => 0.4])->wait(false);
- self::assertEquals(0.4, $stats->getTransferTime());
- }
- public function testResetQueue()
- {
- $mock = new MockHandler([new Response(200), new Response(204)]);
- self::assertCount(2, $mock);
- $mock->reset();
- self::assertEmpty($mock);
- $mock->append(new Response(500));
- self::assertCount(1, $mock);
- }
- }
|