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

namespace yiiunit\framework\validators;

use Yii;
use yii\base\Exception;
use yii\validators\ExistValidator;
use yiiunit\data\ar\ActiveRecord;
9 10
use yiiunit\data\ar\Order;
use yiiunit\data\ar\OrderItem;
11 12
use yiiunit\data\validators\models\ValidatorTestMainModel;
use yiiunit\data\validators\models\ValidatorTestRefModel;
13 14
use yiiunit\framework\db\DatabaseTestCase;

15 16 17
/**
 * @group validators
 */
18 19
class ExistValidatorTest extends DatabaseTestCase
{
20
    protected $driverName = 'mysql';
21

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

29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
    public function testValidateValueExpectedException()
    {
        try {
            $val = new ExistValidator();
            $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 "targetClass" property must be set.', $e->getMessage());
        }
        // combine to save the time creating a new db-fixture set (likely ~5 sec)
        try {
            $val = new ExistValidator(['targetClass' => 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 "targetAttribute" property must be configured as a string.', $e->getMessage());
        }
    }
49

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

59 60 61 62
    public function testValidateAttribute()
    {
        // existing value on different table
        $val = new ExistValidator(['targetClass' => ValidatorTestMainModel::className(), 'targetAttribute' => 'id']);
63
        $m = ValidatorTestRefModel::findOne(['id' => 1]);
64 65 66 67
        $val->validateAttribute($m, 'ref');
        $this->assertFalse($m->hasErrors());
        // non-existing value on different table
        $val = new ExistValidator(['targetClass' => ValidatorTestMainModel::className(), 'targetAttribute' => 'id']);
68
        $m = ValidatorTestRefModel::findOne(['id' => 6]);
69 70 71 72
        $val->validateAttribute($m, 'ref');
        $this->assertTrue($m->hasErrors('ref'));
        // existing value on same table
        $val = new ExistValidator(['targetAttribute' => 'ref']);
73
        $m = ValidatorTestRefModel::findOne(['id' => 2]);
74 75 76 77
        $val->validateAttribute($m, 'test_val');
        $this->assertFalse($m->hasErrors());
        // non-existing value on same table
        $val = new ExistValidator(['targetAttribute' => 'ref']);
78
        $m = ValidatorTestRefModel::findOne(['id' => 5]);
79 80 81 82
        $val->validateAttribute($m, 'test_val_fail');
        $this->assertTrue($m->hasErrors('test_val_fail'));
        // check for given value (true)
        $val = new ExistValidator();
83
        $m = ValidatorTestRefModel::findOne(['id' => 3]);
84 85 86 87
        $val->validateAttribute($m, 'ref');
        $this->assertFalse($m->hasErrors());
        // check for given defaults (false)
        $val = new ExistValidator();
88
        $m = ValidatorTestRefModel::findOne(['id' => 4]);
89 90 91
        $m->a_field = 'some new value';
        $val->validateAttribute($m, 'a_field');
        $this->assertTrue($m->hasErrors('a_field'));
Alexander Kochetov committed
92
        // existing array
93
        $val = new ExistValidator(['targetAttribute' => 'ref']);
Alexander Kochetov committed
94
        $val->allowArray = true;
Alexander Kochetov committed
95 96
        $m = new ValidatorTestRefModel();
        $m->test_val = [2, 3, 4, 5];
97
        $val->validateAttribute($m, 'test_val');
Alexander Kochetov committed
98
        $this->assertFalse($m->hasErrors('test_val'));
Alexander Kochetov committed
99 100 101 102 103 104 105
        // non-existing array
        $val = new ExistValidator(['targetAttribute' => 'ref']);
        $val->allowArray = true;
        $m = new ValidatorTestRefModel();
        $m->test_val = [95, 96, 97, 98];
        $val->validateAttribute($m, 'test_val');
        $this->assertTrue($m->hasErrors('test_val'));
Alexander Kochetov committed
106 107 108 109 110 111 112
        // partial-existing array
        $val = new ExistValidator(['targetAttribute' => 'ref']);
        $val->allowArray = true;
        $m = new ValidatorTestRefModel();
        $m->test_val = [2, 97, 3, 98];
        $val->validateAttribute($m, 'test_val');
        $this->assertTrue($m->hasErrors('test_val'));
Alexander Kochetov committed
113 114 115 116 117 118 119 120 121 122 123 124 125 126
        // existing array (allowArray = false)
        $val = new ExistValidator(['targetAttribute' => 'ref']);
        $val->allowArray = false;
        $m = new ValidatorTestRefModel();
        $m->test_val = [2, 3, 4, 5];
        $val->validateAttribute($m, 'test_val');
        $this->assertTrue($m->hasErrors('test_val'));
        // non-existing array (allowArray = false)
        $val = new ExistValidator(['targetAttribute' => 'ref']);
        $val->allowArray = false;
        $m = new ValidatorTestRefModel();
        $m->test_val = [95, 96, 97, 98];
        $val->validateAttribute($m, 'test_val');
        $this->assertTrue($m->hasErrors('test_val'));
127
    }
128

129 130 131 132 133 134 135
    public function testValidateCompositeKeys()
    {
        $val = new ExistValidator([
            'targetClass' => OrderItem::className(),
            'targetAttribute' => ['order_id', 'item_id'],
        ]);
        // validate old record
Alexander Makarov committed
136
        $m = OrderItem::findOne(['order_id' => 1, 'item_id' => 2]);
137 138
        $val->validateAttribute($m, 'order_id');
        $this->assertFalse($m->hasErrors('order_id'));
139

140 141 142 143 144 145 146
        // 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'));
147

148 149 150 151 152
        $val = new ExistValidator([
            'targetClass' => OrderItem::className(),
            'targetAttribute' => ['id' => 'order_id'],
        ]);
        // validate old record
Alexander Makarov committed
153
        $m = Order::findOne(1);
154 155
        $val->validateAttribute($m, 'id');
        $this->assertFalse($m->hasErrors('id'));
Alexander Makarov committed
156
        $m = Order::findOne(1);
157 158 159
        $m->id = 10;
        $val->validateAttribute($m, 'id');
        $this->assertTrue($m->hasErrors('id'));
160

161 162 163 164 165 166 167
        $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
168
}