Add data normalization test and context handling improvements

Introduced data normalization testing methods to validate form data processing. Enhanced `initiateQuery` to include `ExportGenerationContext` with user retrieval logic for improved query handling. These changes strengthen data integrity and contextual query execution within export functionality.
This commit is contained in:
Julien Fastré 2025-04-08 14:42:34 +02:00
parent 80b9ce3c3e
commit 694b1f3c1f
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB

View File

@ -11,7 +11,9 @@ declare(strict_types=1);
namespace Chill\MainBundle\Test\Export; namespace Chill\MainBundle\Test\Export;
use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Export\DirectExportInterface; use Chill\MainBundle\Export\DirectExportInterface;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\ExportInterface; use Chill\MainBundle\Export\ExportInterface;
use Chill\MainBundle\Test\PrepareClientTrait; use Chill\MainBundle\Test\PrepareClientTrait;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
@ -31,6 +33,18 @@ abstract class AbstractExportTest extends WebTestCase
{ {
use PrepareClientTrait; use PrepareClientTrait;
/**
* A list of data to normalize.
*
* @return iterable{array}
*/
public static function dataProviderFormDataToNormalize(): iterable
{
foreach (static::getFormData() as $data) {
yield [$data, 1, []];
}
}
public static function dataProviderGetQueryKeys() public static function dataProviderGetQueryKeys()
{ {
foreach (static::getFormData() as $data) { foreach (static::getFormData() as $data) {
@ -120,6 +134,19 @@ abstract class AbstractExportTest extends WebTestCase
*/ */
abstract public static function getModifiersCombination(): array; abstract public static function getModifiersCombination(): array;
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;
}
protected function getParameters(bool $filterStatsByCenter): ParameterBagInterface protected function getParameters(bool $filterStatsByCenter): ParameterBagInterface
{ {
return new ParameterBag(['chill_main' => ['acl' => ['filter_stats_by_center' => $filterStatsByCenter]]]); return new ParameterBag(['chill_main' => ['acl' => ['filter_stats_by_center' => $filterStatsByCenter]]]);
@ -139,6 +166,41 @@ abstract class AbstractExportTest extends WebTestCase
return [$exports]; return [$exports];
} }
/**
* @dataProvider dataProviderFormDataToNormalize
*/
public function testDataNormalization(array $data, int $version, array $customAssert): void
{
$export = $this->getExport();
if (is_iterable($export)) {
foreach ($export as $e) {
$this->testOneDataNormalization($e, $data, $version, $customAssert);
}
} else {
$this->testOneDataNormalization($export, $data, $version, $customAssert);
}
}
private function testOneDataNormalization(ExportInterface|DirectExportInterface $export, array $data, int $version, array $customAssert): void
{
$normalized = $export->normalizeFormData($data);
$actual = $export->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 (is_object($value) && method_exists($value, 'getId')) {
self::assertEquals($value->getId(), $actual[$key]->getId());
} else {
self::assertEquals($value, $actual[$key]);
}
}
}
/** /**
* Test the formatters type are string. * Test the formatters type are string.
*/ */
@ -219,7 +281,7 @@ abstract class AbstractExportTest extends WebTestCase
// due to the fact that testing both methods use the same tools. // due to the fact that testing both methods use the same tools.
$queryKeys = $export->getQueryKeys($data); $queryKeys = $export->getQueryKeys($data);
$query = $export->initiateQuery($modifiers, $acl, $data); $query = $export->initiateQuery($modifiers, $acl, $data, $exportGenerationContext = new ExportGenerationContext($this->getUser()));
// limit the result for the query for performance reason (only for QueryBuilder, // limit the result for the query for performance reason (only for QueryBuilder,
// not possible in NativeQuery) // not possible in NativeQuery)
@ -227,7 +289,7 @@ abstract class AbstractExportTest extends WebTestCase
$query->setMaxResults(1); $query->setMaxResults(1);
} }
$results = $export->getResult($query, $data); $results = $export->getResult($query, $data, $exportGenerationContext);
$this->assertIsArray( $this->assertIsArray(
$results, $results,
@ -309,7 +371,7 @@ abstract class AbstractExportTest extends WebTestCase
public function testInitiateQuery(mixed $modifiers, mixed $acl, mixed $data) public function testInitiateQuery(mixed $modifiers, mixed $acl, mixed $data)
{ {
foreach ($this->getExports() as $export) { foreach ($this->getExports() as $export) {
$query = $export->initiateQuery($modifiers, $acl, $data); $query = $export->initiateQuery($modifiers, $acl, $data, new ExportGenerationContext($this->getUser()));
$this->assertTrue( $this->assertTrue(
$query instanceof QueryBuilder || $query instanceof NativeQuery, $query instanceof QueryBuilder || $query instanceof NativeQuery,
@ -364,7 +426,7 @@ abstract class AbstractExportTest extends WebTestCase
public function testSupportsModifier(mixed $modifiers, mixed $acl, mixed $data) public function testSupportsModifier(mixed $modifiers, mixed $acl, mixed $data)
{ {
foreach ($this->getExports() as $export) { foreach ($this->getExports() as $export) {
$query = $export->initiateQuery($modifiers, $acl, $data); $query = $export->initiateQuery($modifiers, $acl, $data, new ExportGenerationContext($this->getUser()));
if ($query instanceof QueryBuilder) { if ($query instanceof QueryBuilder) {
$this->assertContainsOnly( $this->assertContainsOnly(