SluggableBehaviorTest.php 5.15 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
<?php

namespace yiiunit\framework\behaviors;

use Yii;
use yiiunit\TestCase;
use yii\db\Connection;
use yii\db\ActiveRecord;
use yii\behaviors\SluggableBehavior;

/**
 * Unit test for [[\yii\behaviors\SluggableBehavior]].
 * @see SluggableBehavior
 *
 * @group behaviors
 */
class SluggableBehaviorTest extends TestCase
{
    /**
     * @var Connection test db connection
     */
    protected $dbConnection;

    public static function setUpBeforeClass()
    {
        if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) {
            static::markTestSkipped('PDO and SQLite extensions are required.');
        }
    }

    public function setUp()
    {
        $this->mockApplication([
            'components' => [
                'db' => [
                    'class' => '\yii\db\Connection',
                    'dsn' => 'sqlite::memory:',
                ]
            ]
        ]);

        $columns = [
            'id' => 'pk',
            'name' => 'string',
            'slug' => 'string',
            'category_id' => 'integer',
        ];
        Yii::$app->getDb()->createCommand()->createTable('test_slug', $columns)->execute();
    }

    public function tearDown()
    {
        Yii::$app->getDb()->close();
        parent::tearDown();
    }

    // Tests :

    public function testSlug()
    {
        $model = new ActiveRecordSluggable();
        $model->name = 'test name';
        $model->validate();

        $this->assertEquals('test-name', $model->slug);
    }

    /**
     * @depends testSlug
     */
    public function testSlugSeveralAttributes()
    {
        $model = new ActiveRecordSluggable();
        $model->getBehavior('sluggable')->attribute = array('name', 'category_id');

        $model->name = 'test';
        $model->category_id = 10;

        $model->validate();
        $this->assertEquals('test-10', $model->slug);
    }

    /**
     * @depends testSlug
     */
    public function testUniqueByIncrement()
    {
        $name = 'test name';

90
        $model = new ActiveRecordSluggableUnique();
91 92 93
        $model->name = $name;
        $model->save();

94 95
        $model = new ActiveRecordSluggableUnique();
        $model->sluggable->uniqueSlugGenerator = 'increment';
96 97 98 99 100 101 102 103 104 105 106 107 108
        $model->name = $name;
        $model->save();

        $this->assertEquals('test-name-2', $model->slug);
    }

    /**
     * @depends testUniqueByIncrement
     */
    public function testUniqueByCallback()
    {
        $name = 'test name';

109
        $model = new ActiveRecordSluggableUnique();
110 111 112
        $model->name = $name;
        $model->save();

113
        $model = new ActiveRecordSluggableUnique();
114 115 116 117 118 119 120 121 122 123 124 125 126 127
        $model->sluggable->uniqueSlugGenerator = function($baseSlug, $iteration) {return $baseSlug . '-callback';};
        $model->name = $name;
        $model->save();

        $this->assertEquals('test-name-callback', $model->slug);
    }

    /**
     * @depends testUniqueByIncrement
     */
    public function testUniqueByUniqueId()
    {
        $name = 'test name';

128
        $model1 = new ActiveRecordSluggableUnique();
129 130 131
        $model1->name = $name;
        $model1->save();

132
        $model2 = new ActiveRecordSluggableUnique();
133 134 135 136 137 138 139 140 141 142 143 144 145 146
        $model2->sluggable->uniqueSlugGenerator = 'uniqueid';
        $model2->name = $name;
        $model2->save();

        $this->assertNotEquals($model2->slug, $model1->slug);
    }

    /**
     * @depends testUniqueByIncrement
     */
    public function testUniqueByTimestamp()
    {
        $name = 'test name';

147
        $model1 = new ActiveRecordSluggableUnique();
148 149 150
        $model1->name = $name;
        $model1->save();

151
        $model2 = new ActiveRecordSluggableUnique();
152 153 154 155 156 157
        $model2->sluggable->uniqueSlugGenerator = 'timestamp';
        $model2->name = $name;
        $model2->save();

        $this->assertNotEquals($model2->slug, $model1->slug);
    }
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174

    /**
     * @depends testSlug
     */
    public function testUpdateUnique()
    {
        $name = 'test name';

        $model = new ActiveRecordSluggableUnique();
        $model->name = $name;
        $model->save();

        $model = ActiveRecordSluggableUnique::find()->one();
        $model->save();

        $this->assertEquals('test-name', $model->slug);
    }
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
}

/**
 * Test Active Record class with [[SluggableBehavior]] behavior attached.
 *
 * @property integer $id
 * @property string $name
 * @property string $slug
 * @property integer $category_id
 *
 * @property SluggableBehavior $sluggable
 */
class ActiveRecordSluggable extends ActiveRecord
{
    public function behaviors()
    {
        return [
            'sluggable' => [
                'class' => SluggableBehavior::className(),
                'attribute' => 'name',
            ],
        ];
    }

    public static function tableName()
    {
        return 'test_slug';
    }

    /**
     * @return SluggableBehavior
     */
    public function getSluggable()
    {
        return $this->getBehavior('sluggable');
    }
211 212 213 214 215 216 217 218 219 220 221 222 223 224
}

class ActiveRecordSluggableUnique extends ActiveRecordSluggable
{
    public function behaviors()
    {
        return [
            'sluggable' => [
                'class' => SluggableBehavior::className(),
                'attribute' => 'name',
                'unique' => true,
            ],
        ];
    }
225
}