mockApplication(); ActiveRecord::$db = $this->getConnection(); } public function testValidateValueExpectedException() { try { $val = new ExistValidator(); $result = $val->validate('ref'); $this->fail('Exception should have been thrown at this time'); } catch (Exception $e) { $this->assertInstanceOf('yii\base\InvalidConfigException', $e); $this->assertEquals('The "className" property must be set.', $e->getMessage()); } // combine to save the time creating a new db-fixture set (likely ~5 sec) try { $val = new ExistValidator(['className' => ValidatorTestMainModel::className()]); $val->validate('ref'); $this->fail('Exception should have been thrown at this time'); } catch (Exception $e) { $this->assertInstanceOf('yii\base\InvalidConfigException', $e); $this->assertEquals('The "attributeName" property must be set.', $e->getMessage()); } } public function testValidateValue() { $val = new ExistValidator(['className' => ValidatorTestRefModel::className(), 'attributeName' => 'id']); $this->assertTrue($val->validate(2)); $this->assertTrue($val->validate(5)); $this->assertFalse($val->validate(99)); $this->assertFalse($val->validate(['1'])); } public function testValidateAttribute() { // existing value on different table $val = new ExistValidator(['className' => ValidatorTestMainModel::className(), 'attributeName' => 'id']); $m = ValidatorTestRefModel::find(['id' => 1]); $val->validateAttribute($m, 'ref'); $this->assertFalse($m->hasErrors()); // non-existing value on different table $val = new ExistValidator(['className' => ValidatorTestMainModel::className(), 'attributeName' => 'id']); $m = ValidatorTestRefModel::find(['id' => 6]); $val->validateAttribute($m, 'ref'); $this->assertTrue($m->hasErrors('ref')); // existing value on same table $val = new ExistValidator(['attributeName' => 'ref']); $m = ValidatorTestRefModel::find(['id' => 2]); $val->validateAttribute($m, 'test_val'); $this->assertFalse($m->hasErrors()); // non-existing value on same table $val = new ExistValidator(['attributeName' => 'ref']); $m = ValidatorTestRefModel::find(['id' => 5]); $val->validateAttribute($m, 'test_val_fail'); $this->assertTrue($m->hasErrors('test_val_fail')); // check for given value (true) $val = new ExistValidator(); $m = ValidatorTestRefModel::find(['id' => 3]); $val->validateAttribute($m, 'ref'); $this->assertFalse($m->hasErrors()); // check for given defaults (false) $val = new ExistValidator(); $m = ValidatorTestRefModel::find(['id' => 4]); $m->a_field = 'some new value'; $val->validateAttribute($m, 'a_field'); $this->assertTrue($m->hasErrors('a_field')); // check array $val = new ExistValidator(['attributeName' => 'ref']); $m = ValidatorTestRefModel::find(['id' => 2]); $m->test_val = [1,2,3]; $val->validateAttribute($m, 'test_val'); $this->assertTrue($m->hasErrors('test_val')); } public function testValidateCompositeKeys() { $val = new ExistValidator([ 'className' => OrderItem::className(), 'attributeName' => ['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')); // validate new record $m = new OrderItem(['order_id' => 1, 'item_id' => 2]); $val->validateAttribute($m, 'order_id'); $this->assertFalse($m->hasErrors('order_id')); $m = new OrderItem(['order_id' => 10, 'item_id' => 2]); $val->validateAttribute($m, 'order_id'); $this->assertTrue($m->hasErrors('order_id')); $val = new ExistValidator([ 'className' => OrderItem::className(), 'attributeName' => ['order_id', 'item_id' => 2], ]); // validate old record $m = Order::find(1); $val->validateAttribute($m, 'id'); $this->assertFalse($m->hasErrors('id')); $m = Order::find(1); $m->id = 10; $val->validateAttribute($m, 'id'); $this->assertTrue($m->hasErrors('id')); $m = new Order(['id' => 1]); $val->validateAttribute($m, 'id'); $this->assertFalse($m->hasErrors('id')); $m = new Order(['id' => 10]); $val->validateAttribute($m, 'id'); $this->assertTrue($m->hasErrors('id')); } }