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::findOne(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::findOne(1); $val->validateAttribute($m, 'testMainVal'); $this->assertFalse($m->hasErrors('testMainVal')); $m = ValidatorTestMainModel::findOne(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::findOne(['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::findOne(1); $val->validateAttribute($m, 'id'); $this->assertTrue($m->hasErrors('id')); $m = Order::findOne(1); $m->id = 2; $val->validateAttribute($m, 'id'); $this->assertTrue($m->hasErrors('id')); $m = Order::findOne(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')); } }