Skip to content

Commit

Permalink
Endpoint Data Unit Tests
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaelJ2324 committed Mar 22, 2017
1 parent eb1972f commit 57a36dd
Show file tree
Hide file tree
Showing 4 changed files with 268 additions and 11 deletions.
45 changes: 35 additions & 10 deletions src/Endpoint/Data/AbstractEndpointData.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,13 @@

abstract class AbstractEndpointData implements DataInterface
{
const DATA_PROPERTY_REQUIRED = 'required';

const DATA_PROPERTY_DEFAULTS = 'defaults';

protected static $_DEFAULT_PROPERTIES = array(
'required' => array(),
'defaults' => array(),
self::DATA_PROPERTY_REQUIRED => array(),
self::DATA_PROPERTY_DEFAULTS => array(),
);

/**
Expand All @@ -24,12 +28,13 @@ abstract class AbstractEndpointData implements DataInterface
protected $properties;

//Overloads
public function __construct(array $data = array(),array $properties = array()) {
$this->reset();
$this->data = $data;
public function __construct(array $properties = array(),array $data = array()) {
$this->setProperties(static::$_DEFAULT_PROPERTIES);
foreach($properties as $key => $value){
$this->properties[$key] = $value;
}
$this->configureDefaultData();
$this->update($data);
}

/**
Expand Down Expand Up @@ -141,6 +146,12 @@ public function getProperties() {
* @return $this
*/
public function setProperties(array $properties) {
if (!isset($properties[self::DATA_PROPERTY_REQUIRED])){
$properties[self::DATA_PROPERTY_REQUIRED] = array();
}
if (!isset($properties[self::DATA_PROPERTY_DEFAULTS])){
$properties[self::DATA_PROPERTY_DEFAULTS] = array();
}
$this->properties = $properties;
return $this;
}
Expand All @@ -151,8 +162,8 @@ public function setProperties(array $properties) {
*/
public function reset(){
$this->setProperties(static::$_DEFAULT_PROPERTIES);
$this->configureDefaultData();
return $this->clear();
$this->clear();
return $this->configureDefaultData();
}

/**
Expand Down Expand Up @@ -196,19 +207,33 @@ protected function configureDefaultData(){
*/
protected function verifyRequiredData()
{
$errors = array(
'missing' => array(),
'invalid' => array()
);
$error = FALSE;
if (!empty($this->properties['required'])) {
foreach ($this->properties['required'] as $property => $type) {
if (!isset($data[$property])) {
if (!isset($this->data[$property])) {
$errors['missing'][] = $property;
$error = TRUE;
continue;
}
if ($type !== NULL && gettype($data[$property]) !== $type) {
if ($type !== NULL && gettype($this->data[$property]) !== $type) {
$errors['invalid'][] = $property;
$error = TRUE;
}
}
}
if ($error){
throw new InvalidData(get_called_class());
$errorMsg = '';
if (!empty($errors['missing'])){
$errorMsg .= "Missing [".implode(",",$errors['missing']). "] ";
}
if (!empty($errors['invalid'])){
$errorMsg .= "Invalid [".implode(",",$errors['invalid'])."]";
}
throw new InvalidData($errorMsg);
}
return $error;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Exception/Endpoint/InvalidData.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@

class InvalidData extends EndpointException
{
protected $message = "Missing or Invalid data on Endpoint [%s].";
protected $message = "Missing or Invalid data on Endpoint Data. Errors: %s";
}
214 changes: 214 additions & 0 deletions tests/Endpoint/Data/AbstractEndpointDataTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
<?php

namespace MRussell\REST\Tests\Endpoint\Data;

use MRussell\REST\Endpoint\Data\EndpointData as StockData;
use MRussell\REST\Tests\Stubs\Endpoint\EndpointData as StubData;

/**
* Class AbstractEndpointDataTest
* @package MRussell\REST\Tests\Endpoint\Data
* @coversDefaultClass MRussell\REST\Endpoint\Data\AbstractEndpointData
* @group AbstractEndpointDataTest
*/
class AbstractEndpointDataTest extends \PHPUnit_Framework_TestCase
{

public static function setUpBeforeClass()
{
//Add Setup for static properties here
}

public static function tearDownAfterClass()
{
//Add Tear Down for static properties here
}

protected $data = array(
'foo' => 'bar',
'baz' => 'foz'
);

protected $properties = array(
'required' => array(
'foo' => 'string'
),
'defaults' => array(
'bar' => 'foo'
)
);

public function setUp()
{
parent::setUp();
}

public function tearDown()
{
parent::tearDown();
}

/**
* @covers ::__construct
* @covers ::configureDefaultData
* @covers ::update
* @covers ::asArray
* @covers ::getProperties
*/
public function testConstructor(){
$Data = new StockData();
$this->assertEquals(array(
StockData::DATA_PROPERTY_REQUIRED => array(),
StockData::DATA_PROPERTY_DEFAULTS => array()
), $Data->getProperties());
$this->assertEquals(array(),$Data->asArray());
$Data = new StockData($this->properties);
$this->assertEquals($this->properties, $Data->getProperties());
$this->assertEquals(array(
'bar' => 'foo'
),$Data->asArray());
$Data = new StockData($this->properties,$this->data);
$this->assertEquals($this->properties, $Data->getProperties());
$data = $this->data;
$data['bar'] = 'foo';
$this->assertEquals($data,$Data->asArray());
$Data = new StockData(array(),$this->data);
$this->assertEquals(array(
StockData::DATA_PROPERTY_REQUIRED => array(),
StockData::DATA_PROPERTY_DEFAULTS => array()
), $Data->getProperties());
$this->assertEquals($this->data,$Data->asArray());

$Data = new StubData(array());
$this->assertEquals($this->properties, $Data->getProperties());
$this->assertEquals(array(
'bar' => 'foo'
),$Data->asArray());
}

/**
* @covers ::__get
* @covers ::__set
* @covers ::__isset
* @covers ::__unset
* @covers ::offsetSet
* @covers ::offsetExists
* @covers ::offsetUnset
* @covers ::offsetGet
* @covers ::asArray
*/
public function testDataAccess(){
$this->data = array_replace($this->data,array(
'test' => 'tester',
'abcd' => 'efg',
'pew' => 'die',
'arr' => array(),
'iint' => 1234
));
$Data = new StockData(array(),$this->data);
$Data['bar'] = 'foo';
$this->assertEquals('foo',$Data['bar']);
$this->assertEquals('foo',$Data->bar);
$Data->foz = 'baz';
$this->assertEquals('baz',$Data['foz']);
$this->assertEquals('baz',$Data->foz);
$Data[] = 'number1';
$this->assertEquals('number1',$Data[0]);
$this->assertEquals('tester',$Data->test);
$this->assertEquals(TRUE,isset($Data->abcd));
$this->assertEquals('die',$Data['pew']);
$this->assertEquals(array(),$Data['arr']);
$this->assertEquals(array(),$Data->arr);
$this->assertEquals(TRUE,isset($Data['iint']));
unset($Data->arr);
$this->assertEquals(FALSE,isset($Data->arr));
unset($Data['abcd']);
$this->assertEquals(FALSE,isset($Data['abcd']));
$this->assertEquals(array(
0 => 'number1',
'foo' => 'bar',
'bar' => 'foo',
'baz' => 'foz',
'foz' => 'baz',
'test' => 'tester',
'pew' => 'die',
'iint' => 1234
),$Data->asArray());
}

/**
* @covers ::setProperties
* @covers ::getProperties
*/
public function testSetProperties(){
$Data = new StockData();
$this->assertEquals(array(
StockData::DATA_PROPERTY_REQUIRED => array(),
StockData::DATA_PROPERTY_DEFAULTS => array()
), $Data->getProperties());
$this->assertEquals($Data,$Data->setProperties(array()));
$this->assertEquals(array(
StockData::DATA_PROPERTY_REQUIRED => array(),
StockData::DATA_PROPERTY_DEFAULTS => array()
), $Data->getProperties());
$this->assertEquals($Data,$Data->setProperties($this->properties));
$this->assertEquals($this->properties,$Data->getProperties());
}

/**
* @depends testDataAccess
* @covers ::reset
* @covers ::clear
*/
public function testReset(){
$Data = new StockData();
$Data['foo'] = 'bar';
$Data->setProperties($this->properties);
$this->assertEquals($Data,$Data->reset());
$this->assertEquals(array(
StockData::DATA_PROPERTY_REQUIRED => array(),
StockData::DATA_PROPERTY_DEFAULTS => array()
), $Data->getProperties());
$this->assertEquals(array(),$Data->asArray());

$Data = new StubData(array(),$this->data);
$Data->setProperties(array());
$this->assertEquals($Data,$Data->reset());
$this->assertEquals($this->properties, $Data->getProperties());
$this->assertEquals(array('bar' => 'foo'),$Data->asArray());
$this->assertEquals($Data,$Data->clear());
$this->assertEquals(array(),$Data->asArray());
}

/**
* @covers ::verifyRequiredData
* @covers ::asArray
*/
public function testVerifyRequiredData(){
$Data = new StubData();
$Data['foo'] = 'bar';
$this->assertEquals(array(
'foo' => 'bar',
'bar' => 'foo'
),$Data->asArray(TRUE));
}

/**
* @expectedException MRussell\REST\Exception\Endpoint\InvalidData
* @expectedExceptionMessageRegExp /Missing or Invalid data on Endpoint Data\. Errors: (Missing \[[A-z0-9,].*\]|Invalid \[[A-z0-9,].*\])/
*/
public function testMissingData(){
$Data = new StubData();
$Data->asArray(TRUE);
}

/**
* @expectedException MRussell\REST\Exception\Endpoint\InvalidData
* @expectedExceptionMessageRegExp /Missing or Invalid data on Endpoint Data\. Errors: (Missing \[[A-z0-9,].*\]|Invalid \[[A-z0-9,].*\])/
*/
public function testInvalidData(){
$Data = new StubData();
$Data['foo'] = 1234;
$Data->asArray(TRUE);
}
}
18 changes: 18 additions & 0 deletions tests/Stubs/Endpoint/EndpointData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace MRussell\REST\Tests\Stubs\Endpoint;


use MRussell\REST\Endpoint\Data\AbstractEndpointData;

class EndpointData extends AbstractEndpointData
{
protected static $_DEFAULT_PROPERTIES = array(
'required' => array(
'foo' => 'string'
),
'defaults' => array(
'bar' => 'foo'
)
);
}

0 comments on commit 57a36dd

Please sign in to comment.