From aea1bae3bf5ee58f4a7db3a3bd331e111a015326 Mon Sep 17 00:00:00 2001 From: Josh Sherman Date: Sun, 28 Sep 2014 21:49:49 -0400 Subject: [PATCH] Working on tests for Resource --- src/Resource.php | 145 +++++++++++++++------------------- tests/ResourceTest.php | 173 +++++++++++++++++++++++++++++++---------- 2 files changed, 197 insertions(+), 121 deletions(-) diff --git a/src/Resource.php b/src/Resource.php index b2c2e64..598db4b 100644 --- a/src/Resource.php +++ b/src/Resource.php @@ -126,19 +126,19 @@ class Resource extends Object */ } + // Hack together some new globals + if (in_array($method, ['PUT', 'DELETE'])) + { + $GLOBALS['_' . $method] = []; + + // @todo Populate it + } + $filter = isset($this->filter[$method]); $validate = isset($this->validate[$method]); if ($filter || $validate) { - // Hack together some new globals - if (in_array($method, ['PUT', 'DELETE'])) - { - $GLOBALS['_' . $method] = []; - - // @todo Populate it - } - $global =& $GLOBALS['_' . $method]; // Checks that the required parameters are present @@ -199,16 +199,19 @@ class Resource extends Object { $rule = explode(':', $rule); + for ($i = 1; $i <= 2; $i++) + { + if (!isset($rule[$i])) + { + $rule[$i] = false; + } + } + switch ($rule[0]) { // {{{ Checks using filter_var() case 'filter': - if (!isset($rule[1])) - { - $rule[1] = false; - } - switch ($rule[1]) { case 'boolean': @@ -218,74 +221,61 @@ class Resource extends Object case 'ip': case 'url': $filter = constant('FILTER_VALIDATE_' . strtoupper($rule[1])); + + if (!filter_var($value, $filter)) + { + $this->errors[$variable][] = $message; + } break; default: - throw new \Exception('Invalid filter, expecting boolean, email, float, int, ip or url.'); + $this->errors[$variable] = 'Invalid filter, expecting boolean, email, float, int, ip or url.'; break; } - if (!filter_var($value, $filter)) - { - $this->errors[$variable][] = $message; - } - break; // }}} // {{{ Checks using strlen() case 'length': - if (count($rule) < 3) + $length = strlen($value); + + switch ($rule[1]) { - throw new \Exception('Invalid validation rule, expected: "length:<|<=|==|!=|>=|>:integer".'); + case '<': + $valid = $length < $rule[2]; + break; + + case '<=': + $valid = $length <= $rule[2]; + break; + + case '==': + $valid = $length == $rule[2]; + break; + + case '!=': + $valid = $length != $rule[2]; + break; + + case '>=': + $valid = $length >= $rule[2]; + break; + + case '>': + $valid = $length > $rule[2]; + break; + + default: + $valid = false; + $message = 'Invalid operator, expecting <, <=, ==, !=, >= or >.'; + break; } - else + + if (!$valid) { - if (!filter_var($rule[2], FILTER_VALIDATE_INT)) - { - throw new \Exception('Invalid length value, expecting an integer.'); - } - else - { - $length = strlen($value); - - switch ($rule[1]) - { - case '<': - $valid = $length < $rule[2]; - break; - - case '<=': - $valid = $length <= $rule[2]; - break; - - case '==': - $valid = $length == $rule[2]; - break; - - case '!=': - $valid = $length != $rule[2]; - break; - - case '>=': - $valid = $length >= $rule[2]; - break; - - case '>': - $valid = $length > $rule[2]; - break; - - default: - throw new \Exception('Invalid operator, expecting <, <=, ==, !=, >= or >.'); - break; - } - - if (!$valid) - { - $this->errors[$variable][] = $message; - } - } + $this->errors[$variable][] = $message; } break; @@ -294,19 +284,9 @@ class Resource extends Object // {{{ Checks using preg_match() case 'regex': - if (count($rule) < 3) + if (preg_match($rule[1], $value)) { - throw new \Exception('Invalid validation rule, expected: "regex:is|not:string".'); - } - else - { - $rule[1] = strtolower($rule[1]); - - if (($rule[1] == 'is' && preg_match($rule[2], $value)) - || ($rule[1] == 'not' && !preg_match($rule[2], $value))) - { - $this->errors[$variable][] = $message; - } + $this->errors[$variable][] = $message; } break; @@ -346,25 +326,26 @@ class Resource extends Object } else { + /* // Gets the profiler status - // @todo Refactor out that stripos - $profiler = $this->config->pickles['profiler']; - $profiler = $profiler === true - || stripos($profiler, 'timers') !== false; + $profiler = $this->config['pickles']['profiler']; // Starts a timer before the resource is executed if ($profiler) { Profiler::timer('resource ' . $method); } + */ $this->response = $this->$method(); + /* // Stops the resource timer if ($profiler) { Profiler::timer('resource ' . $method); } + */ } } } diff --git a/tests/ResourceTest.php b/tests/ResourceTest.php index 6131d82..c65ee37 100644 --- a/tests/ResourceTest.php +++ b/tests/ResourceTest.php @@ -22,26 +22,44 @@ namespace Resources\v1 public $validate = [ 'GET' => [ 'missing', - 'isBoolean' => ['filter:boolean' => 'Error'], - 'isNotBoolean' => ['filter:boolean' => 'Error'], - 'isEmail' => ['filter:email' => 'Error'], - 'isNotEmail' => ['filter:email' => 'Error'], - 'isFloat' => ['filter:float' => 'Error'], - 'isNotFloat' => ['filter:float' => 'Error'], - 'isInt' => ['filter:int' => 'Error'], - 'isNotInt' => ['filter:int' => 'Error'], - 'isIP' => ['filter:ip' => 'Error'], - 'isNotIP' => ['filter:ip' => 'Error'], - 'isURL' => ['filter:url' => 'Error'], - 'isNotURL' => ['filter:url' => 'Error'], - 'invalidRule' => ['filter' => 'Error'], + 'isBoolean' => ['filter:boolean' => 'Error'], + 'isNotBoolean' => ['filter:boolean' => 'Error'], + 'isEmail' => ['filter:email' => 'Error'], + 'isNotEmail' => ['filter:email' => 'Error'], + 'isFloat' => ['filter:float' => 'Error'], + 'isNotFloat' => ['filter:float' => 'Error'], + 'isInt' => ['filter:int' => 'Error'], + 'isNotInt' => ['filter:int' => 'Error'], + 'isIP' => ['filter:ip' => 'Error'], + 'isNotIP' => ['filter:ip' => 'Error'], + 'isURL' => ['filter:url' => 'Error'], + 'isNotURL' => ['filter:url' => 'Error'], + 'invalidRule' => ['filter' => 'Error'], + 'lessThan' => ['length:<:10' => 'Error'], + 'lessThanEqual' => ['length:<=:10' => 'Error'], + 'equal' => ['length:==:10' => 'Error'], + 'notEqual' => ['length:!=:10' => 'Error'], + 'greaterThan' => ['length:>=:10' => 'Error'], + 'greaterThanEqual' => ['length:>:10' => 'Error'], + 'greaterLessThan' => ['length:><:10' => 'Error'], + 'regex' => ['regex:/[a-z]+/' => 'Error'], ], ]; public function GET() + { + + } + + public function PUT() { return ['foo' => 'bar']; } + + public function ERROR() + { + throw new \Exception('Error'); + } } } @@ -53,16 +71,19 @@ namespace { $response = json_encode([ 'meta' => [ - 'status' => 500, - 'message' => 'Invalid filter, expecting boolean, email, float, int, ip or url.', + 'status' => 400, + 'message' => 'Missing or invalid parameters.', 'errors' => [ - 'missing' => ['The missing parameter is required.'], - 'isNotBoolean' => ['Error'], - 'isNotEmail' => ['Error'], - 'isNotFloat' => ['Error'], - 'isNotInt' => ['Error'], - 'isNotIP' => ['Error'], - 'isNotURL' => ['Error'], + 'missing' => ['The missing parameter is required.'], + 'isNotBoolean' => ['Error'], + 'isNotEmail' => ['Error'], + 'isNotFloat' => ['Error'], + 'isNotInt' => ['Error'], + 'isNotIP' => ['Error'], + 'isNotURL' => ['Error'], + 'invalidRule' => ['Invalid filter, expecting boolean, email, float, int, ip or url.'], + 'greaterLessThan' => ['Invalid operator, expecting <, <=, ==, !=, >= or >.'], + 'regex' => ['Error'], ], ], ]); @@ -72,21 +93,29 @@ namespace $_SERVER['REQUEST_METHOD'] = 'GET'; $_REQUEST['request'] = 'v1/resource/1'; $_GET = [ - 'foo' => ' bar ', - 'bar' => 'unencrypted', - 'isBoolean' => true, - 'isNotBoolean' => 'invalid', - 'isEmail' => 'foo@bar.com', - 'isNotEmail' => 'nope', - 'isFloat' => 1.234567890, - 'isNotFloat' => 'five', - 'isInt' => 22381, - 'isNotInt' => 'pretzel', - 'isIP' => '127.0.0.1', - 'isNotIP' => 'home', - 'isURL' => 'http://joshtronic.com', - 'isNotURL' => 'doubleUdoubleUdoubleUdot', - 'invalidRule' => 'invalid', + 'foo' => ' bar ', + 'bar' => 'unencrypted', + 'isBoolean' => true, + 'isNotBoolean' => 'invalid', + 'isEmail' => 'foo@bar.com', + 'isNotEmail' => 'nope', + 'isFloat' => 1.234567890, + 'isNotFloat' => 'five', + 'isInt' => 22381, + 'isNotInt' => 'pretzel', + 'isIP' => '127.0.0.1', + 'isNotIP' => 'home', + 'isURL' => 'http://joshtronic.com', + 'isNotURL' => 'doubleUdoubleUdoubleUdot', + 'invalidRule' => 'invalid', + 'lessThan' => '...', + 'lessThanEqual' => '.......', + 'equal' => '..........', + 'notEqual' => '.......', + 'greaterThan' => '............', + 'greaterThanEqual' => '............', + 'greaterLessThan' => '......', + 'regex' => 'abc', ]; new Pickles\Router(); @@ -112,7 +141,27 @@ namespace new Pickles\Router(); } - public function testAuthMisconfigured() + public function testPUT() + { + $response = json_encode([ + 'meta' => [ + 'status' => 200, + 'message' => 'OK', + ], + 'response' => [ + 'foo' => 'bar', + ], + ]); + + $this->expectOutputString($response); + + $_SERVER['REQUEST_METHOD'] = 'PUT'; + $_REQUEST['request'] = 'v1/resource/1'; + + new Pickles\Router(); + } + + public function testMisconfiguredAuth() { $response = json_encode([ 'meta' => [ @@ -129,9 +178,55 @@ namespace new Pickles\Router(); } - public function testValidation() + public function testMisconfiguredAuth() { + $response = json_encode([ + 'meta' => [ + 'status' => 401, + 'message' => 'Authentication is not configured properly.', + ], + ]); + $this->expectOutputString($response); + + $_SERVER['REQUEST_METHOD'] = 'DELETE'; + $_REQUEST['request'] = 'v1/resource/1'; + + new Pickles\Router(); + } + + public function testMethodNotAllowed() + { + $response = json_encode([ + 'meta' => [ + 'status' => 405, + 'message' => 'Method not allowed.', + ], + ]); + + $this->expectOutputString($response); + + $_SERVER['REQUEST_METHOD'] = 'NOPE'; + $_REQUEST['request'] = 'v1/resource/1'; + + new Pickles\Router(); + } + + public function testLowErrorCode() + { + $response = json_encode([ + 'meta' => [ + 'status' => 500, + 'message' => 'Error', + ], + ]); + + $this->expectOutputString($response); + + $_SERVER['REQUEST_METHOD'] = 'ERROR'; + $_REQUEST['request'] = 'v1/resource/1'; + + new Pickles\Router(); } } }