From 78bb8c142006c07da7ed81094fa0d6cc221a9530 Mon Sep 17 00:00:00 2001 From: Michael Dowling Date: Sun, 23 Mar 2014 15:52:24 -0700 Subject: [PATCH] Ensuring the mock adapter reads the request body and emits a headers event --- src/Adapter/MockAdapter.php | 8 ++++++++ tests/Adapter/MockAdapterTest.php | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/Adapter/MockAdapter.php b/src/Adapter/MockAdapter.php index fc75b01e..3e8020e6 100644 --- a/src/Adapter/MockAdapter.php +++ b/src/Adapter/MockAdapter.php @@ -37,13 +37,21 @@ class MockAdapter implements AdapterInterface { RequestEvents::emitBefore($transaction); if (!$transaction->getResponse()) { + + // Read the request body if it is present + if ($transaction->getRequest()->getBody()) { + $transaction->getRequest()->getBody()->__toString(); + } + $response = is_callable($this->response) ? call_user_func($this->response, $transaction) : $this->response; if (!$response instanceof ResponseInterface) { throw new \RuntimeException('Invalid mocked response'); } + $transaction->setResponse($response); + RequestEvents::emitHeaders($transaction); RequestEvents::emitComplete($transaction); } diff --git a/tests/Adapter/MockAdapterTest.php b/tests/Adapter/MockAdapterTest.php index 6925a036..07dbe0d5 100644 --- a/tests/Adapter/MockAdapterTest.php +++ b/tests/Adapter/MockAdapterTest.php @@ -11,6 +11,7 @@ use GuzzleHttp\Event\ErrorEvent; use GuzzleHttp\Exception\RequestException; use GuzzleHttp\Message\Request; use GuzzleHttp\Message\Response; +use GuzzleHttp\Stream; /** * @covers GuzzleHttp\Adapter\MockAdapter @@ -76,4 +77,27 @@ class MockAdapterTest extends \PHPUnit_Framework_TestCase }); $m->send(new Transaction(new Client(), $request)); } + + public function testReadsRequestBody() + { + $response = new Response(200); + $m = new MockAdapter($response); + $m->setResponse($response); + $body = Stream\create('foo'); + $request = new Request('PUT', 'http://httpbin.org/put', [], $body); + $this->assertSame($response, $m->send(new Transaction(new Client(), $request))); + $this->assertEquals(3, $body->tell()); + } + + public function testEmitsHeadersEvent() + { + $m = new MockAdapter(new Response(404)); + $request = new Request('GET', 'http://httbin.org'); + $called = false; + $request->getEmitter()->once('headers', function () use (&$called) { + $called = true; + }); + $m->send(new Transaction(new Client(), $request)); + $this->assertTrue($called); + } }