SortTest.php 4.23 KB
Newer Older
Qiang Xue committed
1 2 3 4 5 6 7 8
<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace yiiunit\framework\data;
Alexander Makarov committed
9

Qiang Xue committed
10 11 12 13 14 15 16
use yii\web\UrlManager;
use yiiunit\TestCase;
use yii\data\Sort;

/**
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
17 18
 *
 * @group data
Qiang Xue committed
19 20 21
 */
class SortTest extends TestCase
{
Carsten Brandt committed
22 23 24 25 26 27
	protected function setUp()
	{
		parent::setUp();
		$this->mockApplication();
	}

Qiang Xue committed
28 29
	public function testGetOrders()
	{
Alexander Makarov committed
30 31
		$sort = new Sort([
			'attributes' => [
Qiang Xue committed
32
				'age',
Alexander Makarov committed
33
				'name' => [
34 35
					'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
					'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
Alexander Makarov committed
36 37 38
				],
			],
			'params' => [
Qiang Xue committed
39
				'sort' => 'age.name-desc'
Alexander Makarov committed
40
			],
Qiang Xue committed
41
			'enableMultiSort' => true,
Alexander Makarov committed
42
		]);
Qiang Xue committed
43 44 45

		$orders = $sort->getOrders();
		$this->assertEquals(3, count($orders));
46 47 48
		$this->assertEquals(SORT_ASC, $orders['age']);
		$this->assertEquals(SORT_DESC, $orders['first_name']);
		$this->assertEquals(SORT_DESC, $orders['last_name']);
Qiang Xue committed
49 50 51 52

		$sort->enableMultiSort = false;
		$orders = $sort->getOrders(true);
		$this->assertEquals(1, count($orders));
53
		$this->assertEquals(SORT_ASC, $orders['age']);
Qiang Xue committed
54 55 56 57
	}

	public function testGetAttributeOrders()
	{
Alexander Makarov committed
58 59
		$sort = new Sort([
			'attributes' => [
Qiang Xue committed
60
				'age',
Alexander Makarov committed
61
				'name' => [
62 63
					'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
					'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
Alexander Makarov committed
64 65 66
				],
			],
			'params' => [
Qiang Xue committed
67
				'sort' => 'age.name-desc'
Alexander Makarov committed
68
			],
Qiang Xue committed
69
			'enableMultiSort' => true,
Alexander Makarov committed
70
		]);
Qiang Xue committed
71 72 73

		$orders = $sort->getAttributeOrders();
		$this->assertEquals(2, count($orders));
74 75
		$this->assertEquals(SORT_ASC, $orders['age']);
		$this->assertEquals(SORT_DESC, $orders['name']);
Qiang Xue committed
76 77 78 79

		$sort->enableMultiSort = false;
		$orders = $sort->getAttributeOrders(true);
		$this->assertEquals(1, count($orders));
80
		$this->assertEquals(SORT_ASC, $orders['age']);
Qiang Xue committed
81 82 83 84
	}

	public function testGetAttributeOrder()
	{
Alexander Makarov committed
85 86
		$sort = new Sort([
			'attributes' => [
Qiang Xue committed
87
				'age',
Alexander Makarov committed
88
				'name' => [
89 90
					'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
					'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
Alexander Makarov committed
91 92 93
				],
			],
			'params' => [
Qiang Xue committed
94
				'sort' => 'age.name-desc'
Alexander Makarov committed
95
			],
Qiang Xue committed
96
			'enableMultiSort' => true,
Alexander Makarov committed
97
		]);
Qiang Xue committed
98

99 100
		$this->assertEquals(SORT_ASC, $sort->getAttributeOrder('age'));
		$this->assertEquals(SORT_DESC, $sort->getAttributeOrder('name'));
Qiang Xue committed
101 102 103
		$this->assertNull($sort->getAttributeOrder('xyz'));
	}

Qiang Xue committed
104 105
	public function testCreateSortVar()
	{
Alexander Makarov committed
106 107
		$sort = new Sort([
			'attributes' => [
Qiang Xue committed
108
				'age',
Alexander Makarov committed
109
				'name' => [
110 111
					'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
					'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
Alexander Makarov committed
112 113 114
				],
			],
			'params' => [
Qiang Xue committed
115
				'sort' => 'age.name-desc'
Alexander Makarov committed
116
			],
Qiang Xue committed
117 118
			'enableMultiSort' => true,
			'route' => 'site/index',
Alexander Makarov committed
119
		]);
Qiang Xue committed
120 121 122 123 124

		$this->assertEquals('age-desc.name-desc', $sort->createSortVar('age'));
		$this->assertEquals('name.age', $sort->createSortVar('name'));
	}

Qiang Xue committed
125 126
	public function testCreateUrl()
	{
Alexander Makarov committed
127
		$manager = new UrlManager([
Qiang Xue committed
128 129
			'baseUrl' => '/index.php',
			'cache' => null,
Alexander Makarov committed
130
		]);
Qiang Xue committed
131

Alexander Makarov committed
132 133
		$sort = new Sort([
			'attributes' => [
Qiang Xue committed
134
				'age',
Alexander Makarov committed
135
				'name' => [
136 137
					'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
					'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
Alexander Makarov committed
138 139 140
				],
			],
			'params' => [
Qiang Xue committed
141
				'sort' => 'age.name-desc'
Alexander Makarov committed
142
			],
Qiang Xue committed
143 144 145
			'enableMultiSort' => true,
			'urlManager' => $manager,
			'route' => 'site/index',
Alexander Makarov committed
146
		]);
Qiang Xue committed
147 148 149 150 151 152 153 154

		$this->assertEquals('/index.php?r=site/index&sort=age-desc.name-desc', $sort->createUrl('age'));
		$this->assertEquals('/index.php?r=site/index&sort=name.age', $sort->createUrl('name'));
	}

	public function testLink()
	{
		$this->mockApplication();
Alexander Makarov committed
155
		$manager = new UrlManager([
Qiang Xue committed
156 157
			'baseUrl' => '/index.php',
			'cache' => null,
Alexander Makarov committed
158
		]);
Qiang Xue committed
159

Alexander Makarov committed
160 161
		$sort = new Sort([
			'attributes' => [
Qiang Xue committed
162
				'age',
Alexander Makarov committed
163
				'name' => [
164 165
					'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
					'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
Alexander Makarov committed
166 167 168
				],
			],
			'params' => [
Qiang Xue committed
169
				'sort' => 'age.name-desc'
Alexander Makarov committed
170
			],
Qiang Xue committed
171 172 173
			'enableMultiSort' => true,
			'urlManager' => $manager,
			'route' => 'site/index',
Alexander Makarov committed
174
		]);
Qiang Xue committed
175

Qiang Xue committed
176
		$this->assertEquals('<a class="asc" href="/index.php?r=site/index&amp;sort=age-desc.name-desc" data-sort="age-desc.name-desc">Age</a>', $sort->link('age'));
Qiang Xue committed
177 178
	}
}