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.5 KiB
						
					
					
				
			
		
		
	
	
							227 lines
						
					
					
						
							8.5 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 = []) | 
						|
	{ | 
						|
		$attributes = array_merge( | 
						|
			['attr_runMe1' => true, 'attr_runMe2' => true, 'attr_skip' => true], | 
						|
			$additionalAttributes | 
						|
		); | 
						|
		return FakedValidationModel::createWithAttributes($attributes); | 
						|
	} | 
						|
 | 
						|
	public function testCreateValidator() | 
						|
	{ | 
						|
		$model = FakedValidationModel::createWithAttributes(['attr_test1' => 'abc', 'attr_test2' => '2013']); | 
						|
		/** @var $numberVal NumberValidator */ | 
						|
		$numberVal = TestValidator::createValidator('number', $model, ['attr_test1']); | 
						|
		$this->assertInstanceOf(NumberValidator::className(), $numberVal); | 
						|
		$numberVal = TestValidator::createValidator('integer', $model, ['attr_test2']); | 
						|
		$this->assertInstanceOf(NumberValidator::className(), $numberVal); | 
						|
		$this->assertTrue($numberVal->integerOnly); | 
						|
		$val = TestValidator::createValidator( | 
						|
			'boolean', | 
						|
			$model, | 
						|
			'attr_test1, attr_test2', | 
						|
			['on' => ['a', 'b']] | 
						|
		); | 
						|
		$this->assertInstanceOf(BooleanValidator::className(), $val); | 
						|
		$this->assertSame(['a', 'b'], $val->on); | 
						|
		$this->assertSame(['attr_test1', 'attr_test2'], $val->attributes); | 
						|
		$val = TestValidator::createValidator( | 
						|
			'boolean', | 
						|
			$model, | 
						|
			'attr_test1, attr_test2', | 
						|
			['on' => 'a, b', 'except' => 'c,d,e'] | 
						|
		); | 
						|
		$this->assertInstanceOf(BooleanValidator::className(), $val); | 
						|
		$this->assertSame(['a', 'b'], $val->on); | 
						|
		$this->assertSame(['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(['attributes' => ['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(['attributes' => ['attr_runMe1', 'attr_runMe2']]); | 
						|
		$model = $this->getTestModel(); | 
						|
		$val->validate($model, ['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, ['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(['attributes' => ['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, ['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(['attributes' => ['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, ['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([ | 
						|
			'attributes' => [ | 
						|
				'attr_runMe1', | 
						|
				'attr_runMe2', | 
						|
				'attr_empty1', | 
						|
				'attr_empty2' | 
						|
			], | 
						|
			'skipOnEmpty' => true, | 
						|
		]); | 
						|
		$model = $this->getTestModel(['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([ | 
						|
			'attributes' => [ | 
						|
				'attr_runMe1', | 
						|
				'attr_runMe2', | 
						|
				'attr_empty1', | 
						|
				'attr_empty2' | 
						|
			], | 
						|
			'skipOnEmpty' => false, | 
						|
		]); | 
						|
		$model = $this->getTestModel(['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([])); | 
						|
		$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', []) | 
						|
		); //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 = ['scenB']; | 
						|
		$this->assertTrue($val->isActive('scenA')); | 
						|
		$this->assertFalse($val->isActive('scenB')); | 
						|
		$val->on = ['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(['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(['attr_msg_val' => ['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(['attr_msg_val' => 'abc']); | 
						|
		$val->addError($m, 'attr_msg_val', '{attribute}::{value}::{param}', ['{param}' => 'param_value']); | 
						|
		$errors = $m->getErrors('attr_msg_val'); | 
						|
		$this->assertEquals('attr_msg_val::abc::param_value', $errors[0]); | 
						|
	} | 
						|
} |