From 6d56fa6a0d3960b3d789133783fc97be5784d563 Mon Sep 17 00:00:00 2001 From: Temirkhan Date: Mon, 22 May 2017 15:47:11 +0400 Subject: [PATCH] Few test corrections to preview where it goes. (#358) * Few test corrections to preview where it goes. * Removed TODO. Fixed dependency --- tests/RequestBuilderTest.php | 147 ++++++++++++++++++++++++++++++----- 1 file changed, 129 insertions(+), 18 deletions(-) diff --git a/tests/RequestBuilderTest.php b/tests/RequestBuilderTest.php index b1f332a..114b81d 100644 --- a/tests/RequestBuilderTest.php +++ b/tests/RequestBuilderTest.php @@ -9,37 +9,148 @@ namespace Mailgun\Tests; +use Http\Message\MultipartStream\MultipartStreamBuilder; +use Http\Message\RequestFactory; use Mailgun\RequestBuilder; +use PHPUnit_Framework_MockObject_MockObject as MockObject; +use PHPUnit_Framework_TestCase; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\StreamInterface; -class RequestBuilderTest extends \PHPUnit_Framework_TestCase +class RequestBuilderTest extends PHPUnit_Framework_TestCase { + /** + * @var MockObject|RequestFactory + */ + private $requestFactory; + + /** + * @var RequestBuilder + */ + private $requestBuilder; + + /** + * Environment preset + */ + protected function setUp() + { + parent::setUp(); + + $this->requestFactory = $this->getMockBuilder(RequestFactory::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->requestBuilder = new RequestBuilder(); + //Everything but testing class is mock. Otherwise it wouldn't be unit testing + $this->requestBuilder->setRequestFactory($this->requestFactory); + } + + /** + * Environment reset + */ + protected function tearDown() + { + parent::tearDown(); + + $this->requestFactory = null; + $this->requestBuilder = null; + } + public function testCreateSimpleStream() { - $builder = new RequestBuilder(); - $request = $builder->create('GET', 'http://foo.bar', ['Content-Type' => 'application/json'], 'content'); + $this->requestFactory + ->expects($this->once()) + ->method('createRequest') + ->with( + $this->equalTo('GET'), + $this->equalTo('http://foo.bar'), + $this->callback(function (array $headers) { + $this->assertArrayHasKey('Content-Type', $headers); + $this->assertEquals('application/json', $headers['Content-Type']); - $body = $request->getBody()->__toString(); - $contentType = $request->getHeaderLine('Content-Type'); + return true; + }), + $this->equalTo('content') + ) + ->willReturn($request = $this->getMock(RequestInterface::class)); - $this->assertContains('content', $body); - $this->assertEquals('application/json', $contentType); + $result = $this->requestBuilder + ->create('GET', 'http://foo.bar', ['Content-Type' => 'application/json'], 'content'); + + $this->assertSame($request, $result); } public function testCreateMultipartStream() { - $item0 = ['content' => 'foobar', 'name' => 'username']; - $item1 = ['content' => 'Stockholm', 'name' => 'city']; + $multipartStreamBuilder = $this->createMultipartStreamBuilder(); - $builder = new RequestBuilder(); - $request = $builder->create('GET', 'http://foo.bar', ['Content-Type' => 'application/json'], [$item0, $item1]); + $item0 = ['content' => 'foobar', 'name' => 'username', 'some_stuff' => 'some value']; + $item1 = ['content' => 'Stockholm', 'name' => 'city', 'other_stuff' => 'other value']; + $body = [$item0, $item1]; - $body = $request->getBody()->__toString(); - $contentType = $request->getHeaderLine('Content-Type'); - $this->assertContains('foobar', $body); - $this->assertContains('username', $body); - $this->assertContains('Stockholm', $body); - $this->assertContains('city', $body); - $this->assertRegExp('|^multipart/form-data; boundary=(?P"?)[\w\Q\'()+,-./:=?\E]{1,69}(?P=quote)$|si', $contentType); + foreach ($body as $index => $item) { + $multipartStreamBuilder + ->expects($this->at($index)) + ->method('addResource') + ->with( + $this->equalTo($item['name']), + $this->equalTo($item['content']), + $this->callback(function (array $data) use ($item) { + unset($item['name'], $item['content']); + $this->assertEquals($item, $data); + + return true; + }) + ) + ->willReturn($multipartStreamBuilder); + } + + $multipartStreamBuilder + ->expects($this->once()) + ->method('build') + ->willReturn($stream = $this->getMock(StreamInterface::class)); + + $multipartStreamBuilder + ->expects($this->once()) + ->method('getBoundary') + ->willReturn('some boundary'); + + $multipartStreamBuilder + ->expects($this->once()) + ->method('reset') + ->willReturn($multipartStreamBuilder); + + $this->requestFactory + ->expects($this->once()) + ->method('createRequest') + ->with( + $this->equalTo('GET'), + $this->equalTo('http://foo.bar'), + $this->callback(function (array $headers) { + $this->assertArrayHasKey('Content-Type', $headers); + $this->assertEquals('multipart/form-data; boundary="some boundary"', $headers['Content-Type']); + + return true; + }), + $this->equalTo($stream) + ) + ->willReturn($request = $this->getMock(RequestInterface::class)); + + $this->requestBuilder->setMultipartStreamBuilder($multipartStreamBuilder); + $result = $this->requestBuilder + ->create('GET', 'http://foo.bar', ['Content-Type' => 'application/json'], [$item0, $item1]); + + $this->assertSame($request, $result); + } + + /** + * Creates multipart stream builder + * + * @return MockObject|MultipartStreamBuilder + */ + private function createMultipartStreamBuilder() + { + return $this->getMockBuilder(MultipartStreamBuilder::class)->disableOriginalConstructor()->getMock(); } }