Skip to content

Commit

Permalink
Refactoring and tests update
Browse files Browse the repository at this point in the history
  • Loading branch information
pfilsx committed Apr 17, 2019
1 parent 249f0bb commit 681add5
Show file tree
Hide file tree
Showing 15 changed files with 199 additions and 48 deletions.
6 changes: 6 additions & 0 deletions src/Grid/DataGridBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,12 @@ public function enablePagination($options = []): DataGridBuilderInterface
return $this;
}

public function setCountFieldName(string $name): DataGridBuilderInterface
{
$this->provider->setCountFieldName($name);
return $this;
}

/**
* @internal
* @return array
Expand Down
2 changes: 2 additions & 0 deletions src/Grid/DataGridBuilderInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public function setNoDataMessage(string $message): self;

public function enablePagination($options = []): self;

public function setCountFieldName(string $name): self;

/**
* @internal
* @return array
Expand Down
13 changes: 13 additions & 0 deletions src/Grid/Providers/DataProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ abstract class DataProvider implements DataProviderInterface
{
protected $pager;

protected $countFieldName;

/**
* @internal
* @return Pager
Expand All @@ -32,6 +34,17 @@ public function setPager(Pager $pager): void
$this->pager = $pager;
}

public function setCountFieldName(string $name): DataProviderInterface
{
$this->countFieldName = $name;
return $this;
}

public function getCountFieldName(): string
{
return $this->countFieldName;
}

public static function create($data, ManagerRegistry $doctrine): DataProviderInterface
{
if ($data instanceof ServiceEntityRepository) {
Expand Down
4 changes: 4 additions & 0 deletions src/Grid/Providers/DataProviderInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,8 @@ public function addRelationFilter(string $attribute, $value, string $relationCla
public function addCustomFilter(string $attribute, $value, callable $callback): self;

public function addDateFilter(string $attribute, $value, string $comparison = 'equal'): self;

public function setCountFieldName(string $name): self;

public function getCountFieldName(): string;
}
6 changes: 5 additions & 1 deletion src/Grid/Providers/QueryBuilderDataProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use DateTime;
use Doctrine\ORM\QueryBuilder;
use Pfilsx\DataGrid\DataGridException;
use Pfilsx\DataGrid\Grid\DataGridItem;
use Pfilsx\DataGrid\Grid\Hydrators\DataGridHydrator;
use ReflectionClass;
Expand Down Expand Up @@ -47,8 +48,11 @@ public function getItems(): array

public function getTotalCount(): int
{
if (empty($this->countFieldName)) {
throw new DataGridException("countableFieldName must be set for " . static::class);
}
$countQueryBuilder = clone($this->builder);
$countQueryBuilder->select("count(article.id)");
$countQueryBuilder->select("count({$this->countFieldName})");
$countQueryBuilder->setMaxResults(null);
$countQueryBuilder->setFirstResult(null);
$countQueryBuilder->resetDQLPart('groupBy');
Expand Down
2 changes: 1 addition & 1 deletion src/Grid/Providers/RepositoryDataProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public function getTotalCount(): int
/**
* @return Criteria
*/
protected function getCriteria()
public function getCriteria()
{
return $this->criteria ?? ($this->criteria = Criteria::create());
}
Expand Down
25 changes: 25 additions & 0 deletions tests/BaseCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Pfilsx\DataGrid\tests;

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\QueryBuilder;
use Pfilsx\DataGrid\Grid\Columns\AbstractColumn;
Expand Down Expand Up @@ -101,6 +102,30 @@ private function createDoctrineMock()
->willReturn($self->createQueryBuilderMock());
return $mock;
}));
$mock->expects($this->any())
->method('getManager')
->will($this->returnCallback(function ($param) use ($self) {
$mock = $self->createMock(ObjectManager::class);
$mock->expects($this->any())
->method('getClassMetadata')
->willReturn(new class
{
public function getIdentifier()
{
return ['id'];
}
});
$mock->expects($this->any())
->method('getRepository')
->will($this->returnCallback(function ($param) use ($self) {
$mock = $self->createMock(ServiceEntityRepository::class);
$mock->expects($this->any())
->method('createQueryBuilder')
->willReturn($self->createQueryBuilderMock());
return $mock;
}));
return $mock;
}));
return $mock;
}

Expand Down
65 changes: 61 additions & 4 deletions tests/DataGridBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,17 @@
namespace Pfilsx\DataGrid\tests;


use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use InvalidArgumentException;
use Pfilsx\DataGrid\Grid\Columns\AbstractColumn;
use Pfilsx\DataGrid\Grid\Columns\ActionColumn;
use Pfilsx\DataGrid\Grid\Columns\BooleanColumn;
use Pfilsx\DataGrid\Grid\Columns\DataColumn;
use Pfilsx\DataGrid\Grid\Columns\DateColumn;
use Pfilsx\DataGrid\Grid\Columns\ImageColumn;
use Pfilsx\DataGrid\Grid\Columns\SerialColumn;
use Pfilsx\DataGrid\Grid\DataGridBuilder;
use Pfilsx\DataGrid\Grid\Providers\DataProvider;

class DataGridBuilderTest extends BaseCase
{
Expand All @@ -31,6 +34,8 @@ protected function setUp(): void
{
parent::setUp();
$this->builder = new DataGridBuilder($this->containerArray);
$provider = DataProvider::create($this->createMock(ServiceEntityRepository::class), $this->containerArray['doctrine']);
$this->builder->setProvider($provider);
}

public function testWrongColumnClass(): void
Expand Down Expand Up @@ -63,10 +68,14 @@ public function testAddColumn()
$this->assertInstanceOf(ImageColumn::class, $this->builder->getColumns()[3]);

$this->builder->addColumn(self::DATE_COLUMN, [
'attribute' => 'creationDate'
'attribute' => 'creationDate',
'filter' => [
'class' => 'Pfilsx\DataGrid\Grid\Filters\DateFilter'
]
]);
$this->assertCount(5, $this->builder->getColumns());
$this->assertInstanceOf(DateColumn::class, $this->builder->getColumns()[4]);
$this->assertTrue($this->builder->hasFilters());

$this->builder->addColumn(self::ACTION_COLUMN, [
'pathPrefix' => 'category_'
Expand All @@ -90,10 +99,58 @@ public function testSetTemplate($builder): void
public function testSetPagination(): void
{
$this->builder->enablePagination(['limit' => 10]);
$this->assertTrue($this->builder->getOptions()['pagination']);
$this->assertEquals(10, $this->builder->getOptions()['paginationOptions']['limit']);
$this->assertTrue($this->builder->hasPagination());
$this->assertEquals(10, $this->builder->getPager()->getLimit());

$this->builder->enablePagination(false);
$this->assertFalse($this->builder->getOptions()['pagination']);
$this->assertFalse($this->builder->hasPagination());
}

/**
* @depends testAddColumn
* @param DataGridBuilder $builder
*/
public function testSetSort($builder): void
{
$builder->setSort('creationDate', 'DESC');
foreach ($builder->getColumns() as $column) {
/**
* @var $column AbstractColumn
*/
if ($column->hasSort()) {
if ($column->getAttribute() == 'creationDate') {
$this->assertEquals('DESC', $column->getSort());
} else {
$this->assertTrue($column->getSort());
}
} else {
$this->assertFalse($column->getSort());
}
}
}

public function testSetCountFieldName(): void
{
$this->builder->setCountFieldName('id');
$this->assertEquals('id', $this->builder->getProvider()->getCountFieldName());
}

/**
* @depends testAddColumn
* @param DataGridBuilder $builder
*/
public function testSetFiltersValues($builder): void
{
$builder->setFiltersValues(['creationDate' => '01.01.1990']);
foreach ($builder->getColumns() as $column) {
/**
* @var $column AbstractColumn
*/
if ($column->hasFilter()) {
$this->assertEquals('01.01.1990', $column->getFilterValue());
} else {
$this->assertNull($column->getFilterValue());
}
}
}
}
50 changes: 27 additions & 23 deletions tests/DataGridFiltersBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@

namespace Pfilsx\DataGrid\tests;

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Collections\Criteria;
use Doctrine\Common\Collections\Expr\Expression;
use Pfilsx\DataGrid\Grid\DataGridFiltersBuilder;
use Pfilsx\DataGrid\Grid\Providers\DataProvider;

class DataGridFiltersBuilderTest extends BaseCase
{
Expand All @@ -17,86 +19,88 @@ class DataGridFiltersBuilderTest extends BaseCase
protected function setUp(): void
{
parent::setUp();
$this->builder = new DataGridFiltersBuilder($this->containerArray);
$this->builder = new DataGridFiltersBuilder();
$provider = DataProvider::create($this->createMock(ServiceEntityRepository::class), $this->containerArray['doctrine']);
$this->builder->setProvider($provider);
}

public function testAddEqualFilterOnEmptyData(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
$this->builder->addEqualFilter('id');
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
}

public function testAddEqualFilter(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
$this->builder->setParams(['id' => '1']);
$this->builder->addEqualFilter('id');
$this->assertInstanceOf(Expression::class, $this->builder->getCriteria()->getWhereExpression());
$this->assertInstanceOf(Expression::class, $this->builder->getProvider()->getCriteria()->getWhereExpression());
}

public function testAddEqualFilterNull(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
$this->builder->setParams(['id' => null]);
$this->builder->addEqualFilter('id');
$this->assertInstanceOf(Expression::class, $this->builder->getCriteria()->getWhereExpression());
$this->assertInstanceOf(Expression::class, $this->builder->getProvider()->getCriteria()->getWhereExpression());
}

public function testAddLikeFilterOnEmptyData(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
$this->builder->addLikeFilter('id');
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
}

public function testAddLikeFilter(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
$this->builder->setParams(['id' => '1']);
$this->builder->addLikeFilter('id');
$this->assertInstanceOf(Expression::class, $this->builder->getCriteria()->getWhereExpression());
$this->assertInstanceOf(Expression::class, $this->builder->getProvider()->getCriteria()->getWhereExpression());
}

public function testAddRelationFilterOnEmptyData(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
$this->builder->addRelationFilter('fid', 'App\Entity\TestEntity');
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
}

public function testAddRelationFilter(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
$this->builder->setParams(['fid' => '1']);
$this->builder->addRelationFilter('fid', 'App\Entity\TestEntity');
$this->assertInstanceOf(Expression::class, $this->builder->getCriteria()->getWhereExpression());
$this->assertInstanceOf(Expression::class, $this->builder->getProvider()->getCriteria()->getWhereExpression());
}

public function testAddCustomFilterOnEmptyData(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
$this->builder->addCustomFilter('id', function ($criteria, $attr, $value) {
$criteria->andWhere(Criteria::expr()->eq($attr, $value));
});
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
}

public function testAddCustomFilter(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
$this->builder->setParams(['id' => '1']);
$this->builder->addCustomFilter('id', function ($criteria, $attr, $value) {
$criteria->andWhere(Criteria::expr()->eq($attr, $value));
});
$this->assertInstanceOf(Expression::class, $this->builder->getCriteria()->getWhereExpression());
$this->assertInstanceOf(Expression::class, $this->builder->getProvider()->getCriteria()->getWhereExpression());
}

public function testAddDateFilterOnEmptyData(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
$this->builder->addDateFilter('id');
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
}

/**
Expand All @@ -105,10 +109,10 @@ public function testAddDateFilterOnEmptyData(): void
*/
public function testAddDateFilter($comparison): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->assertNull($this->builder->getProvider()->getCriteria()->getWhereExpression());
$this->builder->setParams(['date' => '01-01-1990']);
$this->builder->addDateFilter('date', $comparison);
$this->assertInstanceOf(Expression::class, $this->builder->getCriteria()->getWhereExpression());
$this->assertInstanceOf(Expression::class, $this->builder->getProvider()->getCriteria()->getWhereExpression());
}


Expand Down
Loading

0 comments on commit 681add5

Please sign in to comment.