diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/unit/APIResourceTest.php | 255 | ||||
-rw-r--r-- | test/unit/SparkPostTest.php | 122 | ||||
-rw-r--r-- | test/unit/TestUtils/ClassUtils.php | 56 | ||||
-rw-r--r-- | test/unit/TransmissionTest.php | 218 | ||||
-rw-r--r-- | test/unit/bootstrap.php | 2 |
5 files changed, 332 insertions, 321 deletions
diff --git a/test/unit/APIResourceTest.php b/test/unit/APIResourceTest.php index fc85fa3..132d6e2 100644 --- a/test/unit/APIResourceTest.php +++ b/test/unit/APIResourceTest.php @@ -1,144 +1,135 @@ <?php namespace SparkPost\Test; - use SparkPost\APIResource; -use SparkPost\SparkPost; -use Guzzle\Plugin\Mock\MockPlugin; -use Guzzle\Http\Message\Response; - +use SparkPost\Test\TestUtils\ClassUtils; +use \Mockery; class APIResourceTest extends \PHPUnit_Framework_TestCase { - - private $client = null; - - /** - * Allows access to private methods - * - * This is needed to mock the GuzzleHttp\Client responses - * - * @param string $name - * @return ReflectionMethod - */ - private static function getMethod($name) { - $class = new \ReflectionClass('\SparkPost\APIResource'); - $method = $class->getMethod($name); - $method->setAccessible(true); - return $method; - } - + + private static $utils; + private $adapterMock; + private $resource; + + private function getExceptionMock($statusCode) { + $exception = new \Ivory\HttpAdapter\HttpAdapterException(); + $response = Mockery::mock('Ivory\HttpAdapter\Message\ResponseInterface'); + $response->shouldReceive('getStatusCode')->andReturn($statusCode); + $exception->setResponse($response); + return $exception; + } + /** * (non-PHPdoc) * @before * @see PHPUnit_Framework_TestCase::setUp() */ public function setUp() { - SparkPost::setConfig(array('key'=>'blah')); - $this->client = self::getMethod('getHttpClient')->invoke(null); //so we can bootstrap api responses - APIResource::$endpoint = 'someValidEndpoint'; // when using APIResource directly an endpoint needs to be set. - } - - /** - * @desc Ensures that the configuration class is not instantiable. - */ - public function testConstructorCannotBeCalled() { - $class = new \ReflectionClass('\SparkPost\Transmission'); - $this->assertFalse($class->isInstantiable()); - } - - /** - * @desc tests happy path - */ - public function testFetchWithGoodResponse() { - $mock = new MockPlugin(); - $mock->addResponse(new Response(200, array(), '{"results":[{"test":"This is a test"}, {"test":"two"}]}')); - $this->client->addSubscriber($mock); - $this->assertEquals(array("results"=>array(array('test'=>'This is a test'), array('test'=>'two'))), APIResource::fetchResource()); - } - - /** - * @desc tests happy path - */ - public function testDeleteWithGoodResponse() { - $mock = new MockPlugin(); - $mock->addResponse(new Response(200, array(), '{"results":[{"test":"This is a test"}]}')); - $this->client->addSubscriber($mock); - - $this->assertEquals(array("results"=>array(array('test'=>'This is a test'))), APIResource::deleteResource('someId')); - } - - /** - * @desc tests 404 bad response - * @expectedException Exception - * @expectedExceptionMessage The specified resource does not exist - */ - public function testFetchWith404Response() { - $mock = new MockPlugin(); - $mock->addResponse(new Response(404, array())); - $this->client->addSubscriber($mock); - APIResource::fetchResource('someId'); - } - - /** - * @desc tests unknown bad response - * @expectedException Exception - * @expectedExceptionMessage Received bad response from SomeValidEndpoint API: 400 - */ - public function testFetchWithOtherBadResponse() { - $mock = new MockPlugin(); - $mock->addResponse(new Response(400, array())); - $this->client->addSubscriber($mock); - APIResource::fetchResource('someId'); - } - - /** - * @desc tests bad response - * @expectedException Exception - * @expectedExceptionMessageRegExp /Unable to contact SomeValidEndpoint API:.* / - */ - public function testFetchForCatchAllException() { - $mock = new MockPlugin(); - $mock->addResponse(new Response(500)); - $this->client->addSubscriber($mock); - APIResource::fetchResource('someId'); - } - - /** - * @desc tests happy path - */ - public function testSuccessfulSend() { - $body = array("result"=>array("transmission_id"=>"11668787484950529"), "status"=>array("message"=> "ok","code"=> "1000")); - $mock = new MockPlugin(); - $mock->addResponse(new Response(200, array(), json_encode($body))); - $this->client->addSubscriber($mock); - - - $this->assertEquals($body, APIResource::sendRequest(array('text'=>'awesome email'))); - } - - /** - * @desc tests bad response - * @expectedException Exception - * @expectedExceptionMessage ["This is a fake error"] - */ - public function testSendFor400Exception() { - $body = array('errors'=>array('This is a fake error')); - $mock = new MockPlugin(); - $mock->addResponse(new Response(400, array(), json_encode($body))); - $this->client->addSubscriber($mock); - APIResource::sendRequest(array('text'=>'awesome email')); - } - - - /** - * @desc tests bad response - * @expectedException Exception - * @expectedExceptionMessageRegExp /Unable to contact SomeValidEndpoint API:.* / - */ - public function testSendForCatchAllException() { - $mock = new MockPlugin(); - $mock->addResponse(new Response(500)); - $this->client->addSubscriber($mock); - APIResource::sendRequest(array('text'=>'awesome email')); - } - + $this->sparkPostMock = Mockery::mock('SparkPost\SparkPost', function($mock) { + $mock->shouldReceive('getHttpHeaders')->andReturn([]); + }); + $this->sparkPostMock->httpAdapter = Mockery::mock(); + $this->resource = new APIResource($this->sparkPostMock); + self::$utils = new ClassUtils($this->resource); + self::$utils->setProperty($this->resource, 'sparkpost', $this->sparkPostMock); + } + + public function tearDown() + { + Mockery::close(); + } + + public function testConstructorSetsUpSparkPostObject() { + $this->sparkPostMock->newProp = 'new value'; + $this->assertEquals($this->sparkPostMock, self::$utils->getProperty($this->resource, 'sparkpost')); + } + + public function testCreate() { + $testInput = ['test'=>'body']; + $testBody = ["results"=>["my"=>"test"]]; + $responseMock = Mockery::mock(); + $this->sparkPostMock->httpAdapter->shouldReceive('send')-> + once()-> + with(Mockery::type('string'), 'POST', Mockery::type('array'), json_encode($testInput))-> + andReturn($responseMock); + $responseMock->shouldReceive('getBody->getContents')->andReturn(json_encode($testBody)); + + + $this->assertEquals($testBody, $this->resource->create($testInput)); + } + + public function testUpdate() { + $testInput = ['test'=>'body']; + $testBody = ["results"=>["my"=>"test"]]; + $responseMock = Mockery::mock(); + $this->sparkPostMock->httpAdapter->shouldReceive('send')-> + once()-> + with('/.*\/test/', 'PUT', Mockery::type('array'), json_encode($testInput))-> + andReturn($responseMock); + $responseMock->shouldReceive('getBody->getContents')->andReturn(json_encode($testBody)); + + $this->assertEquals($testBody, $this->resource->update('test', $testInput)); + } + + public function testGet() { + $testBody = ["results"=>["my"=>"test"]]; + $responseMock = Mockery::mock(); + $this->sparkPostMock->httpAdapter->shouldReceive('send')-> + once()-> + with('/.*\/test/', 'GET', Mockery::type('array'), null)-> + andReturn($responseMock); + $responseMock->shouldReceive('getBody->getContents')->andReturn(json_encode($testBody)); + + $this->assertEquals($testBody, $this->resource->get('test')); + } + + public function testDelete() { + $responseMock = Mockery::mock(); + $this->sparkPostMock->httpAdapter->shouldReceive('send')-> + once()-> + with('/.*\/test/', 'DELETE', Mockery::type('array'), null)-> + andReturn($responseMock); + $responseMock->shouldReceive('getBody->getContents')->andReturn(''); + + $this->assertEquals(null, $this->resource->delete('test')); + } + + public function testAdapter404Exception() { + try { + $this->sparkPostMock->httpAdapter->shouldReceive('send')-> + once()-> + andThrow($this->getExceptionMock(404)); + + $this->resource->get('test'); + } + catch(\Exception $e) { + $this->assertRegExp('/.*resource does not exist.*/', $e->getMessage()); + } + } + + public function testAdapter4XXException() { + try { + $this->sparkPostMock->httpAdapter->shouldReceive('send')-> + once()-> + andThrow($this->getExceptionMock(400)); + + $this->resource->get('test'); + } + catch(\Exception $e) { + $this->assertRegExp('/Received bad response.*/', $e->getMessage()); + } + } + + public function testAdapter5XXException() { + try { + $this->sparkPostMock->httpAdapter->shouldReceive('send')-> + once()-> + andThrow(new \Exception('Something went wrong.')); + + $this->resource->get('test'); + } + catch(\Exception $e) { + $this->assertRegExp('/Unable to contact.*API.*/', $e->getMessage()); + } + } + } diff --git a/test/unit/SparkPostTest.php b/test/unit/SparkPostTest.php index f40461d..aeda7d7 100644 --- a/test/unit/SparkPostTest.php +++ b/test/unit/SparkPostTest.php @@ -2,60 +2,82 @@ namespace SparkPost\Test; use SparkPost\SparkPost; +use Ivory\HttpAdapter\CurlHttpAdapter; +use SparkPost\Test\TestUtils\ClassUtils; +use \Mockery; class SparkPostTest extends \PHPUnit_Framework_TestCase { - + + private static $utils; + private $adapterMock; + private $resource; + + /** + * (non-PHPdoc) + * @before + * @see PHPUnit_Framework_TestCase::setUp() + */ + public function setUp() { + //setup mock for the adapter + $this->adapterMock = Mockery::mock('Ivory\HttpAdapter\HttpAdapterInterface', function($mock) { + $mock->shouldReceive('setConfiguration'); + $mock->shouldReceive('getConfiguration->getUserAgent')->andReturn('php-sparkpost/0.2.0'); + }); + + $this->resource = new SparkPost($this->adapterMock, ['key'=>'a key']); + self::$utils = new ClassUtils($this->resource); + self::$utils->setProperty($this->resource, 'httpAdapter', $this->adapterMock); + } + + public function tearDown() + { + Mockery::close(); + } + /** * @desc Ensures that the configuration class is not instantiable. */ - public function testConstructorCannotBeCalled() { - $class = new \ReflectionClass('\SparkPost\SparkPost'); - $this->assertFalse($class->isInstantiable()); - } - - /** - * @desc Tests that an exception is thrown when a library tries to recieve the config and it has not yet been set. - * Since its a singleton this test must come before any setConfig tests. - * @expectedException Exception - * @expectedExceptionMessage No configuration has been provided - */ - public function testGetConfigEmptyException() { - SparkPost::unsetConfig(); - SparkPost::getConfig(); - } - - /** - * @desc Tests that the api key is set when setting the config - * @expectedException Exception - * @expectedExceptionMessage You must provide an API key - */ - public function testSetConfigAPIKeyNotSetException() { - SparkPost::setConfig(array('something'=>'other than an API Key')); - } - - /** - * @desc Tests that the api key is set when setting the config and that its not empty - * @expectedException Exception - * @expectedExceptionMessage You must provide an API key - */ - public function testSetConfigAPIKeyEmptyException() { - SparkPost::setConfig(array('key'=>'')); - } - - /** - * @desc Tests overridable values are set while invalid values are ignored - */ - public function testSetConfigMultipleValuesAndGetConfig() { - SparkPost::setConfig(array('key'=>'lala', 'version'=>'v8', 'port'=>1024, 'someOtherValue'=>'fakeValue')); - - $testConfig = SparkPost::getConfig(); - $this->assertEquals('lala', $testConfig['key']); - $this->assertEquals('v8', $testConfig['version']); - $this->assertEquals(1024, $testConfig['port']); - $this->assertNotContains('someOtherValue', array_keys($testConfig)); - $this->assertEquals('https', $testConfig['protocol']); - $this->assertEquals('api.sparkpost.com', $testConfig['host']); - $this->assertEquals(true, $testConfig['strictSSL']); + public function testConstructorSetsUpTransmissions() { + $sparky = new SparkPost(new CurlHttpAdapter(), ['key'=>'a key']); + $this->assertEquals('SparkPost\Transmission', get_class($sparky->transmission)); + $adapter = self::$utils->getProperty($this->resource, 'httpAdapter'); + $this->assertRegExp('/php-sparkpost.*/', $adapter->getConfiguration()->getUserAgent()); } + + /** + * @expectedException Exception + * @expectedExceptionMessageRegExp /valid Ivory\\HttpAdapter/ + */ + public function testSetBadHTTPAdapter() { + $this->resource->setHttpAdapter(new \stdClass()); + } + + /** + * @expectedException Exception + * @expectedExceptionMessageRegExp /API key/ + */ + public function testSetBadConfig() { + $this->resource->setConfig(['not'=>'a key']); + } + + + public function testGetHeaders() { + $results = $this->resource->getHttpHeaders(); + $this->assertEquals('a key', $results['Authorization']); + $this->assertEquals('application/json', $results['Content-Type']); + } + + public function testGetHeadersOverride() { + $results = $this->resource->getHttpHeaders(['Content-Type'=>'application/xml']); + $this->assertEquals('application/xml', $results['Content-Type']); + } + + public function testSetUnwrapped() { + $results = $this->resource->setupUnwrapped('ASweetEndpoint'); + $this->assertEquals($this->resource->ASweetEndpoint, $results); + $this->assertInstanceOf('SparkPost\APIResource', $results); + $this->assertEquals('ASweetEndpoint', $results->endpoint); + } + } -?>
\ No newline at end of file +?> diff --git a/test/unit/TestUtils/ClassUtils.php b/test/unit/TestUtils/ClassUtils.php new file mode 100644 index 0000000..26d264c --- /dev/null +++ b/test/unit/TestUtils/ClassUtils.php @@ -0,0 +1,56 @@ +<?php +namespace SparkPost\Test\TestUtils; + + +class ClassUtils { + + private $class; + + public function __construct($fqClassName) { + $this->class = new \ReflectionClass($fqClassName); + } + + /** + * Allows access to private methods + * + * This is needed to mock the GuzzleHttp\Client responses + * + * @param string $name + * @return ReflectionMethod + */ + public function getMethod($method) { + $method = $this->class->getMethod($name); + $method->setAccessible(true); + return $method; + } + + /** + * Allows access to private properties in the Transmission class + * + * This is needed to mock the GuzzleHttp\Client responses + * + * @param string $name + * @param {*} + * @return ReflectionMethod + */ + public function getProperty($instance, $property) { + $prop = $this->class->getProperty($property); + $prop->setAccessible(true); + return $prop->getValue($instance); + } + /** + * Allows access to private properties in the Transmission class + * + * This is needed to mock the GuzzleHttp\Client responses + * + * @param string $name + * @param {*} + * @return ReflectionMethod + */ + public function setProperty($instance, $property, $value) { + $prop = $this->class->getProperty($property); + $prop->setAccessible(true); + $prop->setValue($instance, $value); + } +} +?> diff --git a/test/unit/TransmissionTest.php b/test/unit/TransmissionTest.php index ca30b4a..f09db7d 100644 --- a/test/unit/TransmissionTest.php +++ b/test/unit/TransmissionTest.php @@ -1,144 +1,86 @@ <?php namespace SparkPost\Test; - use SparkPost\Transmission; -use SparkPost\SparkPost; -use Guzzle\Plugin\Mock\MockPlugin; -use Guzzle\Http\Message\Response; - +use SparkPost\Test\TestUtils\ClassUtils; +use \Mockery; class TransmissionTest extends \PHPUnit_Framework_TestCase { - - private $client = null; - - /** - * Allows access to private methods in the Transmission class - * - * This is needed to mock the GuzzleHttp\Client responses - * - * @param string $name - * @return ReflectionMethod - */ - private static function getMethod($name) { - $class = new \ReflectionClass('\SparkPost\Transmission'); - $method = $class->getMethod($name); - $method->setAccessible(true); - return $method; - } - - /** - * (non-PHPdoc) - * @before - * @see PHPUnit_Framework_TestCase::setUp() - */ - public function setUp() { - SparkPost::setConfig(array('key'=>'blah')); - $this->client = self::getMethod('getHttpClient')->invoke(null); //so we can bootstrap api responses - } - - /** - * @desc Ensures that the configuration class is not instantiable. - */ - public function testConstructorCannotBeCalled() { - $class = new \ReflectionClass('\SparkPost\Transmission'); - $this->assertFalse($class->isInstantiable()); - } - - /** - * @desc tests happy path - */ - public function testAllWithGoodResponse() { - $mock = new MockPlugin(); - $mock->addResponse(new Response(200, array(), '{"results":[{"test":"This is a test"}, {"test":"two"}]}')); - $this->client->addSubscriber($mock); - $this->assertEquals(array("results"=>array(array('test'=>'This is a test'), array('test'=>'two'))), Transmission::all()); - } - - /** - * @desc tests happy path - */ - public function testFindWithGoodResponse() { - $mock = new MockPlugin(); - $mock->addResponse(new Response(200, array(), '{"results":[{"test":"This is a test"}]}')); - $this->client->addSubscriber($mock); - - $this->assertEquals(array("results"=>array(array('test'=>'This is a test'))), Transmission::find('someId')); - } - - /** - * @desc tests 404 bad response - * @expectedException Exception - * @expectedExceptionMessage The specified resource does not exist - */ - public function testFindWith404Response() { - $mock = new MockPlugin(); - $mock->addResponse(new Response(404, array())); - $this->client->addSubscriber($mock); - Transmission::find('someId'); - } - - /** - * @desc tests unknown bad response - * @expectedException Exception - * @expectedExceptionMessage Received bad response from Transmissions API: 400 - */ - public function testFindWithOtherBadResponse() { - $mock = new MockPlugin(); - $mock->addResponse(new Response(400, array())); - $this->client->addSubscriber($mock); - Transmission::find('someId'); - } - - /** - * @desc tests bad response - * @expectedException Exception - * @expectedExceptionMessageRegExp /Unable to contact Transmissions API:.* / - */ - public function testFindForCatchAllException() { - $mock = new MockPlugin(); - $mock->addResponse(new Response(500)); - $this->client->addSubscriber($mock); - Transmission::find('someId'); - } - - /** - * @desc tests happy path - */ - public function testSuccessfulSend() { - $body = array("result"=>array("transmission_id"=>"11668787484950529"), "status"=>array("message"=> "ok","code"=> "1000")); - $mock = new MockPlugin(); - $mock->addResponse(new Response(200, array(), json_encode($body))); - $this->client->addSubscriber($mock); - - - $this->assertEquals($body, Transmission::send(array('text'=>'awesome email'))); - } - - /** - * @desc tests bad response - * @expectedException Exception - * @expectedExceptionMessage ["This is a fake error"] - */ - public function testSendFor400Exception() { - $body = array('errors'=>array('This is a fake error')); - $mock = new MockPlugin(); - $mock->addResponse(new Response(400, array(), json_encode($body))); - $this->client->addSubscriber($mock); - Transmission::send(array('text'=>'awesome email')); - } - - - /** - * @desc tests bad response - * @expectedException Exception - * @expectedExceptionMessageRegExp /Unable to contact Transmissions API:.* / - */ - public function testSendForCatchAllException() { - $mock = new MockPlugin(); - $mock->addResponse(new Response(500)); - $this->client->addSubscriber($mock); - Transmission::send(array('text'=>'awesome email')); - } - + + private static $utils; + private $sparkPostMock; + private $resource; + + /** + * (non-PHPdoc) + * @before + * @see PHPUnit_Framework_TestCase::setUp() + */ + public function setUp() { + $this->sparkPostMock = Mockery::mock('SparkPost\SparkPost', function($mock) { + $mock->shouldReceive('getHttpHeaders')->andReturn([]); + }); + $this->sparkPostMock->httpAdapter = Mockery::mock(); + $this->resource = new Transmission($this->sparkPostMock); + self::$utils = new ClassUtils($this->resource); + } + + public function tearDown(){ + Mockery::close(); + } + + public function testSend() { + $responseMock = Mockery::mock(); + $body = ['text'=>'awesomesauce', 'content'=>['subject'=>'awesomeness']]; + $responseBody = ["results"=>"yay"]; + + $this->sparkPostMock->httpAdapter->shouldReceive('send')-> + once()-> + with('/.*\/transmissions/', 'POST', Mockery::type('array'), Mockery::type('string'))-> + andReturn($responseMock); + + $responseMock->shouldReceive('getBody->getContents')->andReturn(json_encode($responseBody)); + + $this->assertEquals($responseBody, $this->resource->send($body)); + } + + public function testAllWithFilter() { + $responseMock = Mockery::mock(); + $responseBody = ["results"=>"yay"]; + $this->sparkPostMock->httpAdapter->shouldReceive('send')-> + once()-> + with('/.*transmissions.*?campaign_id=campaign&template_id=template/', 'GET', Mockery::type('array'), null)-> + andReturn($responseMock); + + $responseMock->shouldReceive('getBody->getContents')->andReturn(json_encode($responseBody)); + + $this->assertEquals($responseBody, $this->resource->all('campaign', 'template')); + } + + public function testAllWithOutFilter() { + $responseMock = Mockery::mock(); + $responseBody = ["results"=>"yay"]; + $this->sparkPostMock->httpAdapter->shouldReceive('send')-> + once()-> + with('/.*\/transmissions/', 'GET', Mockery::type('array'), null)-> + andReturn($responseMock); + + $responseMock->shouldReceive('getBody->getContents')->andReturn(json_encode($responseBody)); + + $this->assertEquals($responseBody, $this->resource->all()); + } + + public function testFind() { + $responseMock = Mockery::mock(); + $responseBody = ["results"=>"yay"]; + $this->sparkPostMock->httpAdapter->shouldReceive('send')-> + once()-> + with('/.*\/transmissions.*\/test/', 'GET', Mockery::type('array'), null)-> + andReturn($responseMock); + + $responseMock->shouldReceive('getBody->getContents')->andReturn(json_encode($responseBody)); + + $this->assertEquals($responseBody, $this->resource->find('test')); + } + } -?>
\ No newline at end of file +?> diff --git a/test/unit/bootstrap.php b/test/unit/bootstrap.php index 7e73606..835369b 100644 --- a/test/unit/bootstrap.php +++ b/test/unit/bootstrap.php @@ -1,3 +1,3 @@ <?php require_once dirname(__FILE__).'/../../vendor/autoload.php'; -?>
\ No newline at end of file +?> |