Files
yii2/tests/framework/data/SortTest.php
Robert Korulczyk ba0ab403b5 Added php-cs-fixer coding standards validation to Travis CI (#14100)
* php-cs-fixer: PSR2 rule.

* php-cs-fixer: PSR2 rule - fix views.

* Travis setup refactoring.

* Add php-cs-fixer to travis cs tests.

* Fix tests on hhvm-3.12

* improve travis config

* composer update

* revert composer update

* improve travis config

* Fix CS.

* Extract config to separate classes.

* Extract config to separate classes.

* Add file header.

* Force short array syntax.

* binary_operator_spaces fixer

* Fix broken tests

* cast_spaces fixer

* concat_space fixer

* dir_constant fixer

* ereg_to_preg fixer

* function_typehint_space fixer

* hash_to_slash_comment fixer

* is_null fixer

* linebreak_after_opening_tag fixer

* lowercase_cast fixer

* magic_constant_casing fixer

* modernize_types_casting fixer

* native_function_casing fixer

* new_with_braces fixer

* no_alias_functions fixer

* no_blank_lines_after_class_opening fixer

* no_blank_lines_after_phpdoc fixer

* no_empty_comment fixer

* no_empty_phpdoc fixer

* no_empty_statement fixer

* no_extra_consecutive_blank_lines fixer

* no_leading_import_slash fixer

* no_leading_namespace_whitespace fixer

* no_mixed_echo_print fixer

* no_multiline_whitespace_around_double_arrow fixer

* no_multiline_whitespace_before_semicolons fixer

* no_php4_constructor fixer

* no_short_bool_cast fixer

* no_singleline_whitespace_before_semicolons fixer

* no_spaces_around_offset fixer

* no_trailing_comma_in_list_call fixer

* no_trailing_comma_in_singleline_array fixer

* no_unneeded_control_parentheses fixer

* no_unused_imports fixer

* no_useless_return fixer

* no_whitespace_before_comma_in_array fixer

* no_whitespace_in_blank_line fixer

* not_operator_with_successor_space fixer

* object_operator_without_whitespace fixer

* ordered_imports fixer

* php_unit_construct fixer

* php_unit_dedicate_assert fixer

* php_unit_fqcn_annotation fixer

* phpdoc_indent fixer

* phpdoc_no_access fixer

* phpdoc_no_empty_return fixer

* phpdoc_no_package fixer

* phpdoc_no_useless_inheritdoc fixer

* Fix broken tests

* phpdoc_return_self_reference fixer

* phpdoc_single_line_var_spacing fixer

* phpdoc_single_line_var_spacing fixer

* phpdoc_to_comment fixer

* phpdoc_trim fixer

* phpdoc_var_without_name fixer

* psr4 fixer

* self_accessor fixer

* short_scalar_cast fixer

* single_blank_line_before_namespace fixer

* single_quote fixer

* standardize_not_equals fixer

* ternary_operator_spaces fixer

* trailing_comma_in_multiline_array fixer

* trim_array_spaces fixer

* protected_to_private fixer

* unary_operator_spaces fixer

* whitespace_after_comma_in_array fixer

* `parent::setRules()` -> `$this->setRules()`

* blank_line_after_opening_tag fixer

* Update finder config.

* Revert changes for YiiRequirementChecker.

* Fix array formatting.

* Add missing import.

* Fix CS for new code merged from master.

* Fix some indentation issues.
2017-06-12 12:25:45 +03:00

288 lines
8.5 KiB
PHP

<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yiiunit\framework\data;
use yii\data\Sort;
use yii\web\UrlManager;
use yiiunit\TestCase;
/**
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*
* @group data
*/
class SortTest extends TestCase
{
protected function setUp()
{
parent::setUp();
$this->mockApplication();
}
public function testGetOrders()
{
$sort = new Sort([
'attributes' => [
'age',
'name' => [
'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
],
],
'params' => [
'sort' => 'age,-name',
],
'enableMultiSort' => true,
]);
$orders = $sort->getOrders();
$this->assertCount(3, $orders);
$this->assertEquals(SORT_ASC, $orders['age']);
$this->assertEquals(SORT_DESC, $orders['first_name']);
$this->assertEquals(SORT_DESC, $orders['last_name']);
$sort->enableMultiSort = false;
$orders = $sort->getOrders(true);
$this->assertCount(1, $orders);
$this->assertEquals(SORT_ASC, $orders['age']);
}
/**
* @depends testGetOrders
*/
public function testGetAttributeOrders()
{
$sort = new Sort([
'attributes' => [
'age',
'name' => [
'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
],
],
'params' => [
'sort' => 'age,-name',
],
'enableMultiSort' => true,
]);
$orders = $sort->getAttributeOrders();
$this->assertCount(2, $orders);
$this->assertEquals(SORT_ASC, $orders['age']);
$this->assertEquals(SORT_DESC, $orders['name']);
$sort->enableMultiSort = false;
$orders = $sort->getAttributeOrders(true);
$this->assertCount(1, $orders);
$this->assertEquals(SORT_ASC, $orders['age']);
}
/**
* @depends testGetAttributeOrders
*/
public function testGetAttributeOrder()
{
$sort = new Sort([
'attributes' => [
'age',
'name' => [
'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
],
],
'params' => [
'sort' => 'age,-name',
],
'enableMultiSort' => true,
]);
$this->assertEquals(SORT_ASC, $sort->getAttributeOrder('age'));
$this->assertEquals(SORT_DESC, $sort->getAttributeOrder('name'));
$this->assertNull($sort->getAttributeOrder('xyz'));
}
/**
* @depends testGetAttributeOrders
*/
public function testSetAttributeOrders()
{
$sort = new Sort([
'attributes' => [
'age',
'name' => [
'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
],
],
'params' => [
'sort' => 'age,-name',
],
'enableMultiSort' => true,
]);
$orders = [
'age' => SORT_DESC,
'name' => SORT_ASC,
];
$sort->setAttributeOrders($orders);
$this->assertEquals($orders, $sort->getAttributeOrders());
$sort->enableMultiSort = false;
$sort->setAttributeOrders($orders);
$this->assertEquals(['age' => SORT_DESC], $sort->getAttributeOrders());
$sort->setAttributeOrders($orders, false);
$this->assertEquals($orders, $sort->getAttributeOrders());
$orders = ['unexistingAttribute' => SORT_ASC];
$sort->setAttributeOrders($orders);
$this->assertEquals([], $sort->getAttributeOrders());
$sort->setAttributeOrders($orders, false);
$this->assertEquals($orders, $sort->getAttributeOrders());
}
public function testCreateSortParam()
{
$sort = new Sort([
'attributes' => [
'age',
'name' => [
'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
],
],
'params' => [
'sort' => 'age,-name',
],
'enableMultiSort' => true,
'route' => 'site/index',
]);
$this->assertEquals('-age,-name', $sort->createSortParam('age'));
$this->assertEquals('name,age', $sort->createSortParam('name'));
}
public function testCreateUrl()
{
$manager = new UrlManager([
'baseUrl' => '/',
'ScriptUrl' => '/index.php',
'cache' => null,
]);
$sort = new Sort([
'attributes' => [
'age',
'name' => [
'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
],
],
'params' => [
'sort' => 'age,-name',
],
'enableMultiSort' => true,
'urlManager' => $manager,
'route' => 'site/index',
]);
$this->assertEquals('/index.php?r=site%2Findex&sort=-age%2C-name', $sort->createUrl('age'));
$this->assertEquals('/index.php?r=site%2Findex&sort=name%2Cage', $sort->createUrl('name'));
}
/**
* @depends testCreateUrl
*/
public function testLink()
{
$this->mockApplication();
$manager = new UrlManager([
'baseUrl' => '/',
'scriptUrl' => '/index.php',
'cache' => null,
]);
$sort = new Sort([
'attributes' => [
'age',
'name' => [
'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
],
],
'params' => [
'sort' => 'age,-name',
],
'enableMultiSort' => true,
'urlManager' => $manager,
'route' => 'site/index',
]);
$this->assertEquals('<a class="asc" href="/index.php?r=site%2Findex&amp;sort=-age%2C-name" data-sort="-age,-name">Age</a>', $sort->link('age'));
}
public function testParseSortParam()
{
$sort = new CustomSort([
'attributes' => [
'age',
'name',
],
'params' => [
'sort' => [
['field' => 'age', 'dir' => 'asc'],
['field' => 'name', 'dir' => 'desc'],
],
],
'enableMultiSort' => true,
]);
$this->assertEquals(SORT_ASC, $sort->getAttributeOrder('age'));
$this->assertEquals(SORT_DESC, $sort->getAttributeOrder('name'));
}
/**
* @depends testGetOrders
*
* @see https://github.com/yiisoft/yii2/pull/13260
*/
public function testGetExpressionOrders()
{
$sort = new Sort([
'attributes' => [
'name' => [
'asc' => '[[last_name]] ASC NULLS FIRST',
'desc' => '[[last_name]] DESC NULLS LAST',
],
],
]);
$sort->params = ['sort' => '-name'];
$orders = $sort->getOrders();
$this->assertEquals(1, count($orders));
$this->assertEquals('[[last_name]] DESC NULLS LAST', $orders[0]);
$sort->params = ['sort' => 'name'];
$orders = $sort->getOrders(true);
$this->assertEquals(1, count($orders));
$this->assertEquals('[[last_name]] ASC NULLS FIRST', $orders[0]);
}
}
class CustomSort extends Sort
{
protected function parseSortParam($params)
{
$attributes = [];
foreach ($params as $item) {
$attributes[] = ($item['dir'] == 'desc') ? '-' . $item['field'] : $item['field'];
}
return $attributes;
}
}