From 80b9ce3c3e718ed1fcb99823aebcd9c744e57b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 8 Apr 2025 14:26:19 +0200 Subject: [PATCH] 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. --- .../Test/Export/AbstractAggregatorTest.php | 60 +++++++++++++++++-- .../Test/Export/AbstractFilterTest.php | 5 +- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/Bundle/ChillMainBundle/Test/Export/AbstractAggregatorTest.php b/src/Bundle/ChillMainBundle/Test/Export/AbstractAggregatorTest.php index 12182b96b..4069a75b0 100644 --- a/src/Bundle/ChillMainBundle/Test/Export/AbstractAggregatorTest.php +++ b/src/Bundle/ChillMainBundle/Test/Export/AbstractAggregatorTest.php @@ -11,6 +11,8 @@ declare(strict_types=1); namespace Chill\MainBundle\Test\Export; +use Chill\MainBundle\Entity\User; +use Chill\MainBundle\Export\ExportGenerationContext; use Doctrine\ORM\AbstractQuery; use Doctrine\ORM\EntityManagerInterface; 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`. */ @@ -165,6 +179,19 @@ abstract class AbstractAggregatorTest extends KernelTestCase */ 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. * @@ -176,7 +203,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase { $aliases = $qb->getAllAliases(); - $this->getAggregator()->alterQuery($qb, $data); + $this->getAggregator()->alterQuery($qb, $data, new ExportGenerationContext($this->getUser())); $alteredQuery = $qb->getAllAliases(); @@ -194,7 +221,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase */ 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(); @@ -218,7 +245,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase $nbOfSelect = null !== $query->getDQLPart('select') ? \count($query->getDQLPart('select')) : 0; - $this->getAggregator()->alterQuery($query, $data); + $this->getAggregator()->alterQuery($query, $data, new ExportGenerationContext($this->getUser())); $this->assertGreaterThanOrEqual( $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. * @@ -302,7 +354,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase $qb->setMaxResults(1); $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); diff --git a/src/Bundle/ChillMainBundle/Test/Export/AbstractFilterTest.php b/src/Bundle/ChillMainBundle/Test/Export/AbstractFilterTest.php index c34cfc706..5fd638a1e 100644 --- a/src/Bundle/ChillMainBundle/Test/Export/AbstractFilterTest.php +++ b/src/Bundle/ChillMainBundle/Test/Export/AbstractFilterTest.php @@ -90,7 +90,7 @@ abstract class AbstractFilterTest extends KernelTestCase } } - private function getUser(): User + protected function getUser(): User { $em = static::getContainer()->get(EntityManagerInterface::class); 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 { $filter = $this->getFilter(); + $em = $this->getContainer()->get(EntityManagerInterface::class); $normalized = $filter->normalizeFormData($data); $actual = $filter->denormalizeFormData($normalized, $version); @@ -162,6 +163,8 @@ abstract class AbstractFilterTest extends KernelTestCase 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]); }