UniqueValidatorTest.php 4.22 KB
Newer Older
Suralc committed
1 2 3 4 5 6 7 8
<?php

namespace yiiunit\framework\validators;


use yii\validators\UniqueValidator;
use Yii;
use yiiunit\data\ar\ActiveRecord;
9 10
use yiiunit\data\ar\Order;
use yiiunit\data\ar\OrderItem;
Suralc committed
11 12 13 14 15 16 17 18 19 20 21 22
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();
23
		$this->mockApplication();
24
		ActiveRecord::$db = $this->getConnection();
Suralc committed
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
	}

	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();
Suralc committed
48
		$m->id = 7;
Suralc committed
49 50 51 52 53 54 55
		$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
Alexander Makarov committed
56
		$m = FakedValidationModel::createWithAttributes(['attr_arr' => ['a', 'b']]);
Suralc committed
57 58 59 60 61 62
		$val->validateAttribute($m, 'attr_arr');
		$this->assertTrue($m->hasErrors('attr_arr'));
	}

	public function testValidateAttributeOfNonARModel()
	{
63
		$val = new UniqueValidator(['targetClass' => ValidatorTestRefModel::className(), 'targetAttribute' => 'ref']);
Alexander Makarov committed
64
		$m = FakedValidationModel::createWithAttributes(['attr_1' => 5, 'attr_2' => 1313]);
Suralc committed
65 66 67 68 69 70 71 72
		$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()
	{
73
		$val = new UniqueValidator(['targetClass' => ValidatorTestRefModel::className(), 'targetAttribute' => 'ref']);
Suralc committed
74 75 76 77 78 79 80 81 82 83 84
		$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()
	{
85
		$this->setExpectedException('yii\db\Exception');
Suralc committed
86 87 88 89
		$val = new UniqueValidator();
		$m = new ValidatorTestMainModel();
		$val->validateAttribute($m, 'testMainVal');
	}
90 91 92 93

	public function testValidateCompositeKeys()
	{
		$val = new UniqueValidator([
94 95
			'targetClass' => OrderItem::className(),
			'targetAttribute' => ['order_id', 'item_id'],
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
		]);
		// 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([
114 115
			'targetClass' => OrderItem::className(),
			'targetAttribute' => ['id' => 'order_id'],
116 117 118 119
		]);
		// validate old record
		$m = Order::find(1);
		$val->validateAttribute($m, 'id');
120 121
		$this->assertTrue($m->hasErrors('id'));
		$m = Order::find(1);
122 123 124
		$m->id = 2;
		$val->validateAttribute($m, 'id');
		$this->assertTrue($m->hasErrors('id'));
125 126 127 128
		$m = Order::find(1);
		$m->id = 10;
		$val->validateAttribute($m, 'id');
		$this->assertFalse($m->hasErrors('id'));
129 130 131 132 133 134 135 136

		$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'));
	}
137
}