Suralc
12 years ago
3 changed files with 284 additions and 2 deletions
@ -0,0 +1,44 @@
|
||||
<?php |
||||
|
||||
namespace yiiunit\data\validators; |
||||
|
||||
|
||||
use yii\validators\Validator; |
||||
|
||||
class TestValidator extends Validator |
||||
{ |
||||
private $_validatedAttributes = array(); |
||||
private $_setErrorOnValidateAttribute = false; |
||||
|
||||
public function validateAttribute($object, $attribute) |
||||
{ |
||||
$this->markAttributeValidated($attribute); |
||||
if ($this->_setErrorOnValidateAttribute == true) { |
||||
$this->addError($object, $attribute, sprintf('%s##%s', $attribute, get_class($object))); |
||||
} |
||||
} |
||||
|
||||
protected function markAttributeValidated($attr, $increaseBy = 1) |
||||
{ |
||||
if (!isset($this->_validatedAttributes[$attr])) { |
||||
$this->_validatedAttributes[$attr] = 1; |
||||
} else { |
||||
$this->_validatedAttributes[$attr] = $this->_validatedAttributes[$attr] + $increaseBy; |
||||
} |
||||
} |
||||
|
||||
public function countAttributeValidations($attr) |
||||
{ |
||||
return isset($this->_validatedAttributes[$attr]) ? $this->_validatedAttributes[$attr] : 0; |
||||
} |
||||
|
||||
public function isAttributeValidated($attr) |
||||
{ |
||||
return isset($this->_validatedAttributes[$attr]); |
||||
} |
||||
|
||||
public function enableErrorOnValidateAttribute() |
||||
{ |
||||
$this->_setErrorOnValidateAttribute = true; |
||||
} |
||||
} |
@ -0,0 +1,227 @@
|
||||
<?php |
||||
|
||||
namespace yiiunit\framework\validators; |
||||
|
||||
|
||||
use yii\validators\BooleanValidator; |
||||
use yii\validators\InlineValidator; |
||||
use yii\validators\NumberValidator; |
||||
use yiiunit\data\validators\models\FakedValidationModel; |
||||
use yiiunit\data\validators\TestValidator; |
||||
use yiiunit\TestCase; |
||||
|
||||
class ValidatorTest extends TestCase |
||||
{ |
||||
|
||||
protected function getTestModel($additionalAttributes = array()) |
||||
{ |
||||
$attributes = array_merge( |
||||
array('attr_runMe1' => true, 'attr_runMe2' => true, 'attr_skip' => true), |
||||
$additionalAttributes |
||||
); |
||||
return FakedValidationModel::createWithAttributes($attributes); |
||||
} |
||||
|
||||
public function testCreateValidator() |
||||
{ |
||||
$model = FakedValidationModel::createWithAttributes(array('attr_test1' => 'abc', 'attr_test2' => '2013')); |
||||
/** @var $numberVal NumberValidator */ |
||||
$numberVal = TestValidator::createValidator('number', $model, array('attr_test1')); |
||||
$this->assertInstanceOf(NumberValidator::className(), $numberVal); |
||||
$numberVal = TestValidator::createValidator('integer', $model, array('attr_test2')); |
||||
$this->assertInstanceOf(NumberValidator::className(), $numberVal); |
||||
$this->assertTrue($numberVal->integerOnly); |
||||
$val = TestValidator::createValidator( |
||||
'boolean', |
||||
$model, |
||||
'attr_test1, attr_test2', |
||||
array('on' => array('a', 'b')) |
||||
); |
||||
$this->assertInstanceOf(BooleanValidator::className(), $val); |
||||
$this->assertSame(array('a', 'b'), $val->on); |
||||
$this->assertSame(array('attr_test1', 'attr_test2'), $val->attributes); |
||||
$val = TestValidator::createValidator( |
||||
'boolean', |
||||
$model, |
||||
'attr_test1, attr_test2', |
||||
array('on' => 'a, b', 'except' => 'c,d,e') |
||||
); |
||||
$this->assertInstanceOf(BooleanValidator::className(), $val); |
||||
$this->assertSame(array('a', 'b'), $val->on); |
||||
$this->assertSame(array('c', 'd', 'e'), $val->except); |
||||
$val = TestValidator::createValidator('inlineVal', $model, 'val_attr_a'); |
||||
$this->assertInstanceOf(InlineValidator::className(), $val); |
||||
$this->assertSame('inlineVal', $val->method); |
||||
} |
||||
|
||||
public function testValidate() |
||||
{ |
||||
$val = new TestValidator(array('attributes' => array('attr_runMe1', 'attr_runMe2'))); |
||||
$model = $this->getTestModel(); |
||||
$val->validate($model); |
||||
$this->assertTrue($val->isAttributeValidated('attr_runMe1')); |
||||
$this->assertTrue($val->isAttributeValidated('attr_runMe2')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_skip')); |
||||
} |
||||
|
||||
public function testValidateWithAttributeIntersect() |
||||
{ |
||||
$val = new TestValidator(array('attributes' => array('attr_runMe1', 'attr_runMe2'))); |
||||
$model = $this->getTestModel(); |
||||
$val->validate($model, array('attr_runMe1')); |
||||
$this->assertTrue($val->isAttributeValidated('attr_runMe1')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_runMe2')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_skip')); |
||||
} |
||||
|
||||
public function testValidateWithEmptyAttributes() |
||||
{ |
||||
$val = new TestValidator(); |
||||
$model = $this->getTestModel(); |
||||
$val->validate($model, array('attr_runMe1')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_runMe1')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_runMe2')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_skip')); |
||||
$val->validate($model); |
||||
$this->assertFalse($val->isAttributeValidated('attr_runMe1')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_runMe2')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_skip')); |
||||
} |
||||
|
||||
public function testValidateWithError() |
||||
{ |
||||
$val = new TestValidator(array('attributes' => array('attr_runMe1', 'attr_runMe2'), 'skipOnError' => false)); |
||||
$model = $this->getTestModel(); |
||||
$val->validate($model); |
||||
$this->assertTrue($val->isAttributeValidated('attr_runMe1')); |
||||
$this->assertTrue($val->isAttributeValidated('attr_runMe2')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_skip')); |
||||
$this->assertEquals(1, $val->countAttributeValidations('attr_runMe2')); |
||||
$this->assertEquals(1, $val->countAttributeValidations('attr_runMe1')); |
||||
$val->validate($model, array('attr_runMe2')); |
||||
$this->assertEquals(2, $val->countAttributeValidations('attr_runMe2')); |
||||
$this->assertEquals(1, $val->countAttributeValidations('attr_runMe1')); |
||||
$this->assertEquals(0, $val->countAttributeValidations('attr_skip')); |
||||
$val = new TestValidator(array('attributes' => array('attr_runMe1', 'attr_runMe2'), 'skipOnError' => true)); |
||||
$model = $this->getTestModel(); |
||||
$val->enableErrorOnValidateAttribute(); |
||||
$val->validate($model); |
||||
$this->assertTrue($val->isAttributeValidated('attr_runMe1')); |
||||
$this->assertTrue($val->isAttributeValidated('attr_runMe2')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_skip')); |
||||
$this->assertEquals(1, $val->countAttributeValidations('attr_runMe1')); |
||||
$this->assertEquals(1, $val->countAttributeValidations('attr_runMe1')); |
||||
$this->assertEquals(0, $val->countAttributeValidations('attr_skip')); |
||||
$val->validate($model, array('attr_runMe2')); |
||||
$this->assertEquals(1, $val->countAttributeValidations('attr_runMe2')); |
||||
$this->assertEquals(1, $val->countAttributeValidations('attr_runMe1')); |
||||
$this->assertEquals(0, $val->countAttributeValidations('attr_skip')); |
||||
} |
||||
|
||||
public function testValidateWithEmpty() |
||||
{ |
||||
$val = new TestValidator(array( |
||||
'attributes' => array( |
||||
'attr_runMe1', |
||||
'attr_runMe2', |
||||
'attr_empty1', |
||||
'attr_empty2' |
||||
), |
||||
'skipOnEmpty' => true, |
||||
)); |
||||
$model = $this->getTestModel(array('attr_empty1' => '', 'attr_emtpy2' => ' ')); |
||||
$val->validate($model); |
||||
$this->assertTrue($val->isAttributeValidated('attr_runMe1')); |
||||
$this->assertTrue($val->isAttributeValidated('attr_runMe2')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_empty1')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_empty2')); |
||||
$model->attr_empty1 = 'not empty anymore'; |
||||
$val->validate($model); |
||||
$this->assertTrue($val->isAttributeValidated('attr_empty1')); |
||||
$this->assertFalse($val->isAttributeValidated('attr_empty2')); |
||||
$val = new TestValidator(array( |
||||
'attributes' => array( |
||||
'attr_runMe1', |
||||
'attr_runMe2', |
||||
'attr_empty1', |
||||
'attr_empty2' |
||||
), |
||||
'skipOnEmpty' => false, |
||||
)); |
||||
$model = $this->getTestModel(array('attr_empty1' => '', 'attr_emtpy2' => ' ')); |
||||
$val->validate($model); |
||||
$this->assertTrue($val->isAttributeValidated('attr_runMe1')); |
||||
$this->assertTrue($val->isAttributeValidated('attr_runMe2')); |
||||
$this->assertTrue($val->isAttributeValidated('attr_empty1')); |
||||
$this->assertTrue($val->isAttributeValidated('attr_empty2')); |
||||
} |
||||
|
||||
public function testIsEmpty() |
||||
{ |
||||
$val = new TestValidator(); |
||||
$this->assertTrue($val->isEmpty(null)); |
||||
$this->assertTrue($val->isEmpty(array())); |
||||
$this->assertTrue($val->isEmpty('')); |
||||
$this->assertFalse($val->isEmpty(5)); |
||||
$this->assertFalse($val->isEmpty(0)); |
||||
$this->assertFalse($val->isEmpty(new \stdClass())); |
||||
$this->assertFalse($val->isEmpty(' ')); |
||||
// trim |
||||
$this->assertTrue($val->isEmpty(' ', true)); |
||||
$this->assertTrue($val->isEmpty('', true)); |
||||
$this->assertTrue($val->isEmpty(" \t\n\r\0\x0B", true)); |
||||
$this->assertTrue($val->isEmpty('', true)); |
||||
$this->assertFalse($val->isEmpty('0', true)); |
||||
$this->assertFalse($val->isEmpty(0, true)); |
||||
$this->assertFalse($val->isEmpty('this ain\'t an empty value', true)); |
||||
} |
||||
|
||||
public function testValidateValue() |
||||
{ |
||||
$this->setExpectedException( |
||||
'yii\base\NotSupportedException', |
||||
TestValidator::className() . ' does not support validateValue().' |
||||
); |
||||
$val = new TestValidator(); |
||||
$val->validateValue('abc'); |
||||
} |
||||
|
||||
public function testClientValidateAttribute() |
||||
{ |
||||
$val = new TestValidator(); |
||||
$this->assertNull( |
||||
$val->clientValidateAttribute($this->getTestModel(), 'attr_runMe1', array()) |
||||
); //todo pass a view instead of array |
||||
} |
||||
|
||||
public function testIsActive() |
||||
{ |
||||
$val = new TestValidator(); |
||||
$this->assertTrue($val->isActive('scenA')); |
||||
$this->assertTrue($val->isActive('scenB')); |
||||
$val->except = array('scenB'); |
||||
$this->assertTrue($val->isActive('scenA')); |
||||
$this->assertFalse($val->isActive('scenB')); |
||||
$val->on = array('scenC'); |
||||
$this->assertFalse($val->isActive('scenA')); |
||||
$this->assertFalse($val->isActive('scenB')); |
||||
$this->assertTrue($val->isActive('scenC')); |
||||
} |
||||
|
||||
public function testAddError() |
||||
{ |
||||
$val = new TestValidator(); |
||||
$m = $this->getTestModel(array('attr_msg_val' => 'abc')); |
||||
$val->addError($m, 'attr_msg_val', '{attribute}::{value}'); |
||||
$errors = $m->getErrors('attr_msg_val'); |
||||
$this->assertEquals('attr_msg_val::abc', $errors[0]); |
||||
$m = $this->getTestModel(array('attr_msg_val' => array('bcc'))); |
||||
$val->addError($m, 'attr_msg_val', '{attribute}::{value}'); |
||||
$errors = $m->getErrors('attr_msg_val'); |
||||
$this->assertEquals('attr_msg_val::array()', $errors[0]); |
||||
$m = $this->getTestModel(array('attr_msg_val' => 'abc')); |
||||
$val->addError($m, 'attr_msg_val', '{attribute}::{value}::{param}', array('{param}' => 'param_value')); |
||||
$errors = $m->getErrors('attr_msg_val'); |
||||
$this->assertEquals('attr_msg_val::abc::param_value', $errors[0]); |
||||
} |
||||
} |
Loading…
Reference in new issue