Compute allowed centers and regroupment at the time of generating the export

This commit is contained in:
2025-04-03 17:47:46 +02:00
parent 128d365a72
commit e48bec490c
17 changed files with 449 additions and 111 deletions

View File

@@ -66,7 +66,7 @@ class ExportConfigNormalizerTest extends TestCase
$center->getId()->willReturn(10);
$formData = [
'centers' => [$center->reveal()],
'centers' => ['centers' => [$center->reveal()]],
'export' => ['test' => '0'],
'filters' => [
'filterEnabled' => ['enabled' => true, 'form' => ['test' => '0']],
@@ -82,6 +82,7 @@ class ExportConfigNormalizerTest extends TestCase
$expected = [
'export' => ['form' => ['test' => '0'], 'version' => 1],
'centers' => ['centers' => [10], 'regroupments' => []],
'filters' => [
'filtersEnabled' => ['enabled' => true, 'form' => ['test' => '0'], 'version' => 1],
'filterDisabled' => ['enabled' => false],
@@ -95,7 +96,6 @@ class ExportConfigNormalizerTest extends TestCase
'form' => ['test' => '0'],
'version' => 1,
],
'centers' => [10],
];
$exportConfigNormalizer = new ExportConfigNormalizer($exportManager->reveal(), $this->prophesize(CenterRepositoryInterface::class)->reveal());
@@ -137,7 +137,7 @@ class ExportConfigNormalizerTest extends TestCase
$centerRepository->find(10)->willReturn($center = new Center());
$serialized = [
'centers' => [10],
'centers' => ['regroupments' => [], 'centers' => [10]],
'export' => ['form' => ['test' => '0'], 'version' => 1],
'filters' => [
'filterEnabled' => ['enabled' => true, 'form' => ['test' => '0'], 'version' => 1],
@@ -166,7 +166,7 @@ class ExportConfigNormalizerTest extends TestCase
],
'pick_formatter' => 'xlsx',
'formatter' => ['test' => '0'],
'centers' => [$center],
'centers' => ['centers' => [$center], 'regroupments' => []],
];
$exportConfigNormalizer = new ExportConfigNormalizer($exportManager->reveal(), $centerRepository->reveal());
@@ -209,7 +209,7 @@ class ExportConfigNormalizerTest extends TestCase
$center->getId()->willReturn(10);
$formData = [
'centers' => [$center->reveal()],
'centers' => ['centers' => [$center->reveal()]],
'export' => [],
'filters' => [
'filterEnabled' => ['enabled' => true, 'form' => []],
@@ -225,6 +225,7 @@ class ExportConfigNormalizerTest extends TestCase
$expected = [
'export' => ['form' => [], 'version' => 1],
'centers' => ['centers' => [10], 'regroupments' => []],
'filters' => [
'filtersEnabled' => ['enabled' => true, 'form' => [], 'version' => 1],
'filterDisabled' => ['enabled' => false],
@@ -238,7 +239,6 @@ class ExportConfigNormalizerTest extends TestCase
'form' => [],
'version' => 1,
],
'centers' => [10],
];
$exportConfigNormalizer = new ExportConfigNormalizer($exportManager->reveal(), $this->prophesize(CenterRepositoryInterface::class)->reveal());
@@ -280,7 +280,7 @@ class ExportConfigNormalizerTest extends TestCase
$centerRepository->find(10)->willReturn($center = new Center());
$serialized = [
'centers' => [10],
'centers' => ['centers' => [10], 'regroupments' => []],
'export' => ['form' => [], 'version' => 1],
'filters' => [
'filterEnabled' => ['enabled' => true, 'form' => [], 'version' => 1],
@@ -309,7 +309,7 @@ class ExportConfigNormalizerTest extends TestCase
],
'pick_formatter' => 'xlsx',
'formatter' => [],
'centers' => [$center],
'centers' => ['centers' => [$center], 'regroupments' => []],
];
$exportConfigNormalizer = new ExportConfigNormalizer($exportManager->reveal(), $centerRepository->reveal());

View File

@@ -12,6 +12,7 @@ declare(strict_types=1);
namespace Chill\MainBundle\Tests\Export;
use Chill\MainBundle\Entity\Center;
use Chill\MainBundle\Entity\Regroupment;
use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Export\AggregatorInterface;
use Chill\MainBundle\Export\DirectExportInterface;
@@ -23,6 +24,8 @@ use Chill\MainBundle\Export\ExportManager;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Export\FormattedExportGeneration;
use Chill\MainBundle\Export\FormatterInterface;
use Chill\MainBundle\Security\Authorization\AuthorizationHelperInterface;
use Chill\MainBundle\Service\Regroupement\CenterRegroupementResolver;
use Doctrine\ORM\NativeQuery;
use Doctrine\ORM\QueryBuilder;
use PHPUnit\Framework\TestCase;
@@ -54,7 +57,7 @@ class ExportGeneratorTest extends TestCase
],
'pick_formatter' => 'xlsx',
'formatter' => $formatterData = ['key' => 'form4'],
'centers' => [$centerA = new Center(), $centerB = new Center()],
'centers' => ['centers' => [$centerA = new Center()], 'regroupments' => [(new Regroupment())->addCenter($centerB = new Center())]],
];
$user = new User();
@@ -70,11 +73,30 @@ class ExportGeneratorTest extends TestCase
// required methods
$export->initiateQuery(
['tagada', 'tsointsoin'],
[['center' => $centerA, 'circles' => []], ['center' => $centerB, 'circles' => []]],
Argument::that(function ($arg) use ($centerB, $centerA) {
if (!is_array($arg)) {
return false;
}
if (2 !== count($arg)) {
return false;
}
foreach ($arg as $item) {
if ([] !== $item['circles']) {
return false;
}
if (!in_array($item['center'], [$centerA, $centerB], true)) {
return false;
}
}
return true;
}),
['key' => 'form1'],
)->shouldBeCalled()->willReturn($query->reveal());
$export->getResult($query->reveal(), $formExportData, Argument::that(static fn (ExportGenerationContext $context) => $context->byUser === $user))
->shouldBeCalled()->willReturn([['result0' => '0']]);
$export->requiredRole()->willReturn('dummy_role');
$filter->alterQuery($query->reveal(), $formFilterData, Argument::that(static fn (ExportGenerationContext $context) => $context->byUser === $user))
->shouldBeCalled();
@@ -105,7 +127,10 @@ class ExportGeneratorTest extends TestCase
$exportManager->hasAggregator('disabled_aggregator')->willReturn(true);
$exportManager->getFormatter('xlsx')->willReturn($formatter->reveal());
$generator = new ExportGenerator($exportManager->reveal(), $exportConfigNormalizer->reveal(), new NullLogger());
$authorizationHelper = $this->prophesize(AuthorizationHelperInterface::class);
$authorizationHelper->getReachableCenters($user, 'dummy_role')->willReturn([$centerA, $centerB]);
$generator = new ExportGenerator($exportManager->reveal(), $exportConfigNormalizer->reveal(), new NullLogger(), $authorizationHelper->reveal(), new CenterRegroupementResolver());
$actual = $generator->generate('dummy', $initialData, $user);
@@ -123,7 +148,7 @@ class ExportGeneratorTest extends TestCase
'aggregators' => [],
'pick_formatter' => 'xlsx',
'formatter' => $formatterData = ['key' => 'form4'],
'centers' => [$centerA = new Center(), $centerB = new Center()],
'centers' => ['centers' => [$centerA = new Center(), $centerB = new Center()], 'regroupments' => []],
];
$user = new User();
@@ -141,6 +166,7 @@ class ExportGeneratorTest extends TestCase
$export->getResult($query->reveal(), $formExportData, Argument::that(static fn (ExportGenerationContext $context) => $context->byUser === $user))
->shouldBeCalled()->willReturn([['result0' => '0']]);
$export->supportsModifiers()->willReturn([]);
$export->requiredRole()->willReturn('dummy_role');
$formatter->generate(
[['result0' => '0']],
@@ -160,7 +186,10 @@ class ExportGeneratorTest extends TestCase
$exportManager->getExport('dummy')->willReturn($export->reveal());
$exportManager->getFormatter('xlsx')->willReturn($formatter->reveal());
$generator = new ExportGenerator($exportManager->reveal(), $exportConfigNormalizer->reveal(), new NullLogger());
$authorizationHelper = $this->prophesize(AuthorizationHelperInterface::class);
$authorizationHelper->getReachableCenters($user, 'dummy_role')->willReturn([$centerA, $centerB]);
$generator = new ExportGenerator($exportManager->reveal(), $exportConfigNormalizer->reveal(), new NullLogger(), $authorizationHelper->reveal(), new CenterRegroupementResolver());
$actual = $generator->generate('dummy', $initialData, $user);

View File

@@ -0,0 +1,78 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\MainBundle\Tests\Services\Regroupement;
use Chill\MainBundle\Entity\Center;
use Chill\MainBundle\Entity\Regroupment;
use Chill\MainBundle\Service\Regroupement\CenterRegroupementResolver;
use PHPUnit\Framework\TestCase;
/**
* @internal
*
* @coversNothing
*/
class CenterRegroupementResolverTest extends TestCase
{
private static CenterRegroupementResolver $resolver;
public static function setUpBeforeClass(): void
{
self::$resolver = new CenterRegroupementResolver();
}
/**
* @dataProvider provideData
*/
public function testResolveCenter(array $groups, array $centers, array $expected): void
{
$actual = self::$resolver->resolveCenters($groups, $centers);
self::assertEquals(count($expected), count($actual));
foreach ($expected as $center) {
self::assertContains($center, $actual);
}
}
public static function provideData(): iterable
{
$centerA = new Center();
$centerB = new Center();
$centerC = new Center();
$centerD = new Center();
$groupA = new Regroupment();
$groupA->addCenter($centerA)->addCenter($centerB);
$groupB = new Regroupment();
$groupB->addCenter($centerA)->addCenter($centerB)->addCenter($centerC);
yield [
[$groupA],
[],
[$centerA, $centerB],
];
yield [
[$groupA, $groupB],
[],
[$centerA, $centerB, $centerC],
];
yield [
[$groupA, $groupB],
[$centerB, $centerD],
[$centerA, $centerB, $centerC, $centerD],
];
}
}

View File

@@ -0,0 +1,96 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\MainBundle\Tests\Services\Regroupement;
use Chill\MainBundle\Entity\Center;
use Chill\MainBundle\Entity\Regroupment;
use Chill\MainBundle\Service\Regroupement\RegroupementFiltering;
use PHPUnit\Framework\TestCase;
/**
* @internal
*
* @coversNothing
*/
class RegroupementFilteringTest extends TestCase
{
private static RegroupementFiltering $regroupementFiltering;
public static function setUpBeforeClass(): void
{
self::$regroupementFiltering = new RegroupementFiltering();
}
/**
* @dataProvider provideDataForFilterContainsAtLeastOnCenter
*/
public function testFilterContainsAtLeastOnCenter(array $groups, array $centers, array $expected): void
{
$actual = self::$regroupementFiltering->filterContainsAtLeastOneCenter($groups, $centers);
self::assertEquals(count($expected), count($actual));
self::assertTrue(array_is_list($actual));
foreach ($expected as $center) {
self::assertContains($center, $actual);
}
}
public static function provideDataForFilterContainsAtLeastOnCenter(): iterable
{
$centerA = new Center();
$centerB = new Center();
$centerC = new Center();
$centerD = new Center();
$groupA = new Regroupment();
$groupA->addCenter($centerA)->addCenter($centerB);
$groupB = new Regroupment();
$groupB->addCenter($centerA)->addCenter($centerB)->addCenter($centerC);
$groupC = new Regroupment();
$groupC->addCenter($centerA)->addCenter($centerD);
yield [
[$groupA, $groupB],
[],
[],
];
yield [
[$groupA, $groupB],
[$centerA, $centerB, $centerC],
[$groupA, $groupB],
];
yield [
[$groupA, $groupC],
[$centerD],
[$groupC],
];
yield [
[$groupA],
[$centerB, $centerD],
[$groupA],
];
yield [
[$groupA],
[new Center()],
[],
];
}
}