Created
May 5, 2015 18:57
-
-
Save KorsaR-ZN/e649cf5a1325112472d3 to your computer and use it in GitHub Desktop.
Phalcon Paginator tests
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
+------------------------------------------------------------------------+ | |
| Phalcon Framework | | |
+------------------------------------------------------------------------+ | |
| Copyright (c) 2011-2015 Phalcon Team (http://www.phalconphp.com) | | |
+------------------------------------------------------------------------+ | |
| This source file is subject to the New BSD License that is bundled | | |
| with this package in the file docs/LICENSE.txt. | | |
| | | |
| If you did not receive a copy of the license and are unable to | | |
| obtain it through the world-wide-web, please send an email | | |
| to [email protected] so we can send you a copy immediately. | | |
+------------------------------------------------------------------------+ | |
| Authors: Andres Gutierrez <[email protected]> | | |
| Eduar Carvajal <[email protected]> | | |
+------------------------------------------------------------------------+ | |
*/ | |
use Phalcon\Logger\Adapter\File as FileLogger, | |
Phalcon\Db\Adapter\Pdo\Mysql as DbAdapter, | |
Phalcon\Events\Manager as EventsManager; | |
class PaginatorTest extends PHPUnit_Framework_TestCase | |
{ | |
public function __construct() | |
{ | |
spl_autoload_register(array($this, 'modelsAutoloader')); | |
} | |
public function __destruct() | |
{ | |
spl_autoload_unregister(array($this, 'modelsAutoloader')); | |
} | |
public function modelsAutoloader($className) | |
{ | |
if (file_exists('unit-tests/models/' . $className . '.php')) { | |
require 'unit-tests/models/' . $className . '.php'; | |
} | |
} | |
protected function _loadDI() | |
{ | |
Phalcon\DI::reset(); | |
$di = new Phalcon\DI(); | |
$di->set('modelsManager', function() { | |
return new Phalcon\Mvc\Model\Manager(); | |
}); | |
$di->set('modelsMetadata', function() { | |
return new Phalcon\Mvc\Model\Metadata\Memory(); | |
}); | |
$di->set('db', function() { | |
require 'unit-tests/config.db.php'; | |
return new Phalcon\Db\Adapter\Pdo\Mysql($configMysql); | |
}, true); | |
/*$di->set('db', function() { | |
$eventsManager = new EventsManager(); | |
$logger = new FileLogger("debug.log"); | |
//Listen all the database events | |
$eventsManager->attach('db', function($event, $connection) use ($logger) { | |
if ($event->getType() == 'beforeQuery') { | |
$logger->log($connection->getSQLStatement(), \Phalcon\Logger::INFO); | |
} | |
}); | |
$connection = new DbAdapter(array( | |
"host" => "localhost", | |
"username" => "root", | |
"password" => "", | |
"dbname" => "phalcon_test" | |
)); | |
//Assign the eventsManager to the db adapter instance | |
$connection->setEventsManager($eventsManager); | |
return $connection; | |
}, true);*/ | |
return $di; | |
} | |
public function testArrayPaginator() | |
{ | |
$personas = array( | |
0 => array( | |
'id' => 1, | |
'name' => 'PETER' | |
), | |
1 => array( | |
'id' => 2, | |
'name' => 'PETER' | |
), | |
2 => array( | |
'id' => 3, | |
'name' => 'PETER' | |
), | |
3 => array( | |
'id' => 4, | |
'name' => 'PETER' | |
), | |
4 => array( | |
'id' => 5, | |
'name' => 'PETER' | |
), | |
5 => array( | |
'id' => 6, | |
'name' => 'PETER' | |
), | |
6 => array( | |
'id' => 7, | |
'name' => 'PETER' | |
), | |
7 => array( | |
'id' => 8, | |
'name' => 'PETER' | |
), | |
8 => array( | |
'id' => 9, | |
'name' => 'PETER' | |
), | |
9 => array( | |
'id' => 10, | |
'name' => 'PETER' | |
), | |
10 => array( | |
'id' => 11, | |
'name' => 'PETER' | |
), | |
11 => array( | |
'id' => 12, | |
'name' => 'PETER' | |
), | |
12 => array( | |
'id' => 13, | |
'name' => 'PETER' | |
), | |
13 => array( | |
'id' => 14, | |
'name' => 'PETER' | |
), | |
14 => array( | |
'id' => 15, | |
'name' => 'PETER' | |
), | |
15 => array( | |
'id' => 16, | |
'name' => 'PETER' | |
), | |
16 => array( | |
'id' => 17, | |
'name' => 'PETER' | |
), | |
17 => array( | |
'id' => 18, | |
'name' => 'PETER' | |
) | |
); | |
$paginator = new Phalcon\Paginator\Adapter\NativeArray(array( | |
'data' => $personas, | |
'limit' => 3, | |
'page' => 1 | |
)); | |
$this->_executeTests($paginator, $personas); | |
} | |
public function testArrayPaginator_t445() | |
{ | |
$paginator = new \Phalcon\Paginator\Adapter\NativeArray(array( | |
"data" => array_fill(0, 30, 'banana'), | |
"limit"=> 25, | |
"page" => 1, | |
)); | |
$page = $paginator->getPaginate(); | |
$this->assertEquals(get_class($page), 'stdClass'); | |
$this->assertEquals(count($page->items), 25); | |
$this->assertEquals($page->before, 1); | |
$this->assertEquals($page->next, 2); | |
$this->assertEquals($page->last, 2); | |
$this->assertEquals($page->limit, 25); | |
$this->assertEquals($page->current, 1); | |
$this->assertEquals($page->total_pages, 2); | |
$paginator->setCurrentPage(2); | |
$page = $paginator->getPaginate(); | |
$this->assertEquals(get_class($page), 'stdClass'); | |
$this->assertEquals(count($page->items), 5); | |
$this->assertEquals($page->before, 1); | |
$this->assertEquals($page->next, 2); | |
$this->assertEquals($page->last, 2); | |
$this->assertEquals($page->current, 2); | |
$this->assertEquals($page->total_pages, 2); | |
} | |
public function testModelPaginator() | |
{ | |
require 'unit-tests/config.db.php'; | |
if (empty($configMysql)) { | |
$this->markTestSkipped('Test skipped'); | |
return; | |
} | |
$this->_loadDI(); | |
$personnes = Personnes::find(); | |
$paginator = new Phalcon\Paginator\Adapter\Model(array( | |
'data' => $personnes, | |
'limit' => 10, | |
'page' => 1 | |
)); | |
$this->_executeTests($paginator, $personnes); | |
} | |
public function testModelPaginatorBind() | |
{ | |
require 'unit-tests/config.db.php'; | |
if (empty($configMysql)) { | |
$this->markTestSkipped('Test skipped'); | |
return; | |
} | |
$this->_loadDI(); | |
$personnes = Personnes::find(array( | |
"conditions" => "cedula >=:d1: AND cedula>=:d2: ", | |
"bind" => array("d1" => '1', "d2" => "5"), | |
"order" => "cedula, nombres", | |
"limit" => "33" | |
)); | |
$paginator = new Phalcon\Paginator\Adapter\Model(array( | |
'data' => $personnes, | |
'limit' => 10, | |
'page' => 1 | |
)); | |
//First Page | |
$page = $paginator->getPaginate(); | |
$this->assertEquals(get_class($page), 'stdClass'); | |
$this->assertEquals(count($page->items), 10); | |
$this->assertEquals($page->before, 1); | |
$this->assertEquals($page->next, 2); | |
$this->assertEquals($page->last, 4); | |
$this->assertEquals($page->limit, 10); | |
$this->assertEquals($page->current, 1); | |
$this->assertEquals($page->total_pages, 4); | |
} | |
public function testQueryBuilderPaginator() | |
{ | |
require 'unit-tests/config.db.php'; | |
if (empty($configMysql)) { | |
$this->markTestSkipped('Test skipped'); | |
return; | |
} | |
$di = $this->_loadDI(); | |
$builder = $di['modelsManager']->createBuilder() | |
->columns('cedula, nombres') | |
->from('Personnes') | |
->orderBy('cedula'); | |
$paginator = new Phalcon\Paginator\Adapter\QueryBuilder(array( | |
"builder" => $builder, | |
"limit"=> 10, | |
"page" => 1 | |
)); | |
$page = $paginator->getPaginate(); | |
$this->assertEquals(get_class($page), 'stdClass'); | |
$this->assertEquals(count($page->items), 10); | |
$this->assertEquals($page->before, 1); | |
$this->assertEquals($page->next, 2); | |
$this->assertEquals($page->last, 218); | |
$this->assertEquals($page->limit, 10); | |
$this->assertEquals($page->current, 1); | |
$this->assertEquals($page->total_pages, 218); | |
$this->assertInternalType('int', $page->total_items); | |
$this->assertInternalType('int', $page->total_pages); | |
//Middle page | |
$paginator->setCurrentPage(100); | |
$page = $paginator->getPaginate(); | |
$this->assertEquals(get_class($page), 'stdClass'); | |
$this->assertEquals(count($page->items), 10); | |
$this->assertEquals($page->before, 99); | |
$this->assertEquals($page->next, 101); | |
$this->assertEquals($page->last, 218); | |
$this->assertEquals($page->current, 100); | |
$this->assertEquals($page->total_pages, 218); | |
$this->assertInternalType('int', $page->total_items); | |
$this->assertInternalType('int', $page->total_pages); | |
//Last page | |
$paginator->setCurrentPage(218); | |
$page = $paginator->getPaginate(); | |
$this->assertEquals(get_class($page), 'stdClass'); | |
$this->assertEquals(count($page->items), 10); | |
$this->assertEquals($page->before, 217); | |
$this->assertEquals($page->next, 218); | |
$this->assertEquals($page->last, 218); | |
$this->assertEquals($page->current, 218); | |
$this->assertEquals($page->total_pages, 218); | |
$this->assertInternalType('int', $page->total_items); | |
$this->assertInternalType('int', $page->total_pages); | |
// test of getter/setters of querybuilder adapter | |
// -- current page -- | |
$currentPage = $paginator->getCurrentPage(); | |
$this->assertEquals($currentPage, 218); | |
// -- limit -- | |
$rowsLimit = $paginator->getLimit(); | |
$this->assertEquals($rowsLimit, 10); | |
$setterResult = $paginator->setLimit(25); | |
$rowsLimit = $paginator->getLimit(); | |
$this->assertEquals($rowsLimit, 25); | |
$this->assertEquals($setterResult, $paginator); | |
// -- builder -- | |
$queryBuilder = $paginator->getQueryBuilder(); | |
$this->assertEquals($builder, $queryBuilder); | |
$builder2 = $di['modelsManager']->createBuilder() | |
->columns('cedula, nombres') | |
->from('Personnes'); | |
$setterResult = $paginator->setQueryBuilder($builder2); | |
$queryBuilder = $paginator->getQueryBuilder(); | |
$this->assertEquals($builder2, $queryBuilder); | |
$this->assertEquals($setterResult, $paginator); | |
} | |
protected function _executeTests(Phalcon\Paginator\AdapterInterface $adapter, $data) | |
{ | |
$limit = $adapter->getLimit(); | |
$count = count($data); | |
$pageTotal = ceil($count / $limit); | |
// Gets random page | |
$pages = range(1, $pageTotal); | |
shuffle($pages); | |
$pages = array_slice($pages, 0, 3); | |
// Test pages | |
foreach ($pages as $currentPage) { | |
$adapter->setCurrentPage($currentPage); | |
$page = $adapter->getPaginate(); | |
$this->assertEquals(get_class($page), 'stdClass'); | |
$this->assertEquals($page->first, 1); | |
$this->assertEquals($page->last, $pageTotal); | |
$this->assertEquals($page->current, $currentPage); | |
$this->assertEquals(count($page->items), $limit); | |
$this->assertEquals($page->total_pages, $pageTotal); | |
if ($currentPage > $page->first) { | |
$this->assertEquals($page->before, $currentPage - 1); | |
} | |
if ($currentPage < $page->last) { | |
$this->assertEquals($page->next, $currentPage + 1); | |
} | |
$offset = ($currentPage - 1) * $limit; | |
$this->_testEquals($page->items, $data, $offset, $limit); | |
} | |
} | |
protected function _testEquals($items, $data, $offset, $limit) | |
{ | |
if (is_array($data)) { | |
$this->assertEquals($items, array_slice($data, $offset, $limit)); | |
return; | |
} | |
if (is_object($data) && ($data instanceof \Phalcon\Mvc\Model\Resultset)) { | |
$origin = array(); | |
$position = 0; | |
$maxPosition = $offset + $limit; | |
// TODO: Replace on \Phalcon\Mvc\Model\Resultset::seek() after fix #10100 | |
foreach ($data as $row) { | |
if ($position >= $offset) { | |
$origin[] = $row; | |
} | |
if (++$position >= $maxPosition) { | |
break; | |
} | |
} | |
$this->assertEquals($items, $origin); | |
return; | |
} | |
$this->markTestSkipped('Test skipped'); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment