You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
6.3 KiB
217 lines
6.3 KiB
<?php |
|
|
|
namespace yiiunit\framework\rest; |
|
|
|
use Yii; |
|
use yii\data\ActiveDataProvider; |
|
use yii\data\Pagination; |
|
use yii\data\Sort; |
|
use yii\db\ActiveRecord; |
|
use yii\db\Query; |
|
use yii\rest\ActiveController; |
|
use yii\rest\IndexAction; |
|
use yiiunit\framework\filters\stubs\UserIdentity; |
|
use yiiunit\TestCase; |
|
|
|
/** |
|
* @group rest |
|
*/ |
|
class IndexActionTest extends TestCase |
|
{ |
|
protected function setUp() |
|
{ |
|
parent::setUp(); |
|
$this->mockWebApplication([ |
|
'components' => [ |
|
'db' => [ |
|
'class' => '\yii\db\Connection', |
|
'dsn' => 'sqlite::memory:', |
|
], |
|
'user' => [ |
|
'identityClass' => UserIdentity::className(), |
|
], |
|
], |
|
]); |
|
$columns = [ |
|
'id' => 'pk', |
|
'name' => 'string', |
|
]; |
|
Yii::$app->getDb()->createCommand()->createTable(IndexActionModel::tableName(), $columns)->execute(); |
|
} |
|
|
|
public function testPrepareSearchQueryAttribute() |
|
{ |
|
$sql = ''; |
|
Yii::$app->controller = new RestController( |
|
'rest', |
|
new Module('rest'), [ |
|
'modelClass' => IndexActionModel::className(), |
|
'actions' => [ |
|
'index' => [ |
|
'class' => IndexAction::className(), |
|
'modelClass' => IndexActionModel::className(), |
|
'prepareSearchQuery' => function ($query, $requestParams) use (&$sql) { |
|
$this->assertTrue($query instanceof Query); |
|
$sql = $query->createCommand()->getRawSql(); |
|
|
|
return $query; |
|
}, |
|
], |
|
], |
|
]); |
|
Yii::$app->controller->run('index'); |
|
|
|
$this->assertEquals( |
|
'SELECT * FROM `' . IndexActionModel::tableName() . '`', |
|
$sql |
|
); |
|
} |
|
|
|
/** |
|
* @dataProvider dataProviderTestPrepareDataProviderWithPaginationAndSorting |
|
* |
|
* @param string $sql |
|
* @param array $params |
|
* @param string $expectedRawSql |
|
*/ |
|
public function testPrepareDataProviderWithPaginationAndSorting( |
|
$pagination, |
|
$sort, |
|
$expectedPaginationPageSize = null, |
|
$expectedPaginationDefaultPageSize = null, |
|
$expectedSortOrders = [], |
|
$expectedSortDefaultOrder = null |
|
) { |
|
Yii::$app->getRequest()->setBodyParams([ |
|
'per-page' => 11, |
|
'sort' => '-test-sort' |
|
]); |
|
|
|
$controller = new RestController( |
|
'rest', |
|
new Module('rest'), [ |
|
'modelClass' => IndexActionModel::className(), |
|
'actions' => [ |
|
'index' => [ |
|
'class' => IndexAction::className(), |
|
'modelClass' => IndexActionModel::className(), |
|
'pagination' => $pagination, |
|
'sort' => $sort, |
|
], |
|
], |
|
]); |
|
|
|
/** @var ActiveDataProvider $dataProvider */ |
|
$dataProvider = $controller->createAction('index')->runWithParams([]); |
|
$actualPagination = $dataProvider->getPagination(); |
|
$actualSort = $dataProvider->getSort(); |
|
|
|
if ($pagination === false) { |
|
$this->assertFalse($actualPagination); |
|
} else { |
|
$this->assertEquals($expectedPaginationPageSize, $actualPagination->pageSize); |
|
$this->assertEquals($expectedPaginationDefaultPageSize, $actualPagination->defaultPageSize); |
|
} |
|
|
|
if ($sort === false) { |
|
$this->assertFalse($actualSort); |
|
} else { |
|
$this->assertEquals($expectedSortOrders, $actualSort->getOrders()); |
|
$this->assertEquals($expectedSortDefaultOrder, $actualSort->defaultOrder); |
|
} |
|
} |
|
|
|
/** |
|
* Data provider for [[testPrepareDataProviderWithPaginationAndSorting()]]. |
|
* @return array test data |
|
*/ |
|
public function dataProviderTestPrepareDataProviderWithPaginationAndSorting() |
|
{ |
|
return [ |
|
[ // Default config |
|
[], |
|
[], |
|
11, // page size set as param in test |
|
(new Pagination())->defaultPageSize, |
|
[], |
|
null |
|
], |
|
[ // Default config |
|
[], |
|
[ |
|
'attributes' => ['test-sort'], |
|
], |
|
11, // page size set as param in test |
|
(new Pagination())->defaultPageSize, |
|
['test-sort' => SORT_DESC], // test sort set as param in test |
|
null |
|
], |
|
[ // Config via array |
|
[ |
|
'pageSize' => 12, // Testing a fixed page size |
|
'defaultPageSize' => 991, |
|
], |
|
[ |
|
'attributes' => ['test-sort'], |
|
'defaultOrder' => [ |
|
'created_at_1' => SORT_DESC, |
|
], |
|
], |
|
12, |
|
991, |
|
['test-sort' => SORT_DESC], // test sort set as param in test |
|
['created_at_1' => SORT_DESC] |
|
], |
|
[ // Config via objects |
|
new Pagination([ |
|
'defaultPageSize' => 992, |
|
]), |
|
new Sort([ |
|
'attributes' => ['created_at_2'], |
|
'defaultOrder' => [ |
|
'created_at_2' => SORT_DESC, |
|
], |
|
]), |
|
11, // page size set as param in test |
|
992, |
|
['created_at_2' => SORT_DESC], // test sort set as param in test is ignored |
|
['created_at_2' => SORT_DESC] |
|
], |
|
[ // Disable pagination and sort |
|
false, |
|
false, |
|
] |
|
]; |
|
} |
|
} |
|
|
|
class RestController extends ActiveController |
|
{ |
|
public $actions = []; |
|
|
|
public function actions() |
|
{ |
|
return $this->actions; |
|
} |
|
} |
|
|
|
class Module extends \yii\base\Module |
|
{ |
|
|
|
} |
|
|
|
/** |
|
* Test Active Record class with [[TimestampBehavior]] behavior attached. |
|
* |
|
* @property int $id |
|
* @property int $name |
|
*/ |
|
class IndexActionModel extends ActiveRecord |
|
{ |
|
public static $tableName = 'test_index_action'; |
|
|
|
public static function tableName() |
|
{ |
|
return static::$tableName; |
|
} |
|
}
|
|
|