From e37f3e7c37f419a4c29e3ac63c71181cdd9402c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 8 Apr 2025 17:24:38 +0200 Subject: [PATCH] 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. --- .../Filter/PersonFilters/GenderFilter.php | 41 ++++++++++++++++++- .../Filter/PersonFilters/GenderFilterTest.php | 41 +++++++++++++++---- 2 files changed, 73 insertions(+), 9 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php index dc9fdec67..6086f3964 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GenderFilter.php @@ -43,7 +43,6 @@ class GenderFilter implements public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void { - $where = $qb->getDQLPart('where'); $isIn = $qb->expr()->in('person.gender', ':person_gender'); $acceptedGenders = $data['accepted_genders_entity']; @@ -88,11 +87,45 @@ class GenderFilter implements 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']]; } 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']]; } @@ -130,7 +163,11 @@ class GenderFilter implements if (null === $g) { $genders[] = $this->translator->trans('export.filter.person.gender.no_gender'); } 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()); } } diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/PersonFilters/GenderFilterTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/PersonFilters/GenderFilterTest.php index 7273e9abc..4038bd54b 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/PersonFilters/GenderFilterTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/PersonFilters/GenderFilterTest.php @@ -41,17 +41,44 @@ final class GenderFilterTest extends AbstractFilterTest { return [ [ - 'accepted_genders' => ['man'], - ], - [ - 'accepted_genders' => ['woman'], - ], - [ - 'accepted_genders' => ['man', 'both'], + 'accepted_genders_entity' => [null, '1'], ], ]; } + /** + * 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 { self::bootKernel();