PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/tests/Zend/Paginator/Adapter/DbSelectTest.php

http://github.com/zendframework/zf2
PHP | 485 lines | 297 code | 88 blank | 100 comment | 1 complexity | 34881b237ca292828c859b8ae3fc756f MD5 | raw file
Possible License(s): BSD-3-Clause
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Paginator
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. */
  21. /**
  22. * @namespace
  23. */
  24. namespace ZendTest\Paginator\Adapter;
  25. use Zend\Db\Adapter\Pdo;
  26. use Zend\Paginator\Adapter;
  27. use Zend\Db;
  28. use Zend\Db\Select;
  29. use Zend\Paginator\Exception;
  30. require_once __DIR__ . '/../_files/TestTable.php';
  31. /**
  32. * @category Zend
  33. * @package Zend_Paginator
  34. * @subpackage UnitTests
  35. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  36. * @license http://framework.zend.com/license/new-bsd New BSD License
  37. * @group Zend_Paginator
  38. */
  39. class DbSelectTest extends \PHPUnit_Framework_TestCase
  40. {
  41. /**
  42. * @var Zend_Paginator_Adapter_DbSelect
  43. */
  44. protected $_adapter;
  45. /**
  46. * @var Zend_Db_Adapter_Pdo_Sqlite
  47. */
  48. protected $_db;
  49. /**
  50. * @var Zend_Db_Select
  51. */
  52. protected $_query;
  53. /**
  54. * @var Zend_Db_Table_Abstract
  55. */
  56. protected $_table;
  57. /**
  58. * Prepares the environment before running a test.
  59. */
  60. protected function setUp()
  61. {
  62. if (!extension_loaded('pdo_sqlite')) {
  63. $this->markTestSkipped('Pdo_Sqlite extension is not loaded');
  64. }
  65. parent::setUp();
  66. $this->_db = new Pdo\Sqlite(array(
  67. 'dbname' => __DIR__ . '/../_files/test.sqlite'
  68. ));
  69. $this->_table = new \ZendTest\Paginator\TestAsset\TestTable($this->_db);
  70. $this->_query = $this->_db->select()->from('test')
  71. ->order('number ASC'); // ZF-3740
  72. //->limit(1000, 0); // ZF-3727
  73. $this->_adapter = new Adapter\DbSelect($this->_query);
  74. }
  75. /**
  76. * Cleans up the environment after running a test.
  77. */
  78. protected function tearDown()
  79. {
  80. $this->_adapter = null;
  81. parent::tearDown();
  82. }
  83. public function testGetsItemsAtOffsetZero()
  84. {
  85. $actual = $this->_adapter->getItems(0, 10);
  86. $i = 1;
  87. foreach ($actual as $item) {
  88. $this->assertEquals($i, $item['number']);
  89. $i++;
  90. }
  91. }
  92. public function testGetsItemsAtOffsetTen()
  93. {
  94. $actual = $this->_adapter->getItems(10, 10);
  95. $i = 11;
  96. foreach ($actual as $item) {
  97. $this->assertEquals($i, $item['number']);
  98. $i++;
  99. }
  100. }
  101. public function testAcceptsIntegerValueForRowCount()
  102. {
  103. $this->_adapter->setRowCount(101);
  104. $this->assertEquals(101, $this->_adapter->count());
  105. }
  106. public function testThrowsExceptionIfInvalidQuerySuppliedForRowCount()
  107. {
  108. $this->setExpectedException('Zend\Paginator\Adapter\Exception\InvalidArgumentException', 'Row count column not found');
  109. $this->_adapter->setRowCount($this->_db->select()->from('test'));
  110. }
  111. public function testThrowsExceptionIfInvalidQuerySuppliedForRowCount2()
  112. {
  113. $wrongcolumn = $this->_db->quoteIdentifier('wrongcolumn');
  114. $expr = new Db\Expr("COUNT(*) AS $wrongcolumn");
  115. $query = $this->_db->select($expr)->from('test');
  116. $this->setExpectedException('Zend\Paginator\Adapter\Exception\InvalidArgumentException', 'Row count column not found');
  117. $this->_adapter->setRowCount($query);
  118. }
  119. public function testAcceptsQueryForRowCount()
  120. {
  121. $row_count_column = $this->_db->quoteIdentifier(Adapter\DbSelect::ROW_COUNT_COLUMN);
  122. $expression = new Db\Expr("COUNT(*) AS $row_count_column");
  123. $rowCount = clone $this->_query;
  124. $rowCount->reset(Select::COLUMNS)
  125. ->reset(Select::ORDER) // ZF-3740
  126. ->reset(Select::LIMIT_OFFSET) // ZF-3727
  127. ->reset(Select::GROUP) // ZF-4001
  128. ->columns($expression);
  129. $this->_adapter->setRowCount($rowCount);
  130. $this->assertEquals(500, $this->_adapter->count());
  131. }
  132. public function testThrowsExceptionIfInvalidRowCountValueSupplied()
  133. {
  134. $this->setExpectedException('Zend\Paginator\Adapter\Exception\InvalidArgumentException', 'Invalid row count');
  135. $this->_adapter->setRowCount('invalid');
  136. }
  137. public function testReturnsCorrectCountWithAutogeneratedQuery()
  138. {
  139. $expected = 500;
  140. $actual = $this->_adapter->count();
  141. $this->assertEquals($expected, $actual);
  142. }
  143. public function testDbTableSelectDoesNotThrowException()
  144. {
  145. $adapter = new Adapter\DbSelect($this->_table->select());
  146. $count = $adapter->count();
  147. $this->assertEquals(500, $count);
  148. }
  149. /**
  150. * @group ZF-4001
  151. */
  152. public function testGroupByQueryReturnsOneRow()
  153. {
  154. $query = $this->_db->select()->from('test')
  155. ->order('number ASC')
  156. ->limit(1000, 0)
  157. ->group('number');
  158. $adapter = new Adapter\DbSelect($query);
  159. $this->assertEquals(500, $adapter->count());
  160. }
  161. /**
  162. * @group ZF-4001
  163. */
  164. public function testGroupByQueryOnEmptyTableReturnsRowCountZero()
  165. {
  166. $db = new Pdo\Sqlite(array(
  167. 'dbname' => __DIR__ . '/../_files/testempty.sqlite'
  168. ));
  169. $query = $db->select()->from('test')
  170. ->order('number ASC')
  171. ->limit(1000, 0);
  172. $adapter = new Adapter\DbSelect($query);
  173. $this->assertEquals(0, $adapter->count());
  174. }
  175. /**
  176. * @group ZF-4001
  177. */
  178. public function testGroupByQueryReturnsCorrectResult()
  179. {
  180. $query = $this->_db->select()->from('test')
  181. ->order('number ASC')
  182. ->limit(1000, 0)
  183. ->group('testgroup');
  184. $adapter = new Adapter\DbSelect($query);
  185. $this->assertEquals(2, $adapter->count());
  186. }
  187. /**
  188. * @group ZF-4032
  189. */
  190. public function testDistinctColumnQueryReturnsCorrectResult()
  191. {
  192. $query = $this->_db->select()->from('test', 'testgroup')
  193. ->order('number ASC')
  194. ->limit(1000, 0)
  195. ->distinct();
  196. $adapter = new Adapter\DbSelect($query);
  197. $this->assertEquals(2, $adapter->count());
  198. }
  199. /**
  200. * @group ZF-4094
  201. */
  202. public function testSelectSpecificColumns()
  203. {
  204. $number = $this->_db->quoteIdentifier('number');
  205. $query = $this->_db->select()->from('test', array('testgroup', 'number'))
  206. ->where("$number >= ?", '1');
  207. $adapter = new Adapter\DbSelect($query);
  208. $this->assertEquals(500, $adapter->count());
  209. }
  210. /**
  211. * @group ZF-4177
  212. */
  213. public function testSelectDistinctAllUsesRegularCountAll()
  214. {
  215. $query = $this->_db->select()->from('test')
  216. ->distinct();
  217. $adapter = new Adapter\DbSelect($query);
  218. $this->assertEquals(500, $adapter->count());
  219. }
  220. /**
  221. * @group ZF-5233
  222. */
  223. public function testSelectHasAliasedColumns()
  224. {
  225. $db = $this->_db;
  226. $db->query('DROP TABLE IF EXISTS `sandboxTransaction`');
  227. $db->query('DROP TABLE IF EXISTS `sandboxForeign`');
  228. // A transaction table
  229. $db->query(
  230. 'CREATE TABLE `sandboxTransaction` (
  231. `id` INTEGER PRIMARY KEY,
  232. `foreign_id` INT( 1 ) NOT NULL ,
  233. `name` TEXT NOT NULL
  234. ) '
  235. );
  236. // A foreign table
  237. $db->query(
  238. 'CREATE TABLE `sandboxForeign` (
  239. `id` INTEGER PRIMARY KEY,
  240. `name` TEXT NOT NULL
  241. ) '
  242. );
  243. // Insert some data
  244. $db->insert('sandboxTransaction',
  245. array(
  246. 'foreign_id' => 1,
  247. 'name' => 'transaction 1 with foreign_id 1',
  248. )
  249. );
  250. $db->insert('sandboxTransaction',
  251. array(
  252. 'foreign_id' => 1,
  253. 'name' => 'transaction 2 with foreign_id 1',
  254. )
  255. );
  256. $db->insert('sandboxForeign',
  257. array(
  258. 'name' => 'John Doe',
  259. )
  260. );
  261. $db->insert('sandboxForeign',
  262. array(
  263. 'name' => 'Jane Smith',
  264. )
  265. );
  266. $query = $db->select()->from(array('a'=>'sandboxTransaction'), array())
  267. ->join(array('b'=>'sandboxForeign'), 'a.foreign_id = b.id', array('name'))
  268. ->distinct(true);
  269. $adapter = new Adapter\DbSelect($query);
  270. $this->assertEquals(1, $adapter->count());
  271. }
  272. /**
  273. * @group ZF-5956
  274. */
  275. public function testUnionSelect()
  276. {
  277. $union = $this->_db->select()->union(array(
  278. $this->_db->select()->from('test')->where('number <= 250'),
  279. $this->_db->select()->from('test')->where('number > 250')
  280. ));
  281. $adapter = new Adapter\DbSelect($union);
  282. $expected = 500;
  283. $actual = $adapter->count();
  284. $this->assertEquals($expected, $actual);
  285. }
  286. /**
  287. * @group ZF-7045
  288. */
  289. public function testGetCountSelect()
  290. {
  291. $union = $this->_db->select()->union(array(
  292. $this->_db->select()->from('test')->where('number <= 250'),
  293. $this->_db->select()->from('test')->where('number > 250')
  294. ));
  295. $adapter = new Adapter\DbSelect($union);
  296. $expected = 'SELECT COUNT(1) AS "zend_paginator_row_count" FROM (SELECT "test".* FROM "test" WHERE (number <= 250) UNION SELECT "test".* FROM "test" WHERE (number > 250)) AS "t"';
  297. $this->assertEquals($expected, $adapter->getCountSelect()->__toString());
  298. }
  299. /**
  300. * @group ZF-5295
  301. */
  302. public function testMultipleDistinctColumns()
  303. {
  304. $select = $this->_db->select()->from('test', array('testgroup', 'number'))
  305. ->distinct(true);
  306. $adapter = new Adapter\DbSelect($select);
  307. $expected = 'SELECT COUNT(1) AS "zend_paginator_row_count" FROM (SELECT DISTINCT "test"."testgroup", "test"."number" FROM "test") AS "t"';
  308. $this->assertEquals($expected, $adapter->getCountSelect()->__toString());
  309. $this->assertEquals(500, $adapter->count());
  310. }
  311. /**
  312. * @group ZF-5295
  313. */
  314. public function testSingleDistinctColumn()
  315. {
  316. $select = $this->_db->select()->from('test', 'testgroup')
  317. ->distinct(true);
  318. $adapter = new Adapter\DbSelect($select);
  319. $expected = 'SELECT COUNT(DISTINCT "test"."testgroup") AS "zend_paginator_row_count" FROM "test"';
  320. $this->assertEquals($expected, $adapter->getCountSelect()->__toString());
  321. $this->assertEquals(2, $adapter->count());
  322. }
  323. /**
  324. * @group ZF-6330
  325. */
  326. public function testGroupByMultipleColumns()
  327. {
  328. $select = $this->_db->select()->from('test', 'testgroup')
  329. ->group(array('number', 'testgroup'));
  330. $adapter = new Adapter\DbSelect($select);
  331. $expected = 'SELECT COUNT(1) AS "zend_paginator_row_count" FROM (SELECT "test"."testgroup" FROM "test" GROUP BY "number"' . ",\n\t" . '"testgroup") AS "t"';
  332. $this->assertEquals($expected, $adapter->getCountSelect()->__toString());
  333. $this->assertEquals(500, $adapter->count());
  334. }
  335. /**
  336. * @group ZF-6330
  337. */
  338. public function testGroupBySingleColumn()
  339. {
  340. $select = $this->_db->select()->from('test', 'testgroup')
  341. ->group('test.testgroup');
  342. $adapter = new Adapter\DbSelect($select);
  343. $expected = 'SELECT COUNT(DISTINCT "test"."testgroup") AS "zend_paginator_row_count" FROM "test"';
  344. $this->assertEquals($expected, $adapter->getCountSelect()->__toString());
  345. $this->assertEquals(2, $adapter->count());
  346. }
  347. /**
  348. * @group ZF-6562
  349. */
  350. public function testSelectWithHaving()
  351. {
  352. $select = $this->_db->select()->from('test')
  353. ->group('number')
  354. ->having('number > 250');
  355. $adapter = new Adapter\DbSelect($select);
  356. $expected = 'SELECT COUNT(1) AS "zend_paginator_row_count" FROM (SELECT "test".* FROM "test" GROUP BY "number" HAVING (number > 250)) AS "t"';
  357. $this->assertEquals($expected, $adapter->getCountSelect()->__toString());
  358. $this->assertEquals(250, $adapter->count());
  359. }
  360. /**
  361. * @group ZF-7127
  362. */
  363. public function testMultipleGroupSelect()
  364. {
  365. $select = $this->_db->select()->from('test')
  366. ->group('testgroup')
  367. ->group('number')
  368. ->where('number > 250');
  369. $adapter = new Adapter\DbSelect($select);
  370. $expected = 'SELECT COUNT(1) AS "zend_paginator_row_count" FROM (SELECT "test".* FROM "test" WHERE (number > 250) GROUP BY "testgroup"' . ",\n\t" . '"number") AS "t"';
  371. $this->assertEquals($expected, $adapter->getCountSelect()->__toString());
  372. $this->assertEquals(250, $adapter->count());
  373. }
  374. /**
  375. * @group ZF-10704
  376. */
  377. public function testObjectSelectWithBind()
  378. {
  379. $select = $this->_db->select();
  380. $select->from('test', array('number'))
  381. ->where('number = ?')
  382. ->distinct(true)
  383. ->bind(array(250));
  384. $adapter = new Adapter\DbSelect($select);
  385. $this->assertEquals(1, $adapter->count());
  386. $select->reset(\Zend\Db\Select::DISTINCT);
  387. $select2 = clone $select;
  388. $select2->reset(\Zend\Db\Select::WHERE)
  389. ->where('number = 500');
  390. $selectUnion = $this->_db
  391. ->select()
  392. ->bind(array(250));
  393. $selectUnion->union(array($select, $select2));
  394. $adapter = new Adapter\DbSelect($selectUnion);
  395. $this->assertEquals(2, $adapter->count());
  396. }
  397. }