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.
242 lines
7.4 KiB
242 lines
7.4 KiB
<?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\base\InvalidCallException; |
|
use yii\data\ActiveDataProvider; |
|
use yii\db\Query; |
|
use yiiunit\data\ar\ActiveRecord; |
|
use yiiunit\data\ar\Customer; |
|
use yiiunit\data\ar\Item; |
|
use yiiunit\data\ar\Order; |
|
use yiiunit\framework\db\DatabaseTestCase; |
|
use yiiunit\framework\db\UnqueryableQueryMock; |
|
|
|
/** |
|
* @author Qiang Xue <qiang.xue@gmail.com> |
|
* @since 2.0 |
|
* |
|
* @group data |
|
* @group db |
|
*/ |
|
abstract class ActiveDataProviderTest extends DatabaseTestCase |
|
{ |
|
protected function setUp() |
|
{ |
|
parent::setUp(); |
|
ActiveRecord::$db = $this->getConnection(); |
|
} |
|
|
|
public function testActiveQuery() |
|
{ |
|
$provider = new ActiveDataProvider([ |
|
'query' => Order::find()->orderBy('id'), |
|
]); |
|
$orders = $provider->getModels(); |
|
$this->assertCount(3, $orders); |
|
$this->assertInstanceOf(Order::className(), $orders[0]); |
|
$this->assertInstanceOf(Order::className(), $orders[1]); |
|
$this->assertInstanceOf(Order::className(), $orders[2]); |
|
$this->assertEquals([1, 2, 3], $provider->getKeys()); |
|
|
|
$provider = new ActiveDataProvider([ |
|
'query' => Order::find(), |
|
'pagination' => [ |
|
'pageSize' => 2, |
|
], |
|
]); |
|
$orders = $provider->getModels(); |
|
$this->assertCount(2, $orders); |
|
} |
|
|
|
public function testActiveRelation() |
|
{ |
|
/* @var $customer Customer */ |
|
$customer = Customer::findOne(2); |
|
$provider = new ActiveDataProvider([ |
|
'query' => $customer->getOrders(), |
|
]); |
|
$orders = $provider->getModels(); |
|
$this->assertCount(2, $orders); |
|
$this->assertInstanceOf(Order::className(), $orders[0]); |
|
$this->assertInstanceOf(Order::className(), $orders[1]); |
|
$this->assertEquals([2, 3], $provider->getKeys()); |
|
|
|
$provider = new ActiveDataProvider([ |
|
'query' => $customer->getOrders(), |
|
'pagination' => [ |
|
'pageSize' => 1, |
|
], |
|
]); |
|
$orders = $provider->getModels(); |
|
$this->assertCount(1, $orders); |
|
} |
|
|
|
public function testActiveRelationVia() |
|
{ |
|
/* @var $order Order */ |
|
$order = Order::findOne(2); |
|
$provider = new ActiveDataProvider([ |
|
'query' => $order->getItems(), |
|
]); |
|
$items = $provider->getModels(); |
|
$this->assertCount(3, $items); |
|
$this->assertInstanceOf(Item::className(), $items[0]); |
|
$this->assertInstanceOf(item::className(), $items[1]); |
|
$this->assertInstanceOf(Item::className(), $items[2]); |
|
$this->assertEquals([3, 4, 5], $provider->getKeys()); |
|
|
|
$provider = new ActiveDataProvider([ |
|
'query' => $order->getItems(), |
|
'pagination' => [ |
|
'pageSize' => 2, |
|
], |
|
]); |
|
$items = $provider->getModels(); |
|
$this->assertCount(2, $items); |
|
} |
|
|
|
public function testActiveRelationViaTable() |
|
{ |
|
/* @var $order Order */ |
|
$order = Order::findOne(1); |
|
$provider = new ActiveDataProvider([ |
|
'query' => $order->getBooks(), |
|
]); |
|
$items = $provider->getModels(); |
|
$this->assertCount(2, $items); |
|
$this->assertInstanceOf(Item::className(), $items[0]); |
|
$this->assertInstanceOf(Item::className(), $items[1]); |
|
|
|
$provider = new ActiveDataProvider([ |
|
'query' => $order->getBooks(), |
|
'pagination' => [ |
|
'pageSize' => 1, |
|
], |
|
]); |
|
$items = $provider->getModels(); |
|
$this->assertCount(1, $items); |
|
} |
|
|
|
public function testQuery() |
|
{ |
|
$query = new Query(); |
|
$provider = new ActiveDataProvider([ |
|
'db' => $this->getConnection(), |
|
'query' => $query->from('order')->orderBy('id'), |
|
]); |
|
$orders = $provider->getModels(); |
|
$this->assertCount(3, $orders); |
|
$this->assertInternalType('array', $orders[0]); |
|
$this->assertEquals([0, 1, 2], $provider->getKeys()); |
|
|
|
$query = new Query(); |
|
$provider = new ActiveDataProvider([ |
|
'db' => $this->getConnection(), |
|
'query' => $query->from('order'), |
|
'pagination' => [ |
|
'pageSize' => 2, |
|
], |
|
]); |
|
$orders = $provider->getModels(); |
|
$this->assertCount(2, $orders); |
|
} |
|
|
|
public function testRefresh() |
|
{ |
|
$query = new Query(); |
|
$provider = new ActiveDataProvider([ |
|
'db' => $this->getConnection(), |
|
'query' => $query->from('order')->orderBy('id'), |
|
]); |
|
$this->assertCount(3, $provider->getModels()); |
|
|
|
$provider->getPagination()->pageSize = 2; |
|
$this->assertCount(3, $provider->getModels()); |
|
$provider->refresh(); |
|
$this->assertCount(2, $provider->getModels()); |
|
} |
|
|
|
public function testPaginationBeforeModels() |
|
{ |
|
$query = new Query(); |
|
$provider = new ActiveDataProvider([ |
|
'db' => $this->getConnection(), |
|
'query' => $query->from('order')->orderBy('id'), |
|
]); |
|
$pagination = $provider->getPagination(); |
|
$this->assertEquals(1, $pagination->getPageCount()); |
|
$this->assertCount(3, $provider->getModels()); |
|
$this->assertEquals(1, $pagination->getPageCount()); |
|
|
|
$provider->getPagination()->pageSize = 2; |
|
$this->assertCount(3, $provider->getModels()); |
|
$provider->refresh(); |
|
$this->assertCount(2, $provider->getModels()); |
|
} |
|
|
|
public function testDoesNotPerformQueryWhenHasNoModels() |
|
{ |
|
$query = new UnqueryableQueryMock(); |
|
$provider = new ActiveDataProvider([ |
|
'db' => $this->getConnection(), |
|
'query' => $query->from('order')->where('0=1'), |
|
]); |
|
$pagination = $provider->getPagination(); |
|
$this->assertEquals(0, $pagination->getPageCount()); |
|
|
|
try { |
|
$this->assertCount(0, $provider->getModels()); |
|
} catch (InvalidCallException $exception) { |
|
$this->fail('An excessive models query was executed.'); |
|
} |
|
|
|
$this->assertEquals(0, $pagination->getPageCount()); |
|
} |
|
|
|
public function testValidateTotalCount() |
|
{ |
|
$provider = new ActiveDataProvider([ |
|
'query' => Order::find()->orderBy('id'), |
|
'totalCount' => 100, |
|
'pagination' => [ |
|
], |
|
]); |
|
$this->assertSame(100, $provider->pagination->totalCount); |
|
|
|
$provider = new ActiveDataProvider([ |
|
'query' => Order::find()->orderBy('id'), |
|
'totalCount' => 100, |
|
'pagination' => false, |
|
]); |
|
$this->assertSame(false, $provider->pagination); |
|
} |
|
|
|
public function testValidatePageCount() |
|
{ |
|
$provider = new ActiveDataProvider([ |
|
'query' => Order::find()->orderBy('id'), |
|
'totalCount' => 100, |
|
'pagination' => [ |
|
'pageSize' => 101, |
|
], |
|
]); |
|
$this->assertSame(1, $provider->pagination->pageCount); |
|
|
|
$provider = new ActiveDataProvider([ |
|
'query' => Order::find()->orderBy('id'), |
|
'totalCount' => 100, |
|
'pagination' => [ |
|
'pageSize' => 1, |
|
], |
|
]); |
|
$this->assertSame(100, $provider->pagination->pageCount); |
|
|
|
} |
|
|
|
}
|
|
|