From bdcca2db0d300ff010524531845b3261f45d7fb3 Mon Sep 17 00:00:00 2001 From: Nyholm Date: Sun, 5 Aug 2018 00:45:03 +0200 Subject: [PATCH] Added more mock for tests --- tests/Api/EventTest.php | 22 ++++++ tests/Api/TestCase.php | 145 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 160 insertions(+), 7 deletions(-) create mode 100644 tests/Api/EventTest.php diff --git a/tests/Api/EventTest.php b/tests/Api/EventTest.php new file mode 100644 index 0000000..6b89546 --- /dev/null +++ b/tests/Api/EventTest.php @@ -0,0 +1,22 @@ +setRequestMethod('GET'); + $this->setRequestUri('/v3/example.com/events'); + + $api = $this->getApiMock(); + $api->get('example.com'); + } +} diff --git a/tests/Api/TestCase.php b/tests/Api/TestCase.php index 34f9832..31edc9b 100644 --- a/tests/Api/TestCase.php +++ b/tests/Api/TestCase.php @@ -9,7 +9,11 @@ namespace Mailgun\Tests\Api; +use GuzzleHttp\Psr7\Request; +use GuzzleHttp\Psr7\Response; use Mailgun\Mailgun; +use Mailgun\Model\ApiResponse; +use Psr\Http\Message\ResponseInterface; /** * @author Tobias Nyholm @@ -38,11 +42,21 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase */ protected $testDomain; + private $requestMethod; + private $requestUri; + private $requestHeaders; + private $requestBody; + + private $httpResponse; + private $hydratedResponse; + private $hydrateClass; + protected function setUp() { $this->apiPrivKey = getenv('MAILGUN_PRIV_KEY'); $this->apiPubKey = getenv('MAILGUN_PUB_KEY'); $this->testDomain = getenv('MAILGUN_DOMAIN'); + $this->reset(); } abstract protected function getApiClass(); @@ -54,30 +68,147 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase ->setMethods(['sendRequest']) ->getMock(); $httpClient - ->expects($this->any()) - ->method('sendRequest'); + ->method('sendRequest') + ->willReturn($this->httpResponse === null ? new Response() : $this->httpResponse); } if (null === $requestClient) { $requestClient = $this->getMockBuilder('Mailgun\RequestBuilder') ->setMethods(['create']) ->getMock(); + $requestClient->method('create') + ->with( + $this->callback([$this, 'validateRequestMethod']), + $this->callback([$this, 'validateRequestUri']), + $this->callback([$this, 'validateRequestHeaders']), + $this->callback([$this, 'validateRequestBody']) + ) + ->willReturn(new Request('GET', '/')); } - if (null === $hydrator) { + if (null === $hydrator && null === $this->httpResponse) { $hydrator = $this->getMockBuilder('Mailgun\Hydrator\Hydrator') ->setMethods(['hydrate']) ->getMock(); + + $hydratorModelClass = $this->hydrateClass; + $hydrateMethod = $hydrator->method('hydrate') + ->with( + $this->callback(function ($response) { + return $response instanceof ResponseInterface; + }), + $this->callback(function ($class) use ($hydratorModelClass) { + return $hydratorModelClass === null || $class === $hydratorModelClass; + })); + + if (null !== $this->hydratedResponse) { + $hydrateMethod->willReturn($this->hydratedResponse); + } } - return $this->getMockBuilder($this->getApiClass()) - ->setMethods(['httpGet', 'httpPost', 'httpPostRaw', 'httpDelete', 'httpPut']) - ->setConstructorArgs([$httpClient, $requestClient, $hydrator]) - ->getMock(); + $class = $this->getApiClass(); + return new $class($httpClient, $requestClient, $hydrator); + } + + public function validateRequestMethod($method) + { + return $this->requestMethod === null || $method === $this->requestMethod; + } + + public function validateRequestUri($uri) + { + return $this->requestUri === null || $uri === $this->requestUri; + } + + public function validateRequestHeaders($headers) + { + if (null === $this->requestHeaders) { + return true; + } + + return $this->requestHeaders == $headers; + } + + public function validateRequestBody($body) + { + return $this->requestMethod === null || $body === $this->requestBody; } protected function getMailgunClient() { return Mailgun::create($this->apiPrivKey); } + + protected function reset() + { + $this->httpResponse = null; + $this->hydratedResponse = null; + $this->requestMethod = null; + $this->requestUri = null; + $this->requestHeaders = null; + $this->requestBody = null; + $this->hydrateClass = null; + } + + /** + * Set a response that you want to client to respond with. + */ + public function setHttpResponse(ResponseInterface $httpResponse) + { + $this->httpResponse = $httpResponse; + } + + /** + * The data you want the hydrator to return. + * + * @param mixed $hydratedResponse + */ + public function setHydratedResponse($hydratedResponse) + { + $this->hydratedResponse = $hydratedResponse; + } + + /** + * Set request http method + * @param string $httpMethod + */ + public function setRequestMethod($httpMethod) + { + $this->requestMethod = $httpMethod; + } + + /** + * @param string $requestUri + */ + public function setRequestUri($requestUri) + { + $this->requestUri = $requestUri; + } + + /** + * @param array $requestHeaders + */ + public function setRequestHeaders(array $requestHeaders) + { + $this->requestHeaders = $requestHeaders; + } + + /** + * @param mixed $requestBody + */ + public function setRequestBody($requestBody) + { + $this->requestBody = $requestBody; + } + + /** + * The class we should hydrate to + * @param string $hydrateClass + */ + public function setHydrateClass($hydrateClass) + { + $this->hydrateClass = $hydrateClass; + } + + }