summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/unit/APIResourceTest.php255
-rw-r--r--test/unit/SparkPostTest.php122
-rw-r--r--test/unit/TestUtils/ClassUtils.php56
-rw-r--r--test/unit/TransmissionTest.php218
-rw-r--r--test/unit/bootstrap.php2
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
+?>