Refactor tests to include ExportGenerationContext and data normalization

Added ExportGenerationContext usage in aggregator and filter tests to provide user context during query alterations. Introduced new data normalization tests and related logic, ensuring consistency and validation for normalized and denormalized forms. Refactored `getUser` methods for better scoping and reusability.
This commit is contained in:
Julien Fastré 2025-04-08 14:26:19 +02:00
parent 3f218e7183
commit 80b9ce3c3e
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
2 changed files with 60 additions and 5 deletions

View File

@ -11,6 +11,8 @@ declare(strict_types=1);
namespace Chill\MainBundle\Test\Export; namespace Chill\MainBundle\Test\Export;
use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Export\ExportGenerationContext;
use Doctrine\ORM\AbstractQuery; use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
@ -54,6 +56,18 @@ abstract class AbstractAggregatorTest extends KernelTestCase
} }
} }
/**
* A list of data to normalize.
*
* @return iterable{array}
*/
public static function dataProviderFormDataToNormalize(): iterable
{
foreach (static::getFormData() as $data) {
yield [$data, 1, []];
}
}
/** /**
* provide data for `testAlterQuery`. * provide data for `testAlterQuery`.
*/ */
@ -165,6 +179,19 @@ abstract class AbstractAggregatorTest extends KernelTestCase
*/ */
abstract public static function getQueryBuilders(); abstract public static function getQueryBuilders();
protected function getUser(): User
{
$em = static::getContainer()->get(EntityManagerInterface::class);
if (null === $user = $em->createQueryBuilder()->select('u')
->from(User::class, 'u')
->setMaxResults(1)
->getQuery()->getOneOrNullResult()) {
throw new \RuntimeException('User not found');
}
return $user;
}
/** /**
* Compare aliases array before and after that aggregator alter query. * Compare aliases array before and after that aggregator alter query.
* *
@ -176,7 +203,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase
{ {
$aliases = $qb->getAllAliases(); $aliases = $qb->getAllAliases();
$this->getAggregator()->alterQuery($qb, $data); $this->getAggregator()->alterQuery($qb, $data, new ExportGenerationContext($this->getUser()));
$alteredQuery = $qb->getAllAliases(); $alteredQuery = $qb->getAllAliases();
@ -194,7 +221,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase
*/ */
public function testQueryExecution(QueryBuilder $qb, array $data): void public function testQueryExecution(QueryBuilder $qb, array $data): void
{ {
$this->getAggregator()->alterQuery($qb, $data); $this->getAggregator()->alterQuery($qb, $data, new ExportGenerationContext($this->getUser()));
$actual = $qb->getQuery()->getResult(); $actual = $qb->getQuery()->getResult();
@ -218,7 +245,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase
$nbOfSelect = null !== $query->getDQLPart('select') ? $nbOfSelect = null !== $query->getDQLPart('select') ?
\count($query->getDQLPart('select')) : 0; \count($query->getDQLPart('select')) : 0;
$this->getAggregator()->alterQuery($query, $data); $this->getAggregator()->alterQuery($query, $data, new ExportGenerationContext($this->getUser()));
$this->assertGreaterThanOrEqual( $this->assertGreaterThanOrEqual(
$nbOfFrom, $nbOfFrom,
@ -256,6 +283,31 @@ abstract class AbstractAggregatorTest extends KernelTestCase
); );
} }
/**
* @dataProvider dataProviderFormDataToNormalize
*/
public function testDataNormalization(array $data, int $version, array $customAssert): void
{
$aggregator = $this->getAggregator();
$em = $this->getContainer()->get(EntityManagerInterface::class);
$normalized = $aggregator->normalizeFormData($data);
$actual = $aggregator->denormalizeFormData($normalized, $version);
self::assertEqualsCanonicalizing(array_keys($data), array_keys($actual));
foreach ($data as $key => $value) {
self::assertArrayHasKey($key, $actual);
if (array_key_exists($key, $customAssert)) {
call_user_func($customAssert[$key], $actual[$key], $value);
} elseif ($em->contains($value)) {
self::assertEquals($value->getId(), $actual[$key]->getId());
} else {
self::assertEquals($value, $actual[$key]);
}
}
}
/** /**
* Test that the query keys are strings. * Test that the query keys are strings.
* *
@ -302,7 +354,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase
$qb->setMaxResults(1); $qb->setMaxResults(1);
$queryKeys = $this->getAggregator()->getQueryKeys($data); $queryKeys = $this->getAggregator()->getQueryKeys($data);
$this->getAggregator()->alterQuery($qb, $data); $this->getAggregator()->alterQuery($qb, $data, new ExportGenerationContext($this->getUser()));
$results = $qb->getQuery()->getResult(AbstractQuery::HYDRATE_ARRAY); $results = $qb->getQuery()->getResult(AbstractQuery::HYDRATE_ARRAY);

View File

@ -90,7 +90,7 @@ abstract class AbstractFilterTest extends KernelTestCase
} }
} }
private function getUser(): User protected function getUser(): User
{ {
$em = static::getContainer()->get(EntityManagerInterface::class); $em = static::getContainer()->get(EntityManagerInterface::class);
if (null === $user = $em->createQueryBuilder()->select('u') if (null === $user = $em->createQueryBuilder()->select('u')
@ -152,6 +152,7 @@ abstract class AbstractFilterTest extends KernelTestCase
public function testDataNormalization(array $data, int $version, array $customAssert): void public function testDataNormalization(array $data, int $version, array $customAssert): void
{ {
$filter = $this->getFilter(); $filter = $this->getFilter();
$em = $this->getContainer()->get(EntityManagerInterface::class);
$normalized = $filter->normalizeFormData($data); $normalized = $filter->normalizeFormData($data);
$actual = $filter->denormalizeFormData($normalized, $version); $actual = $filter->denormalizeFormData($normalized, $version);
@ -162,6 +163,8 @@ abstract class AbstractFilterTest extends KernelTestCase
self::assertArrayHasKey($key, $actual); self::assertArrayHasKey($key, $actual);
if (array_key_exists($key, $customAssert)) { if (array_key_exists($key, $customAssert)) {
call_user_func($customAssert[$key], $actual[$key], $value); call_user_func($customAssert[$key], $actual[$key], $value);
} elseif ($em->contains($value)) {
self::assertEquals($value->getId(), $actual[$key]->getId());
} else { } else {
self::assertEquals($value, $actual[$key]); self::assertEquals($value, $actual[$key]);
} }