Browse Source

Merge pull request #1621 from pulzarraider/pager_test

Added Pager test, fixed CS in Pager
Thomas 11 years ago
parent
commit
7eaa94b898
2 changed files with 664 additions and 7 deletions
  1. 7 7
      Datagrid/Pager.php
  2. 657 0
      Tests/Datagrid/PagerTest.php

+ 7 - 7
Datagrid/Pager.php

@@ -84,23 +84,23 @@ abstract class Pager implements \Iterator, \Countable, \Serializable, PagerInter
     /**
      * Returns an array of page numbers to use in pagination links.
      *
-     * @param integer $nb_links The maximum number of page numbers to return
+     * @param integer $nbLinks The maximum number of page numbers to return
      *
      * @return array
      */
-    public function getLinks($nb_links = null)
+    public function getLinks($nbLinks = null)
     {
-        if ($nb_links == null) {
-            $nb_links = $this->getMaxPageLinks();
+        if ($nbLinks == null) {
+            $nbLinks = $this->getMaxPageLinks();
         }
         $links = array();
-        $tmp   = $this->page - floor($nb_links / 2);
-        $check = $this->lastPage - $nb_links + 1;
+        $tmp   = $this->page - floor($nbLinks / 2);
+        $check = $this->lastPage - $nbLinks + 1;
         $limit = $check > 0 ? $check : 1;
         $begin = $tmp > 0 ? ($tmp > $limit ? $limit : $tmp) : 1;
 
         $i = (int) $begin;
-        while ($i < $begin + $nb_links && $i <= $this->lastPage) {
+        while ($i < $begin + $nbLinks && $i <= $this->lastPage) {
             $links[] = $i++;
         }
 

+ 657 - 0
Tests/Datagrid/PagerTest.php

@@ -0,0 +1,657 @@
+<?php
+
+/*
+ * This file is part of the Sonata package.
+ *
+ * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sonata\AdminBundle\Tests\Datagrid;
+
+use Sonata\AdminBundle\Datagrid\Pager;
+
+/**
+ * @author Andrej Hudec <pulzarraider@gmail.com>
+ */
+class PagerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Pager
+     */
+    private $pager;
+
+    protected function setUp()
+    {
+        $this->pager = $this->getMockForAbstractClass('Sonata\AdminBundle\Datagrid\Pager');
+    }
+
+    /**
+     * @dataProvider getGetMaxPerPage1Tests
+     */
+    public function testGetMaxPerPage1($expectedMaxPerPage, $expectedPage, $maxPerPage, $page)
+    {
+        $this->assertEquals(10, $this->pager->getMaxPerPage());
+        $this->assertEquals(1, $this->pager->getPage());
+
+        if ($page !== null) {
+            $this->pager->setPage($page);
+        }
+
+        $this->pager->setMaxPerPage($maxPerPage);
+
+        $this->assertEquals($expectedPage, $this->pager->getPage());
+        $this->assertEquals($expectedMaxPerPage, $this->pager->getMaxPerPage());
+    }
+
+    public function getGetMaxPerPage1Tests()
+    {
+        return array(
+            array(123, 1, 123, 1),
+            array(123, 321, 123, 321),
+            array(1, 1, 1, 0),
+            array(0, 0, 0, 0),
+            array(1, 1, -1, 1),
+            array(1, 1, -1, 0),
+            array(1, 1, -1, -1),
+            array(0, 0, 0, null),
+        );
+    }
+
+    public function testGetMaxPerPage2()
+    {
+        $this->assertEquals(10, $this->pager->getMaxPerPage());
+        $this->assertEquals(1, $this->pager->getPage());
+
+        $this->pager->setMaxPerPage(0);
+        $this->pager->setPage(0);
+
+        $this->assertEquals(0, $this->pager->getMaxPerPage());
+        $this->assertEquals(0, $this->pager->getPage());
+
+        $this->pager->setMaxPerPage(12);
+
+        $this->assertEquals(12, $this->pager->getMaxPerPage());
+        $this->assertEquals(1, $this->pager->getPage());
+    }
+
+    public function testGetMaxPerPage3()
+    {
+        $this->assertEquals(10, $this->pager->getMaxPerPage());
+        $this->assertEquals(1, $this->pager->getPage());
+
+        $this->pager->setMaxPerPage(0);
+
+        $this->assertEquals(0, $this->pager->getMaxPerPage());
+        $this->assertEquals(0, $this->pager->getPage());
+
+        $this->pager->setMaxPerPage(-1);
+
+        $this->assertEquals(1, $this->pager->getMaxPerPage());
+        $this->assertEquals(1, $this->pager->getPage());
+    }
+
+    public function testGetCurrentMaxLink()
+    {
+        $this->assertEquals(1, $this->pager->getCurrentMaxLink());
+
+        $this->pager->getLinks();
+        $this->assertEquals(1, $this->pager->getCurrentMaxLink());
+
+        $this->callMethod($this->pager, 'setLastPage', array(20));
+        $this->pager->getLinks(10);
+        $this->assertEquals(10, $this->pager->getCurrentMaxLink());
+
+        $this->pager->setMaxPageLinks(5);
+        $this->pager->setPage(2);
+        $this->assertEquals(10, $this->pager->getCurrentMaxLink());
+    }
+
+    public function testGetMaxRecordLimit()
+    {
+        $this->assertEquals(false, $this->pager->getMaxRecordLimit());
+
+        $this->pager->setMaxRecordLimit(99);
+        $this->assertEquals(99, $this->pager->getMaxRecordLimit());
+    }
+
+    public function testGetNbResults()
+    {
+        $this->assertEquals(0, $this->pager->getNbResults());
+
+        $this->callMethod($this->pager, 'setNbResults', array(100));
+
+        $this->assertEquals(100, $this->pager->getNbResults());
+    }
+
+    public function testCount()
+    {
+        $this->assertEquals(0, $this->pager->count());
+
+        $this->callMethod($this->pager, 'setNbResults', array(100));
+
+        $this->assertEquals(100, $this->pager->count());
+    }
+
+    public function testGetQuery()
+    {
+        $query = $this->getMock('Sonata\AdminBundle\Datagrid\ProxyQueryInterface');
+
+        $this->pager->setQuery($query);
+        $this->assertEquals($query, $this->pager->getQuery());
+    }
+
+    public function testGetCountColumn()
+    {
+        $this->assertEquals(array('id'), $this->pager->getCountColumn());
+
+        $this->pager->setCountColumn(array('foo'));
+        $this->assertEquals(array('foo'), $this->pager->getCountColumn());
+    }
+
+    public function testParameters()
+    {
+        $this->assertEquals(null, $this->pager->getParameter('foo', null));
+        $this->assertEquals('bar', $this->pager->getParameter('foo', 'bar'));
+        $this->assertFalse($this->pager->hasParameter('foo'));
+        $this->assertEquals(array(), $this->pager->getParameters());
+
+        $this->pager->setParameter('foo', 'foo_value');
+
+        $this->assertTrue($this->pager->hasParameter('foo'));
+        $this->assertEquals('foo_value', $this->pager->getParameter('foo', null));
+        $this->assertEquals('foo_value', $this->pager->getParameter('foo', 'bar'));
+        $this->assertEquals(array('foo' => 'foo_value'), $this->pager->getParameters());
+
+        $this->pager->setParameter('foo', 'baz');
+
+        $this->assertTrue($this->pager->hasParameter('foo'));
+        $this->assertEquals('baz', $this->pager->getParameter('foo', null));
+        $this->assertEquals('baz', $this->pager->getParameter('foo', 'bar'));
+        $this->assertEquals(array('foo' => 'baz'), $this->pager->getParameters());
+
+        $this->pager->setParameter('foo2', 'foo2_value');
+
+        $this->assertTrue($this->pager->hasParameter('foo2'));
+        $this->assertEquals('foo2_value', $this->pager->getParameter('foo2', null));
+        $this->assertEquals('foo2_value', $this->pager->getParameter('foo2', 'bar'));
+        $this->assertEquals(array('foo'  => 'baz', 'foo2' => 'foo2_value'), $this->pager->getParameters());
+    }
+
+    public function testGetMaxPageLinks()
+    {
+        $this->assertEquals(0, $this->pager->getMaxPageLinks());
+
+        $this->pager->setMaxPageLinks(123);
+        $this->assertEquals(123, $this->pager->getMaxPageLinks());
+    }
+
+    public function testIsFirstPage()
+    {
+        $this->assertTrue($this->pager->isFirstPage());
+
+        $this->pager->setPage(123);
+        $this->assertFalse($this->pager->isFirstPage());
+    }
+
+    public function testIsLastPage()
+    {
+        $this->assertTrue($this->pager->isLastPage());
+        $this->assertEquals(1, $this->pager->getLastPage());
+
+        $this->pager->setPage(10);
+        $this->callMethod($this->pager, 'setLastPage', array(50));
+        $this->assertEquals(50, $this->pager->getLastPage());
+        $this->assertFalse($this->pager->isLastPage());
+
+        $this->pager->setPage(50);
+        $this->assertTrue($this->pager->isLastPage());
+
+        $this->callMethod($this->pager, 'setLastPage', array(20));
+        $this->assertEquals(20, $this->pager->getPage());
+        $this->assertEquals(20, $this->pager->getLastPage());
+        $this->assertTrue($this->pager->isLastPage());
+    }
+
+    public function testGetLinks()
+    {
+        $this->assertEquals(array(), $this->pager->getLinks());
+
+        $this->pager->setPage(1);
+        $this->pager->setMaxPageLinks(1);
+        $this->assertEquals(array(1), $this->pager->getLinks());
+        $this->assertEquals(array(1), $this->pager->getLinks(10));
+
+        $this->pager->setPage(1);
+        $this->pager->setMaxPageLinks(7);
+        $this->callMethod($this->pager, 'setLastPage', array(50));
+        $this->assertEquals(7, count($this->pager->getLinks()));
+        $this->assertEquals(array(1, 2, 3, 4, 5, 6, 7), $this->pager->getLinks());
+
+        $this->pager->setPage(10);
+        $this->pager->setMaxPageLinks(12);
+        $this->assertEquals(5, count($this->pager->getLinks(5)));
+        $this->assertEquals(array(8, 9, 10, 11, 12), $this->pager->getLinks(5));
+
+        $this->pager->setPage(10);
+        $this->pager->setMaxPageLinks(6);
+        $this->assertEquals(6, count($this->pager->getLinks()));
+        $this->assertEquals(array(7, 8, 9, 10, 11, 12), $this->pager->getLinks());
+
+        $this->pager->setPage(50);
+        $this->pager->setMaxPageLinks(6);
+        $this->assertEquals(6, count($this->pager->getLinks()));
+        $this->assertEquals(array(45, 46, 47, 48, 49, 50), $this->pager->getLinks());
+    }
+
+    public function testHaveToPaginate()
+    {
+        $this->assertFalse($this->pager->haveToPaginate());
+
+        $this->pager->setMaxPerPage(10);
+        $this->assertFalse($this->pager->haveToPaginate());
+
+        $this->callMethod($this->pager, 'setNbResults', array(100));
+        $this->assertTrue($this->pager->haveToPaginate());
+    }
+
+    public function testIterator()
+    {
+        $this->assertTrue($this->pager instanceof \Iterator);
+
+        $object1 = new \stdClass();
+        $object1->foo = 'bar1';
+
+        $object2 = new \stdClass();
+        $object2->foo = 'bar2';
+
+        $object3 = new \stdClass();
+        $object3->foo = 'bar3';
+
+        $expectedObjects = array($object1, $object2, $object3);
+
+        $this->pager->expects($this->any())
+            ->method('getResults')
+            ->will($this->returnValue($expectedObjects));
+
+        $counter = 0;
+        $values = array();
+        foreach ($this->pager as $key => $value) {
+            $values[$key] = $value;
+            $counter++;
+        }
+
+        $this->assertEquals(3, $counter);
+        $this->assertEquals($object3, $value);
+        $this->assertEquals($expectedObjects, $values);
+
+        $this->assertFalse($this->pager->valid());
+
+        $this->callMethod($this->pager, 'resetIterator');
+        $this->assertTrue($this->pager->valid());
+    }
+
+    public function testValid()
+    {
+        $this->assertFalse($this->pager->valid());
+    }
+
+    public function testNext()
+    {
+        $this->pager->expects($this->any())
+            ->method('getResults')
+            ->will($this->returnValue(array()));
+
+        $this->assertFalse($this->pager->next());
+    }
+
+    public function testKey()
+    {
+        $this->pager->expects($this->any())
+            ->method('getResults')
+            ->will($this->returnValue(array(123 => new \stdClass)));
+
+        $this->assertEquals(123, $this->pager->key());
+    }
+
+    public function testCurrent()
+    {
+        $object = new \stdClass;
+
+        $this->pager->expects($this->any())
+            ->method('getResults')
+            ->will($this->returnValue(array($object)));
+
+        $this->assertEquals($object, $this->pager->current());
+    }
+
+    public function testGetCursor()
+    {
+        $this->assertEquals(1, $this->pager->getCursor());
+
+        $this->pager->setCursor(0);
+        $this->assertEquals(1, $this->pager->getCursor());
+
+        $this->pager->setCursor(300);
+        $this->assertEquals(0, $this->pager->getCursor());
+
+        $this->callMethod($this->pager, 'setNbResults', array(100));
+
+        $this->pager->setCursor(5);
+        $this->assertEquals(5, $this->pager->getCursor());
+
+        $this->pager->setCursor(300);
+        $this->assertEquals(100, $this->pager->getCursor());
+    }
+
+    public function testGetObjectByCursor()
+    {
+        $object1 = new \stdClass();
+        $object1->foo = 'bar1';
+
+        $object2 = new \stdClass();
+        $object2->foo = 'bar2';
+
+        $object3 = new \stdClass();
+        $object3->foo = 'bar3';
+
+        $this->callMethod($this->pager, 'setNbResults', array(3));
+
+        $query = $this->getMock('Sonata\AdminBundle\Datagrid\ProxyQueryInterface');
+
+        $query->expects($this->any())
+            ->method('setFirstResult')
+            ->will($this->returnValue($query));
+
+        $query->expects($this->any())
+            ->method('setMaxResults')
+            ->will($this->returnValue($query));
+
+        $id = 0;
+        $query->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function() use (&$id, $object1, $object2, $object3) {
+                switch ($id) {
+                    case 0:
+                        return array($object1);
+                        break;
+
+                    case 1:
+                        return array($object2);
+                        break;
+
+                    case 2:
+                        return array($object3);
+                        break;
+                }
+
+                return null;
+            }));
+
+        $this->pager->setQuery($query);
+
+        $this->assertEquals($object1, $this->pager->getObjectByCursor(1));
+        $this->assertEquals(1, $this->pager->getCursor());
+
+        $id = 1;
+        $this->assertEquals($object2, $this->pager->getObjectByCursor(2));
+        $this->assertEquals(2, $this->pager->getCursor());
+
+        $id = 2;
+        $this->assertEquals($object3, $this->pager->getObjectByCursor(3));
+        $this->assertEquals(3, $this->pager->getCursor());
+
+        $id = 3;
+        $this->assertEquals(null, $this->pager->getObjectByCursor(4));
+        $this->assertEquals(3, $this->pager->getCursor());
+    }
+
+    public function testGetFirstPage()
+    {
+        $this->assertEquals(1, $this->pager->getFirstPage());
+    }
+
+    public function testGetNextPage()
+    {
+        $this->assertEquals(1, $this->pager->getNextPage());
+
+        $this->pager->setPage(3);
+        $this->callMethod($this->pager, 'setLastPage', array(20));
+        $this->assertEquals(4, $this->pager->getNextPage());
+
+        $this->pager->setPage(21);
+        $this->assertEquals(20, $this->pager->getNextPage());
+    }
+
+    public function testGetPreviousPage()
+    {
+        $this->assertEquals(1, $this->pager->getPreviousPage());
+
+        $this->pager->setPage(3);
+        $this->assertEquals(2, $this->pager->getPreviousPage());
+
+        $this->pager->setPage(21);
+        $this->assertEquals(20, $this->pager->getPreviousPage());
+    }
+
+    public function testGetFirstIndice()
+    {
+        $this->assertEquals(1, $this->pager->getFirstIndice());
+
+        $this->pager->setMaxPerPage(0);
+        $this->pager->setPage(0);
+        $this->assertEquals(1, $this->pager->getFirstIndice());
+
+        $this->pager->setPage(2);
+        $this->pager->setMaxPerPage(10);
+        $this->assertEquals(11, $this->pager->getFirstIndice());
+
+        $this->pager->setPage(4);
+        $this->pager->setMaxPerPage(7);
+        $this->assertEquals(22, $this->pager->getFirstIndice());
+    }
+
+    public function testGetLastIndice()
+    {
+        $this->assertEquals(0, $this->pager->getLastIndice());
+
+        $this->pager->setMaxPerPage(0);
+        $this->pager->setPage(0);
+        $this->assertEquals(0, $this->pager->getLastIndice());
+
+        $this->callMethod($this->pager, 'setNbResults', array(100));
+
+        $this->assertEquals(100, $this->pager->getLastIndice());
+
+        $this->pager->setPage(2);
+        $this->assertEquals(0, $this->pager->getLastIndice());
+
+        $this->pager->setMaxPerPage(10);
+        $this->assertEquals(20, $this->pager->getLastIndice());
+
+        $this->pager->setPage(11);
+        $this->assertEquals(100, $this->pager->getLastIndice());
+    }
+
+    public function testGetNext()
+    {
+        $this->assertEquals(null, $this->pager->getNext());
+
+        $object1 = new \stdClass();
+        $object1->foo = 'bar1';
+
+        $object2 = new \stdClass();
+        $object2->foo = 'bar2';
+
+        $object3 = new \stdClass();
+        $object3->foo = 'bar3';
+
+        $this->callMethod($this->pager, 'setNbResults', array(3));
+
+        $query = $this->getMock('Sonata\AdminBundle\Datagrid\ProxyQueryInterface');
+
+        $query->expects($this->any())
+            ->method('setFirstResult')
+            ->will($this->returnValue($query));
+
+        $query->expects($this->any())
+            ->method('setMaxResults')
+            ->will($this->returnValue($query));
+
+        $id = 0;
+        $query->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function() use (&$id, $object1, $object2, $object3) {
+                switch ($id) {
+                    case 0:
+                        return array($object1);
+                        break;
+
+                    case 1:
+                        return array($object2);
+                        break;
+
+                    case 2:
+                        return array($object3);
+                        break;
+                }
+
+                return null;
+            }));
+
+        $this->pager->setQuery($query);
+
+        $this->pager->setCursor(1);
+        $this->assertEquals($object1, $this->pager->getCurrent());
+
+        $id++;
+        $this->assertEquals($object2, $this->pager->getNext());
+
+        $id++;
+        $this->assertEquals($object3, $this->pager->getNext());
+
+        $id++;
+        $this->assertEquals(null, $this->pager->getNext());
+    }
+
+    public function testGetPrevious()
+    {
+        $this->assertEquals(null, $this->pager->getPrevious());
+
+        $object1 = new \stdClass();
+        $object1->foo = 'bar1';
+
+        $object2 = new \stdClass();
+        $object2->foo = 'bar2';
+
+        $object3 = new \stdClass();
+        $object3->foo = 'bar3';
+
+        $this->callMethod($this->pager, 'setNbResults', array(3));
+
+        $query = $this->getMock('Sonata\AdminBundle\Datagrid\ProxyQueryInterface');
+
+        $query->expects($this->any())
+            ->method('setFirstResult')
+            ->will($this->returnValue($query));
+
+        $query->expects($this->any())
+            ->method('setMaxResults')
+            ->will($this->returnValue($query));
+
+        $id = 2;
+        $query->expects($this->any())
+            ->method('execute')
+            ->will($this->returnCallback(function() use (&$id, $object1, $object2, $object3) {
+                switch ($id) {
+                    case 0:
+                        return array($object1);
+                        break;
+
+                    case 1:
+                        return array($object2);
+                        break;
+
+                    case 2:
+                        return array($object3);
+                        break;
+                }
+
+                return null;
+            }));
+
+        $this->pager->setQuery($query);
+
+        $this->pager->setCursor(2);
+        $this->assertEquals($object3, $this->pager->getCurrent());
+
+        $id--;
+        $this->assertEquals($object2, $this->pager->getPrevious());
+
+        $id--;
+        $this->assertEquals($object1, $this->pager->getPrevious());
+
+        $id--;
+        $this->assertEquals(null, $this->pager->getPrevious());
+    }
+
+    public function testSerialize()
+    {
+        $pagerClone = clone $this->pager;
+        $data  = $this->pager->serialize();
+        $this->assertNotEmpty($data);
+
+        $this->pager->setPage(12);
+        $this->pager->setMaxPerPage(4);
+        $this->pager->setMaxPageLinks(6);
+
+        $this->pager->unserialize($data);
+        $this->assertEquals($pagerClone, $this->pager);
+    }
+
+    public function testUnserialize()
+    {
+        $serialized = array(
+            'page' => 6,
+            'maxPerPage' => 7,
+            'maxPageLinks' => 5,
+            'lastPage' => 4,
+            'nbResults' => 30,
+            'cursor' => 3,
+            'parameters' => array('foo'=>'bar'),
+            'currentMaxLink' => 2,
+            'maxRecordLimit' => 22,
+            'countColumn' => array('idx'),
+        );
+
+        $this->pager->expects($this->any())
+            ->method('getResults')
+            ->will($this->returnValue(array()));
+        $this->pager->current();
+
+        $this->pager->unserialize(serialize($serialized));
+
+        $this->assertEquals(7, $this->pager->getMaxPerPage());
+        $this->assertEquals(6, $this->pager->getPage());
+        $this->assertEquals(5, $this->pager->getMaxPageLinks());
+        $this->assertEquals(4, $this->pager->getLastPage());
+        $this->assertEquals(array('idx'), $this->pager->getCountColumn());
+        $this->assertEquals(30, $this->pager->getNbResults());
+        $this->assertEquals(3, $this->pager->getCursor());
+        $this->assertEquals(array('foo'=>'bar'), $this->pager->getParameters());
+        $this->assertEquals(2, $this->pager->getCurrentMaxLink());
+        $this->assertEquals(22, $this->pager->getMaxRecordLimit());
+        $this->assertEquals(null, $this->pager->getQuery());
+    }
+
+    protected function callMethod($obj, $name, array $args = array())
+    {
+        $class = new \ReflectionClass($obj);
+        $method = $class->getMethod($name);
+        $method->setAccessible(true);
+
+        return $method->invokeArgs($obj, $args);
+    }
+}