Merged in victorsl/processmaker (pull request #13)

ProcessMaker-MA "2184 Fields Validation Layer"
This commit is contained in:
erik ao
2013-11-28 17:57:09 -04:00
2 changed files with 684 additions and 0 deletions

View File

@@ -0,0 +1,441 @@
<?php
require_once (PATH_TRUNK . "workflow" . PATH_SEP . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.fieldValidator.php");
/**
* Unit test for class FieldValidator
*/
class classFieldValidatorTest extends PHPUnit_Framework_TestCase
{
/**
* @var FieldValidator
*/
protected $object;
/**
* Sets up the fixture, for example, opens a network connection.
* This method is called before a test is executed.
*/
protected function setUp()
{
$this->object = new FieldValidator();
}
/**
* Tears down the fixture, for example, closes a network connection.
* This method is called after a test is executed.
*/
protected function tearDown()
{
}
/**
* This is the default method to test, if the class still having
* the same number of methods.
*/
public function testNumberOfMethodsInThisClass()
{
$methods = get_class_methods('FieldValidator');
$this->assertTrue( count($methods) == 7);
}
/**
* Test all methods structure
*/
public function testAllMethodsStructure()
{
$methods = get_class_methods($this->object);
//isInt
$this->assertTrue( in_array('isInt', $methods ), 'exists method isInt' );
$r = new ReflectionMethod('FieldValidator', 'isInt');
$params = $r->getParameters();
$this->assertTrue( $params[0]->getName() == 'num');
$this->assertTrue( $params[0]->isArray() == false);
$this->assertTrue( $params[0]->isOptional () == false);
//isReal
$this->assertTrue( in_array('isReal', $methods ), 'exists method isReal' );
$r = new ReflectionMethod('FieldValidator', 'isReal');
$params = $r->getParameters();
$this->assertTrue( $params[0]->getName() == 'num');
$this->assertTrue( $params[0]->isArray() == false);
$this->assertTrue( $params[0]->isOptional () == false);
//isBool
$this->assertTrue( in_array('isBool', $methods ), 'exists method isBool' );
$r = new ReflectionMethod('FieldValidator', 'isBool');
$params = $r->getParameters();
$this->assertTrue( $params[0]->getName() == 'bool');
$this->assertTrue( $params[0]->isArray() == false);
$this->assertTrue( $params[0]->isOptional () == false);
//isUrl
$this->assertTrue( in_array('isUrl', $methods ), 'exists method isUrl' );
$r = new ReflectionMethod('FieldValidator', 'isUrl');
$params = $r->getParameters();
$this->assertTrue( $params[0]->getName() == 'url');
$this->assertTrue( $params[0]->isArray() == false);
$this->assertTrue( $params[0]->isOptional () == false);
//isEmail
$this->assertTrue( in_array('isEmail', $methods ), 'exists method isEmail' );
$r = new ReflectionMethod('FieldValidator', 'isEmail');
$params = $r->getParameters();
$this->assertTrue( $params[0]->getName() == 'email');
$this->assertTrue( $params[0]->isArray() == false);
$this->assertTrue( $params[0]->isOptional () == false);
//isIp
$this->assertTrue( in_array('isIp', $methods ), 'exists method isIp' );
$r = new ReflectionMethod('FieldValidator', 'isIp');
$params = $r->getParameters();
$this->assertTrue( $params[0]->getName() == 'ip');
$this->assertTrue( $params[0]->isArray() == false);
$this->assertTrue( $params[0]->isOptional () == false);
//validate
$this->assertTrue( in_array('validate', $methods ), 'exists method validate' );
$r = new ReflectionMethod('FieldValidator', 'validate');
$params = $r->getParameters();
$this->assertTrue( $params[0]->getName() == 'arrayData');
$this->assertTrue( $params[0]->isArray() == false);
$this->assertTrue( $params[0]->isOptional () == false);
$this->assertTrue( $params[1]->getName() == 'arrayDataValidators');
$this->assertTrue( $params[1]->isArray() == false);
$this->assertTrue( $params[1]->isOptional () == false);
}
/**
* @covers FieldValidator::isInt
*/
public function testIsInt()
{
$this->assertTrue($this->object->isInt(0));
$this->assertTrue($this->object->isInt("0"));
$this->assertTrue($this->object->isInt(+0));
$this->assertTrue($this->object->isInt("+0"));
$this->assertTrue($this->object->isInt(-0));
$this->assertTrue($this->object->isInt("-0"));
$this->assertTrue($this->object->isInt(55));
$this->assertTrue($this->object->isInt("55"));
$this->assertTrue($this->object->isInt(+55));
$this->assertTrue($this->object->isInt("+55"));
$this->assertTrue($this->object->isInt(-55));
$this->assertTrue($this->object->isInt("-55"));
$this->assertFalse($this->object->isInt(""));
$this->assertFalse($this->object->isInt(55.5));
$this->assertFalse($this->object->isInt("55.5"));
$this->assertFalse($this->object->isInt(+55.5));
$this->assertFalse($this->object->isInt("+55.5"));
$this->assertFalse($this->object->isInt(-55.5));
$this->assertFalse($this->object->isInt("-55.5"));
}
/**
* @covers FieldValidator::isReal
*/
public function testIsReal()
{
$this->assertTrue($this->object->isReal(0));
$this->assertTrue($this->object->isReal("0"));
$this->assertTrue($this->object->isReal(+0));
$this->assertTrue($this->object->isReal("+0"));
$this->assertTrue($this->object->isReal(-0));
$this->assertTrue($this->object->isReal("-0"));
$this->assertTrue($this->object->isReal(55));
$this->assertTrue($this->object->isReal("55"));
$this->assertTrue($this->object->isReal(+55));
$this->assertTrue($this->object->isReal("+55"));
$this->assertTrue($this->object->isReal(-55));
$this->assertTrue($this->object->isReal("-55"));
$this->assertTrue($this->object->isReal(55.5));
$this->assertTrue($this->object->isReal("55.5"));
$this->assertTrue($this->object->isReal(+55.5));
$this->assertTrue($this->object->isReal("+55.5"));
$this->assertTrue($this->object->isReal(-55.5));
$this->assertTrue($this->object->isReal("-55.5"));
$this->assertFalse($this->object->isReal(""));
$this->assertFalse($this->object->isReal(".5"));
$this->assertFalse($this->object->isReal("a"));
}
/**
* @covers FieldValidator::isBool
*/
public function testIsBool()
{
$this->assertTrue($this->object->isBool(true));
$this->assertTrue($this->object->isBool(false));
$this->assertTrue($this->object->isBool("true"));
$this->assertTrue($this->object->isBool("false"));
$this->assertFalse($this->object->isBool(""));
$this->assertFalse($this->object->isBool(1));
$this->assertFalse($this->object->isBool(0));
$this->assertFalse($this->object->isBool("1"));
$this->assertFalse($this->object->isBool("0"));
}
/**
* @covers FieldValidator::isUrl
*/
public function testIsUrl()
{
$this->assertTrue($this->object->isUrl("http://www.myweb.com"));
$this->assertTrue($this->object->isUrl("http://www.myweb.com/"));
$this->assertTrue($this->object->isUrl("https://www.myweb.com"));
$this->assertTrue($this->object->isUrl("https://www.myweb.com/"));
$this->assertTrue($this->object->isUrl("https://www.myweb.com.bo"));
$this->assertTrue($this->object->isUrl("https://myweb.com"));
$this->assertTrue($this->object->isUrl("https://myweb.com.bo"));
$this->assertTrue($this->object->isUrl("http://192.168.10.58"));
$this->assertTrue($this->object->isUrl("https://192.168.10.58"));
$this->assertTrue($this->object->isUrl("http://192.168.10.58:8080"));
$this->assertTrue($this->object->isUrl("https://192.168.10.58:8080/"));
$this->assertTrue($this->object->isUrl("http://www.myweb.com/project/01/activity/01/steps"));
$this->assertTrue($this->object->isUrl("http://www.myweb.com/project/01/activity/01/steps.php"));
$this->assertFalse($this->object->isUrl(""));
$this->assertFalse($this->object->isUrl("www.myweb.com"));
$this->assertFalse($this->object->isUrl("www.myweb.com.bo"));
$this->assertFalse($this->object->isUrl("http ://www.myweb.com/"));
$this->assertFalse($this->object->isUrl("http://myweb"));
$this->assertFalse($this->object->isUrl("myweb"));
$this->assertFalse($this->object->isUrl("192.168.10.58"));
$this->assertFalse($this->object->isUrl("xttp://192.168.10.58"));
$this->assertFalse($this->object->isUrl("http:://192.168.10.58:8080/"));
$this->assertFalse($this->object->isUrl("http://"));
$this->assertFalse($this->object->isUrl("https://"));
}
/**
* @covers FieldValidator::isEmail
*/
public function testIsEmail()
{
$this->assertTrue($this->object->isEmail("my-email@myweb.com"));
$this->assertTrue($this->object->isEmail("my.email@myweb.com.bo"));
$this->assertTrue($this->object->isEmail("my-email.sample@myweb.com"));
$this->assertTrue($this->object->isEmail("my-email@my-web.com"));
$this->assertTrue($this->object->isEmail("my-2013-email@my-web.com"));
$this->assertTrue($this->object->isEmail("2013-my-email@my-web.com"));
$this->assertFalse($this->object->isEmail(""));
$this->assertFalse($this->object->isEmail(" @myweb.com"));
$this->assertFalse($this->object->isEmail("my@email@myweb.com.bo"));
$this->assertFalse($this->object->isEmail("my-2013-email"));
$this->assertFalse($this->object->isEmail("my-email@myweb"));
$this->assertFalse($this->object->isEmail(".@myweb.com"));
$this->assertFalse($this->object->isEmail("-@myweb.com"));
$this->assertFalse($this->object->isEmail("@myweb.com"));
$this->assertFalse($this->object->isEmail("sample@.com"));
$this->assertFalse($this->object->isEmail("sample.com"));
}
/**
* @covers FieldValidator::isIp
*/
public function testIsIp()
{
$this->assertTrue($this->object->isIp("255.255.255.255"));
$this->assertTrue($this->object->isIp("0.0.0.0"));
$this->assertTrue($this->object->isIp("127.0.0.1"));
$this->assertFalse($this->object->isIp(""));
$this->assertFalse($this->object->isIp("127.o.0.1"));
$this->assertFalse($this->object->isIp("127.0.0."));
$this->assertFalse($this->object->isIp("127.0.0"));
$this->assertFalse($this->object->isIp(".0.0.1"));
$this->assertFalse($this->object->isIp("127..0.1"));
}
/**
* @covers FieldValidator::validate
*/
public function testValidate()
{
//Data OK
$arrayField = array(
"name" => "peter",
"lastname" => "parker",
"age" => 33,
"weight" => 56.55,
"website" => "http://www.myweb.com/",
"email" => "spider-man@myweb.com",
"alive" => true
);
$arrayValidators = array(
"name" => array(
"type" => "string",
"required" => true,
"min_size" => 5
),
"lastname" => array(
"type" => "string",
"min_size" => 2
),
"age" => array(
"type" => "int",
"required" => true
),
"weight" => array(
"type" => "real",
"required" => true
),
"website" => array(
"validation" => "url"
),
"email" => array(
"type" => "string",
"required" => false,
"validation" => "email"
),
"alive" => array(
"type" => "boolean"
),
"ip" => array(
"validation" => "ip",
"required" => false
)
);
$result = $this->object->validate($arrayField, $arrayValidators);
$expectedSuccess = true;
$expectedErrors = array();
$this->assertEquals($result["success"], $expectedSuccess);
$this->assertEquals($result["errors"], $expectedErrors);
//Data failed
$arrayField = array(
"name" => "Dan",
"lastname" => "",
"age" => "hello",
"weight" => "",
"website" => "www.myweb.com",
"email" => "spider-man@myweb",
"alive" => 1
);
$arrayValidators = array(
"name" => array(
"type" => "string",
"required" => true,
"min_size" => 4
),
"lastname" => array(
"type" => "string",
"required" => true
),
"age" => array(
"type" => "int"
),
"weight" => array(
"type" => "real",
"required" => true
),
"website" => array(
"validation" => "url"
),
"email" => array(
"type" => "string",
"required" => false,
"validation" => "email"
),
"alive" => array(
"type" => "boolean"
),
"ip" => array(
"validation" => "ip",
"required" => false
)
);
$result = $this->object->validate($arrayField, $arrayValidators);
$expectedSuccess = false;
$expectedErrors = array(
"Field \"name\" should be min 4 chars, 3 given",
"Field \"lastname\" is required",
"Field \"age\" not is an integer number",
"Field \"weight\" not is an real number",
"Field \"weight\" is required",
"Field \"website\" have not an valid URL format",
"Field \"email\" have not an valid email format",
"Field \"alive\" not is an boolean"
);
$this->assertEquals($result["success"], $expectedSuccess);
$this->assertEquals($result["errors"], $expectedErrors);
}
/**
*
*/
public function dataProviderTestValidateExceptionCovers()
{
return array(
array("", array(), false),
array(array(), "", false),
array(array(), array(1), false),
array(array(1), array(), false)
);
}
/**
* @covers FieldValidator::validate
* @dataProvider dataProviderTestValidateExceptionCovers
*/
public function testValidateExceptionCovers($arrayData, $arrayDataValidators, $success)
{
$result = $this->object->validate($arrayData, $arrayDataValidators);
$this->assertEquals($result["success"], $success);
}
/**
*
*/
public function dataProviderTestValidateRemainingCovers()
{
return array(
array(array("age" => 55.5), array("age" => array("type" => "int")), false),
array(array("pi" => "3_1416"), array("pi" => array("type" => "real")), false),
array(array("flag" => 1), array("flag" => array("type" => "bool")), false),
array(array("name" => "peter"), array("name" => array("type" => "string")), true),
array(array("email" => "my--email@myweb.com"), array("email" => array("validation" => "email")), false),
array(array("ip" => "127.0.0"), array("ip" => array("validation" => "ip")), false),
array(array("name" => "peter"), array("name" => array("min_size" => 6)), false),
array(array("name" => "peter"), array("firstname" => array("required" => true)), false)
);
}
/**
* @covers FieldValidator::validate
* @dataProvider dataProviderTestValidateRemainingCovers
*/
public function testValidateRemainingCovers($arrayData, $arrayDataValidators, $success)
{
$result = $this->object->validate($arrayData, $arrayDataValidators);
$this->assertEquals($result["success"], $success);
}
}

View File

@@ -0,0 +1,243 @@
<?php
class FieldValidator
{
/**
* Checks if value of an variable is integer number
*
* @param int $num The variable being evaluated
*
* @return bool Returns true if $num is an integer, false otherwise
*/
public static function isInt($num)
{
$num = $num . "";
return (preg_match("/^[\+\-]?(?:0|[1-9]\d*)$/", $num))? true : false;
}
/**
* Checks if value of an variable is real number
*
* @param float $num The variable being evaluated
*
* @return bool Returns true if $num is an real, false otherwise
*/
public static function isReal($num)
{
$num = $num . "";
return (preg_match("/^[\+\-]?(?:0|[1-9]\d*)(?:\.\d+)?$/", $num))? true : false;
}
/**
* Checks if value of an variable is boolean
*
* @param bool $bool The variable being evaluated
*
* @return bool Returns true if $bool is an boolean, false otherwise
*/
public static function isBool($bool)
{
if (is_bool($bool) === true) {
return true;
}
$bool = $bool . "";
return (preg_match("/^(?:true|false)$/i", $bool))? true : false;
}
/**
* Checks if value of an variable have valid URL format
*
* @param string $url The variable being evaluated
*
* @return bool Returns true if $bool have valid URL format, false otherwise
*/
public static function isUrl($url)
{
return (preg_match("/(((^https?)|(^ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\/+\\@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i", $url))? true : false;
}
/**
* Checks if value of an variable have valid email format
*
* @param string $email The variable being evaluated
*
* @return bool Returns true if $bool have valid email format, false otherwise
*/
public static function isEmail($email)
{
return (preg_match("/^(\w+)([\-+.\'][\w]+)*@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/", $email))? true : false;
}
/**
* Checks if value of an variable have valid IP format
*
* @param string $ip The variable being evaluated
*
* @return bool Returns true if $bool have valid IP format, false otherwise
*/
public static function isIp($ip)
{
return (preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip))? true : false;
}
/**
* Validate fields
*
* @param array $arrayData Fields to be validate
* @param array $arrayDataValidators Validator for each field
*
* @return array Returns an array with key "succes" in true or false
*/
public static function validate($arrayData, $arrayDataValidators)
{
$result = array();
$arrayError = array();
$result["success"] = true;
try {
if (!is_array($arrayData)) {
throw (new Exception("Fields no is array"));
}
if (!is_array($arrayDataValidators)) {
throw (new Exception("Validators no is array"));
}
if (count($arrayData) == 0) {
throw (new Exception("Fields is empty"));
}
if (count($arrayDataValidators) == 0) {
throw (new Exception("Validators is empty"));
}
foreach ($arrayDataValidators as $key1 => $value1) {
$field = $key1;
$arrayValidators = $value1;
if (is_array($arrayValidators) && count($arrayValidators) > 0) {
if (isset($arrayValidators["type"])) {
if (isset($arrayData[$field])) {
switch ($arrayValidators["type"]) {
case "int":
if (!self::isInt($arrayData[$field])) {
$result["success"] = false;
$arrayError[] = str_replace(
array("{0}"),
array($field),
"Field \"{0}\" not is an integer number"
);
}
break;
case "real":
if (!self::isReal($arrayData[$field])) {
$result["success"] = false;
$arrayError[] = str_replace(
array("{0}"),
array($field),
"Field \"{0}\" not is an real number"
);
}
break;
case "bool":
case "boolean":
if (!self::isBool($arrayData[$field])) {
$result["success"] = false;
$arrayError[] = str_replace(
array("{0}"),
array($field),
"Field \"{0}\" not is an boolean"
);
}
break;
default:
//string
break;
}
}
}
if (isset($arrayValidators["validation"])) {
if (isset($arrayData[$field])) {
switch ($arrayValidators["validation"]) {
case "url":
if (!self::isUrl($arrayData[$field])) {
$result["success"] = false;
$arrayError[] = str_replace(
array("{0}"),
array($field),
"Field \"{0}\" have not an valid URL format"
);
}
break;
case "email":
if (!self::isEmail($arrayData[$field])) {
$result["success"] = false;
$arrayError[] = str_replace(
array("{0}"),
array($field),
"Field \"{0}\" have not an valid email format"
);
}
break;
case "ip":
if (!self::isIp($arrayData[$field])) {
$result["success"] = false;
$arrayError[] = str_replace(
array("{0}"),
array($field),
"Field \"{0}\" have not an valid IP format"
);
}
break;
}
}
}
if (isset($arrayValidators["min_size"])) {
if (isset($arrayData[$field]) && !(strlen($arrayData[$field] . "") >= (int)($arrayValidators["min_size"]))) {
$result["success"] = false;
$arrayError[] = str_replace(
array("{0}", "{1}", "{2}"),
array($field, $arrayValidators["min_size"], strlen($arrayData[$field] . "")),
"Field \"{0}\" should be min {1} chars, {2} given"
);
}
}
if (isset($arrayValidators["required"])) {
if ($arrayValidators["required"] && (!isset($arrayData[$field]) || (isset($arrayData[$field]) && $arrayData[$field] . "" == ""))) {
$result["success"] = false;
$arrayError[] = str_replace(
array("{0}"),
array($field),
"Field \"{0}\" is required"
);
}
}
}
}
} catch (Exception $e) {
$arrayError[] = $e->getMessage();
$result["success"] = false;
}
$result["errors"] = $arrayError;
return $result;
}
}