mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
Refactor export manager and normalize configuration handling
Simplified formatter and aggregator logic by removing redundant fields and improving method checks (e.g., `hasAggregator`, `hasFilter`). Adjusted test cases to align with the updated structure and added tests for empty data normalization and denormalization. Improved code readability and ensured better handling of edge cases in export data processing.
This commit is contained in:
parent
db073fc920
commit
85a9c6bb67
@ -54,7 +54,6 @@ class ExportConfigNormalizer
|
|||||||
if ($filterData[FilterType::ENABLED_FIELD]) {
|
if ($filterData[FilterType::ENABLED_FIELD]) {
|
||||||
$filtersSerialized[$alias]['form'] = $filter->normalizeFormData($filterData['form']);
|
$filtersSerialized[$alias]['form'] = $filter->normalizeFormData($filterData['form']);
|
||||||
$filtersSerialized[$alias]['version'] = $filter->getNormalizationVersion();
|
$filtersSerialized[$alias]['version'] = $filter->getNormalizationVersion();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$serialized['filters'] = $filtersSerialized;
|
$serialized['filters'] = $filtersSerialized;
|
||||||
@ -72,7 +71,7 @@ class ExportConfigNormalizer
|
|||||||
|
|
||||||
$serialized['pick_formatter'] = $formData['pick_formatter'];
|
$serialized['pick_formatter'] = $formData['pick_formatter'];
|
||||||
$formatter = $this->exportManager->getFormatter($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();
|
$serialized['formatter']['version'] = $formatter->getNormalizationVersion();
|
||||||
|
|
||||||
return $serialized;
|
return $serialized;
|
||||||
@ -116,7 +115,7 @@ class ExportConfigNormalizer
|
|||||||
'filters' => $filtersConfig,
|
'filters' => $filtersConfig,
|
||||||
'aggregators' => $aggregatorsConfig,
|
'aggregators' => $aggregatorsConfig,
|
||||||
'pick_formatter' => $serializedData['pick_formatter'],
|
'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),
|
'centers' => array_filter(array_map(fn (int $id) => $this->centerRepository->find($id), $serializedData['centers']), fn ($item) => null !== $item),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -81,10 +81,6 @@ final readonly class ExportGenerator
|
|||||||
|
|
||||||
$result = $export->getResult($query, $data['export'], $context);
|
$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']);
|
$formatter = $this->exportManager->getFormatter($data['pick_formatter']);
|
||||||
$filtersData = [];
|
$filtersData = [];
|
||||||
$aggregatorsData = [];
|
$aggregatorsData = [];
|
||||||
@ -101,7 +97,7 @@ final readonly class ExportGenerator
|
|||||||
if (method_exists($formatter, 'generate')) {
|
if (method_exists($formatter, 'generate')) {
|
||||||
return $formatter->generate(
|
return $formatter->generate(
|
||||||
$result,
|
$result,
|
||||||
$data['formatter']['form'],
|
$data['formatter'],
|
||||||
$exportAlias,
|
$exportAlias,
|
||||||
$data['export'],
|
$data['export'],
|
||||||
$filtersData,
|
$filtersData,
|
||||||
@ -115,7 +111,7 @@ final readonly class ExportGenerator
|
|||||||
$result,
|
$result,
|
||||||
$data['formatter'],
|
$data['formatter'],
|
||||||
$exportAlias,
|
$exportAlias,
|
||||||
$data['export']['form'],
|
$data['export'],
|
||||||
$filtersData,
|
$filtersData,
|
||||||
$aggregatorsData,
|
$aggregatorsData,
|
||||||
);
|
);
|
||||||
@ -194,7 +190,7 @@ final readonly class ExportGenerator
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ($data as $alias => $aggregatorData) {
|
foreach ($data as $alias => $aggregatorData) {
|
||||||
if (true === $aggregatorData['enabled']) {
|
if ($this->exportManager->hasAggregator($alias) && true === $aggregatorData['enabled']) {
|
||||||
yield $alias => $this->exportManager->getAggregator($alias);
|
yield $alias => $this->exportManager->getAggregator($alias);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -210,7 +206,7 @@ final readonly class ExportGenerator
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ($data as $alias => $filterData) {
|
foreach ($data as $alias => $filterData) {
|
||||||
if (true === $filterData['enabled']) {
|
if ($this->exportManager->hasFilter($alias) && true === $filterData['enabled']) {
|
||||||
yield $alias => $this->exportManager->getFilter($alias);
|
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
|
* build the array required for defining centers and circles in the initiate
|
||||||
* queries of ExportElementsInterfaces.
|
* queries of ExportElementsInterfaces.
|
||||||
*
|
*
|
||||||
* @param list<Center>
|
* @param list<Center> $centers
|
||||||
*/
|
*/
|
||||||
private function buildCenterReachableScopes(array $centers)
|
private function buildCenterReachableScopes(array $centers)
|
||||||
{
|
{
|
||||||
|
@ -274,6 +274,16 @@ class ExportManager
|
|||||||
return $this->filters[$alias];
|
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
|
public function getAllFilters(): array
|
||||||
{
|
{
|
||||||
$filters = [];
|
$filters = [];
|
||||||
|
@ -77,9 +77,7 @@ class ExportConfigNormalizerTest extends TestCase
|
|||||||
'aggregatorDisabled' => ['enabled' => false, 'form' => ['default' => '0']],
|
'aggregatorDisabled' => ['enabled' => false, 'form' => ['default' => '0']],
|
||||||
],
|
],
|
||||||
'pick_formatter' => 'xlsx',
|
'pick_formatter' => 'xlsx',
|
||||||
'formatter' => [
|
'formatter' => ['test' => '0'],
|
||||||
'form' => ['test' => '0'],
|
|
||||||
],
|
|
||||||
];
|
];
|
||||||
|
|
||||||
$expected = [
|
$expected = [
|
||||||
@ -167,9 +165,150 @@ class ExportConfigNormalizerTest extends TestCase
|
|||||||
'aggregatorDisabled' => ['enabled' => false, 'form' => ['default' => '0']],
|
'aggregatorDisabled' => ['enabled' => false, 'form' => ['default' => '0']],
|
||||||
],
|
],
|
||||||
'pick_formatter' => 'xlsx',
|
'pick_formatter' => 'xlsx',
|
||||||
'formatter' => [
|
'formatter' => ['test' => '0'],
|
||||||
'form' => ['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],
|
'centers' => [$center],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ class ExportGeneratorTest extends TestCase
|
|||||||
'disabled_aggregator' => ['enabled' => false],
|
'disabled_aggregator' => ['enabled' => false],
|
||||||
],
|
],
|
||||||
'pick_formatter' => 'xlsx',
|
'pick_formatter' => 'xlsx',
|
||||||
'formatter' => ['form' => $formatterData = ['key' => 'form4']],
|
'formatter' => $formatterData = ['key' => 'form4'],
|
||||||
'centers' => [$centerA = new Center(), $centerB = new Center()],
|
'centers' => [$centerA = new Center(), $centerB = new Center()],
|
||||||
];
|
];
|
||||||
$user = new User();
|
$user = new User();
|
||||||
@ -98,7 +98,11 @@ class ExportGeneratorTest extends TestCase
|
|||||||
$exportManager = $this->prophesize(ExportManager::class);
|
$exportManager = $this->prophesize(ExportManager::class);
|
||||||
$exportManager->getExport('dummy')->willReturn($export->reveal());
|
$exportManager->getExport('dummy')->willReturn($export->reveal());
|
||||||
$exportManager->getFilter('dummy_filter')->willReturn($filter->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->getAggregator('dummy_aggregator')->willReturn($aggregator->reveal());
|
||||||
|
$exportManager->hasAggregator('dummy_aggregator')->willReturn(true);
|
||||||
|
$exportManager->hasAggregator('disabled_aggregator')->willReturn(true);
|
||||||
$exportManager->getFormatter('xlsx')->willReturn($formatter->reveal());
|
$exportManager->getFormatter('xlsx')->willReturn($formatter->reveal());
|
||||||
|
|
||||||
$generator = new ExportGenerator($exportManager->reveal(), $exportConfigNormalizer->reveal(), new NullLogger());
|
$generator = new ExportGenerator($exportManager->reveal(), $exportConfigNormalizer->reveal(), new NullLogger());
|
||||||
@ -118,7 +122,7 @@ class ExportGeneratorTest extends TestCase
|
|||||||
'filters' => [],
|
'filters' => [],
|
||||||
'aggregators' => [],
|
'aggregators' => [],
|
||||||
'pick_formatter' => 'xlsx',
|
'pick_formatter' => 'xlsx',
|
||||||
'formatter' => ['form' => $formatterData = ['key' => 'form4']],
|
'formatter' => $formatterData = ['key' => 'form4'],
|
||||||
'centers' => [$centerA = new Center(), $centerB = new Center()],
|
'centers' => [$centerA = new Center(), $centerB = new Center()],
|
||||||
];
|
];
|
||||||
$user = new User();
|
$user = new User();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user