ExistValidatorTest.php 4.67 KB
Newer Older
1 2 3 4 5 6 7 8 9
<?php

namespace yiiunit\framework\validators;


use Yii;
use yii\base\Exception;
use yii\validators\ExistValidator;
use yiiunit\data\ar\ActiveRecord;
10 11
use yiiunit\data\ar\Order;
use yiiunit\data\ar\OrderItem;
12 13
use yiiunit\data\validators\models\ValidatorTestMainModel;
use yiiunit\data\validators\models\ValidatorTestRefModel;
14 15 16 17 18 19 20 21 22
use yiiunit\framework\db\DatabaseTestCase;

class ExistValidatorTest extends DatabaseTestCase
{
	protected $driverName = 'mysql';

	public function setUp()
	{
		parent::setUp();
23
		$this->mockApplication();
24
		ActiveRecord::$db = $this->getConnection();
25 26 27 28 29 30
	}

	public function testValidateValueExpectedException()
	{
		try {
			$val = new ExistValidator();
Qiang Xue committed
31
			$result = $val->validate('ref');
32 33 34 35 36 37 38
			$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 {
39
			$val = new ExistValidator(['targetClass' => ValidatorTestMainModel::className()]);
Qiang Xue committed
40
			$val->validate('ref');
41 42 43
			$this->fail('Exception should have been thrown at this time');
		} catch (Exception $e) {
			$this->assertInstanceOf('yii\base\InvalidConfigException', $e);
44
			$this->assertEquals('The "attributeName" property must be configured as a string.', $e->getMessage());
45 46 47 48 49
		}
	}

	public function testValidateValue()
	{
50
		$val = new ExistValidator(['targetClass' => ValidatorTestRefModel::className(), 'targetAttribute' => 'id']);
Qiang Xue committed
51 52 53 54
		$this->assertTrue($val->validate(2));
		$this->assertTrue($val->validate(5));
		$this->assertFalse($val->validate(99));
		$this->assertFalse($val->validate(['1']));
55 56 57 58 59
	}

	public function testValidateAttribute()
	{
		// existing value on different table
60
		$val = new ExistValidator(['targetClass' => ValidatorTestMainModel::className(), 'targetAttribute' => 'id']);
Alexander Makarov committed
61
		$m = ValidatorTestRefModel::find(['id' => 1]);
62 63 64
		$val->validateAttribute($m, 'ref');
		$this->assertFalse($m->hasErrors());
		// non-existing value on different table
65
		$val = new ExistValidator(['targetClass' => ValidatorTestMainModel::className(), 'targetAttribute' => 'id']);
Alexander Makarov committed
66
		$m = ValidatorTestRefModel::find(['id' => 6]);
67 68 69
		$val->validateAttribute($m, 'ref');
		$this->assertTrue($m->hasErrors('ref'));
		// existing value on same table
70
		$val = new ExistValidator(['targetAttribute' => 'ref']);
Alexander Makarov committed
71
		$m = ValidatorTestRefModel::find(['id' => 2]);
72 73 74
		$val->validateAttribute($m, 'test_val');
		$this->assertFalse($m->hasErrors());
		// non-existing value on same table
75
		$val = new ExistValidator(['targetAttribute' => 'ref']);
Alexander Makarov committed
76
		$m = ValidatorTestRefModel::find(['id' => 5]);
77 78 79 80
		$val->validateAttribute($m, 'test_val_fail');
		$this->assertTrue($m->hasErrors('test_val_fail'));
		// check for given value (true)
		$val = new ExistValidator();
Alexander Makarov committed
81
		$m = ValidatorTestRefModel::find(['id' => 3]);
82 83 84 85
		$val->validateAttribute($m, 'ref');
		$this->assertFalse($m->hasErrors());
		// check for given defaults (false)
		$val = new ExistValidator();
Alexander Makarov committed
86
		$m = ValidatorTestRefModel::find(['id' => 4]);
87 88 89
		$m->a_field = 'some new value';
		$val->validateAttribute($m, 'a_field');
		$this->assertTrue($m->hasErrors('a_field'));
90
		// check array
91
		$val = new ExistValidator(['targetAttribute' => 'ref']);
Alexander Makarov committed
92 93
		$m = ValidatorTestRefModel::find(['id' => 2]);
		$m->test_val = [1,2,3];
94 95
		$val->validateAttribute($m, 'test_val');
		$this->assertTrue($m->hasErrors('test_val'));
96
	}
97 98 99 100

	public function testValidateCompositeKeys()
	{
		$val = new ExistValidator([
101 102
			'targetClass' => OrderItem::className(),
			'targetAttribute' => ['order_id', 'item_id'],
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
		]);
		// 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([
118 119
			'targetClass' => OrderItem::className(),
			'targetAttribute' => ['id' => 'order_id'],
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
		]);
		// 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'));
	}
Qiang Xue committed
137
}