diff --git a/src/Bundle/ChillMainBundle/Export/ExportConfigNormalizer.php b/src/Bundle/ChillMainBundle/Export/ExportConfigNormalizer.php index a599ea71f..fb91f55b5 100644 --- a/src/Bundle/ChillMainBundle/Export/ExportConfigNormalizer.php +++ b/src/Bundle/ChillMainBundle/Export/ExportConfigNormalizer.php @@ -54,7 +54,6 @@ class ExportConfigNormalizer if ($filterData[FilterType::ENABLED_FIELD]) { $filtersSerialized[$alias]['form'] = $filter->normalizeFormData($filterData['form']); $filtersSerialized[$alias]['version'] = $filter->getNormalizationVersion(); - } } $serialized['filters'] = $filtersSerialized; @@ -72,7 +71,7 @@ class ExportConfigNormalizer $serialized['pick_formatter'] = $formData['pick_formatter']; $formatter = $this->exportManager->getFormatter($formData['pick_formatter']); - $serialized['formatter']['form'] = $formatter->normalizeFormData($formData['formatter']['form']); + $serialized['formatter']['form'] = $formatter->normalizeFormData($formData['formatter']); $serialized['formatter']['version'] = $formatter->getNormalizationVersion(); return $serialized; @@ -116,7 +115,7 @@ class ExportConfigNormalizer 'filters' => $filtersConfig, 'aggregators' => $aggregatorsConfig, 'pick_formatter' => $serializedData['pick_formatter'], - 'formatter' => ['form' => $formater->denormalizeFormData($serializedData['formatter']['form'], $serializedData['formatter']['version'])], + 'formatter' => $formater->denormalizeFormData($serializedData['formatter']['form'], $serializedData['formatter']['version']), 'centers' => array_filter(array_map(fn (int $id) => $this->centerRepository->find($id), $serializedData['centers']), fn ($item) => null !== $item), ]; } diff --git a/src/Bundle/ChillMainBundle/Export/ExportGenerator.php b/src/Bundle/ChillMainBundle/Export/ExportGenerator.php index bc3078cf2..f1a4d386b 100644 --- a/src/Bundle/ChillMainBundle/Export/ExportGenerator.php +++ b/src/Bundle/ChillMainBundle/Export/ExportGenerator.php @@ -81,10 +81,6 @@ final readonly class ExportGenerator $result = $export->getResult($query, $data['export'], $context); - if (!is_iterable($result)) { - throw new \UnexpectedValueException(sprintf('The result of the export should be an iterable, %s given', \gettype($result))); - } - $formatter = $this->exportManager->getFormatter($data['pick_formatter']); $filtersData = []; $aggregatorsData = []; @@ -101,7 +97,7 @@ final readonly class ExportGenerator if (method_exists($formatter, 'generate')) { return $formatter->generate( $result, - $data['formatter']['form'], + $data['formatter'], $exportAlias, $data['export'], $filtersData, @@ -115,7 +111,7 @@ final readonly class ExportGenerator $result, $data['formatter'], $exportAlias, - $data['export']['form'], + $data['export'], $filtersData, $aggregatorsData, ); @@ -194,7 +190,7 @@ final readonly class ExportGenerator } foreach ($data as $alias => $aggregatorData) { - if (true === $aggregatorData['enabled']) { + if ($this->exportManager->hasAggregator($alias) && true === $aggregatorData['enabled']) { yield $alias => $this->exportManager->getAggregator($alias); } } @@ -210,7 +206,7 @@ final readonly class ExportGenerator } foreach ($data as $alias => $filterData) { - if (true === $filterData['enabled']) { + if ($this->exportManager->hasFilter($alias) && true === $filterData['enabled']) { yield $alias => $this->exportManager->getFilter($alias); } } @@ -249,7 +245,7 @@ final readonly class ExportGenerator * build the array required for defining centers and circles in the initiate * queries of ExportElementsInterfaces. * - * @param list
+ * @param list
$centers */ private function buildCenterReachableScopes(array $centers) { diff --git a/src/Bundle/ChillMainBundle/Export/ExportManager.php b/src/Bundle/ChillMainBundle/Export/ExportManager.php index eb381a714..c723bba68 100644 --- a/src/Bundle/ChillMainBundle/Export/ExportManager.php +++ b/src/Bundle/ChillMainBundle/Export/ExportManager.php @@ -274,6 +274,16 @@ class ExportManager return $this->filters[$alias]; } + public function hasFilter(string $alias): bool + { + return array_key_exists($alias, $this->filters); + } + + public function hasAggregator(string $alias): bool + { + return array_key_exists($alias, $this->aggregators); + } + public function getAllFilters(): array { $filters = []; diff --git a/src/Bundle/ChillMainBundle/Tests/Export/ExportConfigNormalizerTest.php b/src/Bundle/ChillMainBundle/Tests/Export/ExportConfigNormalizerTest.php index 7315bf7fb..cf4518ccb 100644 --- a/src/Bundle/ChillMainBundle/Tests/Export/ExportConfigNormalizerTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Export/ExportConfigNormalizerTest.php @@ -77,9 +77,7 @@ class ExportConfigNormalizerTest extends TestCase 'aggregatorDisabled' => ['enabled' => false, 'form' => ['default' => '0']], ], 'pick_formatter' => 'xlsx', - 'formatter' => [ - 'form' => ['test' => '0'], - ], + 'formatter' => ['test' => '0'], ]; $expected = [ @@ -167,9 +165,150 @@ class ExportConfigNormalizerTest extends TestCase 'aggregatorDisabled' => ['enabled' => false, 'form' => ['default' => '0']], ], 'pick_formatter' => 'xlsx', - 'formatter' => [ - 'form' => ['test' => '0'], + 'formatter' => ['test' => '0'], + 'centers' => [$center], + ]; + + $exportConfigNormalizer = new ExportConfigNormalizer($exportManager->reveal(), $centerRepository->reveal()); + $actual = $exportConfigNormalizer->denormalizeConfig('export', $serialized, true); + + self::assertEquals($expected, $actual); + } + + public function testNormalizeConfigEmptyData(): void + { + $filterEnabled = $this->prophesize(FilterInterface::class); + $filterEnabled->normalizeFormData([])->shouldBeCalled()->willReturn([]); + $filterEnabled->getNormalizationVersion()->willReturn(1); + $filterDisabled = $this->prophesize(FilterInterface::class); + $filterDisabled->normalizeFormData([])->shouldNotBeCalled(); + + $aggregatorEnabled = $this->prophesize(AggregatorInterface::class); + $aggregatorEnabled->normalizeFormData([])->shouldBeCalled()->willReturn([]); + $aggregatorEnabled->getNormalizationVersion()->willReturn(1); + $aggregatorDisabled = $this->prophesize(AggregatorInterface::class); + $aggregatorDisabled->normalizeFormData([])->shouldNotBeCalled(); + + $export = $this->prophesize(ExportInterface::class); + $export->normalizeFormData([])->shouldBeCalled()->willReturn([]); + $export->getNormalizationVersion()->willReturn(1); + + $formatter = $this->prophesize(FormatterInterface::class); + $formatter->normalizeFormData([])->shouldBeCalled()->willReturn([]); + $formatter->getNormalizationVersion()->willReturn(1); + + $exportManager = $this->prophesize(ExportManager::class); + $exportManager->getFormatter('xlsx')->shouldBeCalled()->willReturn($formatter->reveal()); + $exportManager->getFilter('filterEnabled')->willReturn($filterEnabled->reveal()); + $exportManager->getFilter('filterDisabled')->willReturn($filterDisabled->reveal()); + $exportManager->getAggregator('aggregatorEnabled')->willReturn($aggregatorEnabled->reveal()); + $exportManager->getAggregator('aggregatorDisabled')->willReturn($aggregatorDisabled->reveal()); + $exportManager->getExport('export')->willReturn($export->reveal()); + + $center = $this->prophesize(Center::class); + $center->getId()->willReturn(10); + + $formData = [ + 'centers' => [$center->reveal()], + 'export' => [], + 'filters' => [ + 'filterEnabled' => ['enabled' => true, 'form' => []], + 'filterDisabled' => ['enabled' => false, 'form' => []], ], + 'aggregators' => [ + 'aggregatorEnabled' => ['enabled' => true, 'form' => []], + 'aggregatorDisabled' => ['enabled' => false, 'form' => []], + ], + 'pick_formatter' => 'xlsx', + 'formatter' => [], + ]; + + $expected = [ + 'export' => ['form' => [], 'version' => 1], + 'filters' => [ + 'filtersEnabled' => ['enabled' => true, 'form' => [], 'version' => 1], + 'filterDisabled' => ['enabled' => false], + ], + 'aggregators' => [ + 'aggregatorEnabled' => ['enabled' => true, 'form' => [], 'version' => 1], + 'aggregatorDisabled' => ['enabled' => false], + ], + 'pick_formatter' => 'xlsx', + 'formatter' => [ + 'form' => [], + 'version' => 1, + ], + 'centers' => [10], + ]; + + $exportConfigNormalizer = new ExportConfigNormalizer($exportManager->reveal(), $this->prophesize(CenterRepositoryInterface::class)->reveal()); + + $actual = $exportConfigNormalizer->normalizeConfig('export', $formData); + + self::assertEqualsCanonicalizing($expected, $actual); + } + + public function testDenormalizeConfigWithEmptyData(): void + { + $filterEnabled = $this->prophesize(FilterInterface::class); + $filterEnabled->denormalizeFormData([], 1)->shouldBeCalled()->willReturn([]); + $filterDisabled = $this->prophesize(FilterInterface::class); + $filterDisabled->denormalizeFormData(Argument::any(), Argument::type('int'))->shouldNotBeCalled(); + $filterDisabled->getFormDefaultData()->willReturn([]); + + $aggregatorEnabled = $this->prophesize(AggregatorInterface::class); + $aggregatorEnabled->denormalizeFormData([], 1)->shouldBeCalled()->willReturn([]); + $aggregatorDisabled = $this->prophesize(AggregatorInterface::class); + $aggregatorDisabled->denormalizeFormData(Argument::any(), Argument::type('int'))->shouldNotBeCalled(); + $aggregatorDisabled->getFormDefaultData()->willReturn([]); + + $export = $this->prophesize(ExportInterface::class); + $export->denormalizeFormData([], 1)->shouldBeCalled()->willReturn([]); + + $formatter = $this->prophesize(FormatterInterface::class); + $formatter->denormalizeFormData([], 1)->shouldBeCalled()->willReturn([]); + + $exportManager = $this->prophesize(ExportManager::class); + $exportManager->getFormatter('xlsx')->shouldBeCalled()->willReturn($formatter->reveal()); + $exportManager->getFilter('filterEnabled')->willReturn($filterEnabled->reveal()); + $exportManager->getFilter('filterDisabled')->willReturn($filterDisabled->reveal()); + $exportManager->getAggregator('aggregatorEnabled')->willReturn($aggregatorEnabled->reveal()); + $exportManager->getAggregator('aggregatorDisabled')->willReturn($aggregatorDisabled->reveal()); + $exportManager->getExport('export')->willReturn($export->reveal()); + + $centerRepository = $this->prophesize(CenterRepositoryInterface::class); + $centerRepository->find(10)->willReturn($center = new Center()); + + $serialized = [ + 'centers' => [10], + 'export' => ['form' => [], 'version' => 1], + 'filters' => [ + 'filterEnabled' => ['enabled' => true, 'form' => [], 'version' => 1], + 'filterDisabled' => ['enabled' => false], + ], + 'aggregators' => [ + 'aggregatorEnabled' => ['enabled' => true, 'form' => [], 'version' => 1], + 'aggregatorDisabled' => ['enabled' => false], + ], + 'pick_formatter' => 'xlsx', + 'formatter' => [ + 'form' => [], + 'version' => 1, + ], + ]; + + $expected = [ + 'export' => [], + 'filters' => [ + 'filterEnabled' => ['enabled' => true, 'form' => []], + 'filterDisabled' => ['enabled' => false, 'form' => []], + ], + 'aggregators' => [ + 'aggregatorEnabled' => ['enabled' => true, 'form' => []], + 'aggregatorDisabled' => ['enabled' => false, 'form' => []], + ], + 'pick_formatter' => 'xlsx', + 'formatter' => [], 'centers' => [$center], ]; diff --git a/src/Bundle/ChillMainBundle/Tests/Export/ExportGeneratorTest.php b/src/Bundle/ChillMainBundle/Tests/Export/ExportGeneratorTest.php index 21e7af344..3f4d51059 100644 --- a/src/Bundle/ChillMainBundle/Tests/Export/ExportGeneratorTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Export/ExportGeneratorTest.php @@ -53,7 +53,7 @@ class ExportGeneratorTest extends TestCase 'disabled_aggregator' => ['enabled' => false], ], 'pick_formatter' => 'xlsx', - 'formatter' => ['form' => $formatterData = ['key' => 'form4']], + 'formatter' => $formatterData = ['key' => 'form4'], 'centers' => [$centerA = new Center(), $centerB = new Center()], ]; $user = new User(); @@ -98,7 +98,11 @@ class ExportGeneratorTest extends TestCase $exportManager = $this->prophesize(ExportManager::class); $exportManager->getExport('dummy')->willReturn($export->reveal()); $exportManager->getFilter('dummy_filter')->willReturn($filter->reveal()); + $exportManager->hasFilter('dummy_filter')->willReturn(true); + $exportManager->hasFilter('disabled_filter')->willReturn(true); $exportManager->getAggregator('dummy_aggregator')->willReturn($aggregator->reveal()); + $exportManager->hasAggregator('dummy_aggregator')->willReturn(true); + $exportManager->hasAggregator('disabled_aggregator')->willReturn(true); $exportManager->getFormatter('xlsx')->willReturn($formatter->reveal()); $generator = new ExportGenerator($exportManager->reveal(), $exportConfigNormalizer->reveal(), new NullLogger()); @@ -118,7 +122,7 @@ class ExportGeneratorTest extends TestCase 'filters' => [], 'aggregators' => [], 'pick_formatter' => 'xlsx', - 'formatter' => ['form' => $formatterData = ['key' => 'form4']], + 'formatter' => $formatterData = ['key' => 'form4'], 'centers' => [$centerA = new Center(), $centerB = new Center()], ]; $user = new User();