You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							227 lines
						
					
					
						
							8.7 KiB
						
					
					
				
			
		
		
	
	
							227 lines
						
					
					
						
							8.7 KiB
						
					
					
				| <?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]); | |
| 	} | |
| } |