Refactor GenderFilter to enhance data normalization.

Introduced logic to map and transform gender data for normalization and denormalization, aligning with expected formats. Updated associated tests to cover new scenarios and ensure consistent behavior.
This commit is contained in:
Julien Fastré 2025-04-08 17:24:38 +02:00
parent b6375cad6c
commit e37f3e7c37
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
2 changed files with 73 additions and 9 deletions

View File

@ -43,7 +43,6 @@ class GenderFilter implements
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void
{ {
$where = $qb->getDQLPart('where');
$isIn = $qb->expr()->in('person.gender', ':person_gender'); $isIn = $qb->expr()->in('person.gender', ':person_gender');
$acceptedGenders = $data['accepted_genders_entity']; $acceptedGenders = $data['accepted_genders_entity'];
@ -88,11 +87,45 @@ class GenderFilter implements
public function normalizeFormData(array $formData): array public function normalizeFormData(array $formData): array
{ {
if (array_key_exists('accepted_genders', $formData)) {
$genders = [];
foreach ($formData['accepted_genders'] as $beforeGender) {
foreach ($this->genderRepository->findByGenderTranslation(match ($beforeGender) {
'both' => 'neutral', default => $beforeGender,
}) as $gender) {
if (null !== $gender) {
if ('null' === $beforeGender) {
$genders[] = null;
}
$genders[] = $gender->getId();
}
}
}
return ['accepted_genders_entity' => array_unique($genders)];
}
return ['accepted_genders_entity' => $formData['accepted_genders_entity']]; return ['accepted_genders_entity' => $formData['accepted_genders_entity']];
} }
public function denormalizeFormData(array $formData, int $fromVersion): array public function denormalizeFormData(array $formData, int $fromVersion): array
{ {
if (array_key_exists('accepted_genders', $formData)) {
$transformedData = [];
foreach ($formData['accepted_genders'] as $genderBefore) {
foreach ($this->genderRepository->findByGenderTranslation(
match ($genderBefore) {
'both' => 'neutral',
default => $genderBefore,
}
) as $gender) {
$transformedData[] = $gender;
}
}
return ['accepted_genders_entity' => $transformedData];
}
return ['accepted_genders_entity' => $formData['accepted_genders_entity']]; return ['accepted_genders_entity' => $formData['accepted_genders_entity']];
} }
@ -130,7 +163,11 @@ class GenderFilter implements
if (null === $g) { if (null === $g) {
$genders[] = $this->translator->trans('export.filter.person.gender.no_gender'); $genders[] = $this->translator->trans('export.filter.person.gender.no_gender');
} else { } else {
$genders[] = $this->translatableStringHelper->localize($this->genderRepository->find($g)->getLabel()); $g = $this->genderRepository->find($g);
if (null === $g) {
continue;
}
$genders[] = $this->translatableStringHelper->localize($g->getLabel());
} }
} }

View File

@ -41,17 +41,44 @@ final class GenderFilterTest extends AbstractFilterTest
{ {
return [ return [
[ [
'accepted_genders' => ['man'], 'accepted_genders_entity' => [null, '1'],
],
[
'accepted_genders' => ['woman'],
],
[
'accepted_genders' => ['man', 'both'],
], ],
]; ];
} }
/**
* A list of data to normalize.
*
* @return iterable{array}
*/
public static function dataProviderFormDataToNormalize(): iterable
{
yield [
['accepted_genders_entity' => [null, '1']],
1,
[],
];
yield [
['accepted_genders' => ['man']],
1,
[],
];
}
/**
* @dataProvider dataProviderFormDataToNormalize
*/
public function testDataNormalization(array $data, int $version, array $customAssert): void
{
$filter = $this->getFilter();
$normalized = $filter->normalizeFormData($data);
$actual = $filter->denormalizeFormData($normalized, $version);
self::assertIsArray($actual);
self::assertArrayHasKey('accepted_genders_entity', $actual);
}
public static function getQueryBuilders(): iterable public static function getQueryBuilders(): iterable
{ {
self::bootKernel(); self::bootKernel();