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.
		
		
		
		
		
			
		
			
				
					
					
						
							137 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
	
	
							137 lines
						
					
					
						
							4.2 KiB
						
					
					
				<?php | 
						|
 | 
						|
namespace yiiunit\framework\validators; | 
						|
 | 
						|
 | 
						|
use yii\validators\UniqueValidator; | 
						|
use Yii; | 
						|
use yiiunit\data\ar\ActiveRecord; | 
						|
use yiiunit\data\ar\Order; | 
						|
use yiiunit\data\ar\OrderItem; | 
						|
use yiiunit\data\validators\models\FakedValidationModel; | 
						|
use yiiunit\data\validators\models\ValidatorTestMainModel; | 
						|
use yiiunit\data\validators\models\ValidatorTestRefModel; | 
						|
use yiiunit\framework\db\DatabaseTestCase; | 
						|
 | 
						|
class UniqueValidatorTest extends DatabaseTestCase | 
						|
{ | 
						|
	protected $driverName = 'mysql'; | 
						|
 | 
						|
	public function setUp() | 
						|
	{ | 
						|
		parent::setUp(); | 
						|
		$this->mockApplication(); | 
						|
		ActiveRecord::$db = $this->getConnection(); | 
						|
	} | 
						|
 | 
						|
	public function testAssureMessageSetOnInit() | 
						|
	{ | 
						|
		$val = new UniqueValidator(); | 
						|
		$this->assertTrue(is_string($val->message)); | 
						|
	} | 
						|
 | 
						|
	public function testValidateAttributeDefault() | 
						|
	{ | 
						|
		$val = new UniqueValidator(); | 
						|
		$m = ValidatorTestMainModel::find()->one(); | 
						|
		$val->validateAttribute($m, 'id'); | 
						|
		$this->assertFalse($m->hasErrors('id')); | 
						|
		$m = ValidatorTestRefModel::find(1); | 
						|
		$val->validateAttribute($m, 'ref'); | 
						|
		$this->assertTrue($m->hasErrors('ref')); | 
						|
		// new record: | 
						|
		$m = new ValidatorTestRefModel(); | 
						|
		$m->ref = 5; | 
						|
		$val->validateAttribute($m, 'ref'); | 
						|
		$this->assertTrue($m->hasErrors('ref')); | 
						|
		$m = new ValidatorTestRefModel(); | 
						|
		$m->id = 7; | 
						|
		$m->ref = 12121; | 
						|
		$val->validateAttribute($m, 'ref'); | 
						|
		$this->assertFalse($m->hasErrors('ref')); | 
						|
		$m->save(false); | 
						|
		$val->validateAttribute($m, 'ref'); | 
						|
		$this->assertFalse($m->hasErrors('ref')); | 
						|
		// array error | 
						|
		$m = FakedValidationModel::createWithAttributes(['attr_arr' => ['a', 'b']]); | 
						|
		$val->validateAttribute($m, 'attr_arr'); | 
						|
		$this->assertTrue($m->hasErrors('attr_arr')); | 
						|
	} | 
						|
 | 
						|
	public function testValidateAttributeOfNonARModel() | 
						|
	{ | 
						|
		$val = new UniqueValidator(['targetClass' => ValidatorTestRefModel::className(), 'targetAttribute' => 'ref']); | 
						|
		$m = FakedValidationModel::createWithAttributes(['attr_1' => 5, 'attr_2' => 1313]); | 
						|
		$val->validateAttribute($m, 'attr_1'); | 
						|
		$this->assertTrue($m->hasErrors('attr_1')); | 
						|
		$val->validateAttribute($m, 'attr_2'); | 
						|
		$this->assertFalse($m->hasErrors('attr_2')); | 
						|
	} | 
						|
 | 
						|
	public function testValidateNonDatabaseAttribute() | 
						|
	{ | 
						|
		$val = new UniqueValidator(['targetClass' => ValidatorTestRefModel::className(), 'targetAttribute' => 'ref']); | 
						|
		$m = ValidatorTestMainModel::find(1); | 
						|
		$val->validateAttribute($m, 'testMainVal'); | 
						|
		$this->assertFalse($m->hasErrors('testMainVal')); | 
						|
		$m = ValidatorTestMainModel::find(1); | 
						|
		$m->testMainVal = 4; | 
						|
		$val->validateAttribute($m, 'testMainVal'); | 
						|
		$this->assertTrue($m->hasErrors('testMainVal')); | 
						|
	} | 
						|
 | 
						|
	public function testValidateAttributeAttributeNotInTableException() | 
						|
	{ | 
						|
		$this->setExpectedException('yii\db\Exception'); | 
						|
		$val = new UniqueValidator(); | 
						|
		$m = new ValidatorTestMainModel(); | 
						|
		$val->validateAttribute($m, 'testMainVal'); | 
						|
	} | 
						|
 | 
						|
	public function testValidateCompositeKeys() | 
						|
	{ | 
						|
		$val = new UniqueValidator([ | 
						|
			'targetClass' => OrderItem::className(), | 
						|
			'targetAttribute' => ['order_id', 'item_id'], | 
						|
		]); | 
						|
		// validate old record | 
						|
		$m = OrderItem::find(['order_id' => 1, 'item_id' => 2]); | 
						|
		$val->validateAttribute($m, 'order_id'); | 
						|
		$this->assertFalse($m->hasErrors('order_id')); | 
						|
		$m->item_id = 1; | 
						|
		$val->validateAttribute($m, 'order_id'); | 
						|
		$this->assertTrue($m->hasErrors('order_id')); | 
						|
 | 
						|
		// validate new record | 
						|
		$m = new OrderItem(['order_id' => 1, 'item_id' => 2]); | 
						|
		$val->validateAttribute($m, 'order_id'); | 
						|
		$this->assertTrue($m->hasErrors('order_id')); | 
						|
		$m = new OrderItem(['order_id' => 10, 'item_id' => 2]); | 
						|
		$val->validateAttribute($m, 'order_id'); | 
						|
		$this->assertFalse($m->hasErrors('order_id')); | 
						|
 | 
						|
		$val = new UniqueValidator([ | 
						|
			'targetClass' => OrderItem::className(), | 
						|
			'targetAttribute' => ['id' => 'order_id'], | 
						|
		]); | 
						|
		// validate old record | 
						|
		$m = Order::find(1); | 
						|
		$val->validateAttribute($m, 'id'); | 
						|
		$this->assertTrue($m->hasErrors('id')); | 
						|
		$m = Order::find(1); | 
						|
		$m->id = 2; | 
						|
		$val->validateAttribute($m, 'id'); | 
						|
		$this->assertTrue($m->hasErrors('id')); | 
						|
		$m = Order::find(1); | 
						|
		$m->id = 10; | 
						|
		$val->validateAttribute($m, 'id'); | 
						|
		$this->assertFalse($m->hasErrors('id')); | 
						|
 | 
						|
		$m = new Order(['id' => 1]); | 
						|
		$val->validateAttribute($m, 'id'); | 
						|
		$this->assertTrue($m->hasErrors('id')); | 
						|
		$m = new Order(['id' => 10]); | 
						|
		$val->validateAttribute($m, 'id'); | 
						|
		$this->assertFalse($m->hasErrors('id')); | 
						|
	} | 
						|
}
 | 
						|
 |