mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-11-13 23:57:35 +00:00
Partage d'export enregistré et génération asynchrone des exports
This commit is contained in:
@@ -11,6 +11,8 @@ declare(strict_types=1);
|
||||
|
||||
namespace Chill\MainBundle\Test\Export;
|
||||
|
||||
use Chill\MainBundle\Entity\User;
|
||||
use Chill\MainBundle\Export\ExportGenerationContext;
|
||||
use Doctrine\ORM\AbstractQuery;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
@@ -64,6 +66,19 @@ abstract class AbstractAggregatorTest extends KernelTestCase
|
||||
*/
|
||||
abstract public static function getQueryBuilders();
|
||||
|
||||
protected function getUser(): User
|
||||
{
|
||||
$em = static::getContainer()->get(EntityManagerInterface::class);
|
||||
if (null === $user = $em->createQueryBuilder()->select('u')
|
||||
->from(User::class, 'u')
|
||||
->setMaxResults(1)
|
||||
->getQuery()->getOneOrNullResult()) {
|
||||
throw new \RuntimeException('User not found');
|
||||
}
|
||||
|
||||
return $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare aliases array before and after that aggregator alter query.
|
||||
*
|
||||
@@ -75,7 +90,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase
|
||||
{
|
||||
$aliases = $qb->getAllAliases();
|
||||
|
||||
$this->getAggregator()->alterQuery($qb, $data);
|
||||
$this->getAggregator()->alterQuery($qb, $data, new ExportGenerationContext($this->getUser()));
|
||||
|
||||
$alteredQuery = $qb->getAllAliases();
|
||||
|
||||
@@ -115,7 +130,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase
|
||||
*/
|
||||
public function testQueryExecution(QueryBuilder $qb, array $data): void
|
||||
{
|
||||
$this->getAggregator()->alterQuery($qb, $data);
|
||||
$this->getAggregator()->alterQuery($qb, $data, new ExportGenerationContext($this->getUser()));
|
||||
|
||||
$actual = $qb->getQuery()->getResult();
|
||||
|
||||
@@ -158,7 +173,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase
|
||||
$nbOfSelect = null !== $query->getDQLPart('select') ?
|
||||
\count($query->getDQLPart('select')) : 0;
|
||||
|
||||
$this->getAggregator()->alterQuery($query, $data);
|
||||
$this->getAggregator()->alterQuery($query, $data, new ExportGenerationContext($this->getUser()));
|
||||
|
||||
$this->assertGreaterThanOrEqual(
|
||||
$nbOfFrom,
|
||||
@@ -218,6 +233,44 @@ abstract class AbstractAggregatorTest extends KernelTestCase
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderFormDataToNormalize
|
||||
*/
|
||||
public function testDataNormalization(array $data, int $version, array $customAssert): void
|
||||
{
|
||||
$aggregator = $this->getAggregator();
|
||||
|
||||
$normalized = $aggregator->normalizeFormData($data);
|
||||
$actual = $aggregator->denormalizeFormData($normalized, $version);
|
||||
|
||||
self::assertEqualsCanonicalizing(array_keys($data), array_keys($actual));
|
||||
|
||||
foreach ($data as $key => $value) {
|
||||
self::assertArrayHasKey($key, $actual);
|
||||
if (array_key_exists($key, $customAssert)) {
|
||||
call_user_func($customAssert[$key], $actual[$key], $value);
|
||||
} elseif (is_iterable($value)) {
|
||||
continue;
|
||||
} elseif (is_object($value) && method_exists($value, 'getId')) {
|
||||
self::assertEquals($value->getId(), $actual[$key]->getId());
|
||||
} else {
|
||||
self::assertEquals($value, $actual[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A list of data to normalize.
|
||||
*
|
||||
* @return iterable{array}
|
||||
*/
|
||||
public static function dataProviderFormDataToNormalize(): iterable
|
||||
{
|
||||
foreach (static::getFormData() as $data) {
|
||||
yield [$data, 1, []];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that the query keys are strings.
|
||||
*
|
||||
@@ -280,7 +333,7 @@ abstract class AbstractAggregatorTest extends KernelTestCase
|
||||
$qb->setMaxResults(1);
|
||||
|
||||
$queryKeys = $this->getAggregator()->getQueryKeys($data);
|
||||
$this->getAggregator()->alterQuery($qb, $data);
|
||||
$this->getAggregator()->alterQuery($qb, $data, new ExportGenerationContext($this->getUser()));
|
||||
|
||||
$results = $qb->getQuery()->getResult(AbstractQuery::HYDRATE_ARRAY);
|
||||
|
||||
|
||||
@@ -11,7 +11,9 @@ declare(strict_types=1);
|
||||
|
||||
namespace Chill\MainBundle\Test\Export;
|
||||
|
||||
use Chill\MainBundle\Entity\User;
|
||||
use Chill\MainBundle\Export\DirectExportInterface;
|
||||
use Chill\MainBundle\Export\ExportGenerationContext;
|
||||
use Chill\MainBundle\Export\ExportInterface;
|
||||
use Chill\MainBundle\Test\PrepareClientTrait;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
@@ -99,6 +101,19 @@ abstract class AbstractExportTest extends WebTestCase
|
||||
*/
|
||||
abstract public static function getModifiersCombination(): array;
|
||||
|
||||
protected function getUser(): User
|
||||
{
|
||||
$em = static::getContainer()->get(EntityManagerInterface::class);
|
||||
if (null === $user = $em->createQueryBuilder()->select('u')
|
||||
->from(User::class, 'u')
|
||||
->setMaxResults(1)
|
||||
->getQuery()->getOneOrNullResult()) {
|
||||
throw new \RuntimeException('User not found');
|
||||
}
|
||||
|
||||
return $user;
|
||||
}
|
||||
|
||||
protected function getParameters(bool $filterStatsByCenter): ParameterBagInterface
|
||||
{
|
||||
return new ParameterBag(['chill_main' => ['acl' => ['filter_stats_by_center' => $filterStatsByCenter]]]);
|
||||
@@ -118,6 +133,55 @@ abstract class AbstractExportTest extends WebTestCase
|
||||
return [$exports];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderFormDataToNormalize
|
||||
*/
|
||||
public function testDataNormalization(array $data, int $version, array $customAssert): void
|
||||
{
|
||||
$export = $this->getExport();
|
||||
|
||||
if (is_iterable($export)) {
|
||||
foreach ($export as $e) {
|
||||
$this->testOneDataNormalization($e, $data, $version, $customAssert);
|
||||
}
|
||||
} else {
|
||||
$this->testOneDataNormalization($export, $data, $version, $customAssert);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A list of data to normalize.
|
||||
*
|
||||
* @return iterable{array}
|
||||
*/
|
||||
public static function dataProviderFormDataToNormalize(): iterable
|
||||
{
|
||||
foreach (static::getFormData() as $data) {
|
||||
yield [$data, 1, []];
|
||||
}
|
||||
}
|
||||
|
||||
private function testOneDataNormalization(ExportInterface|DirectExportInterface $export, array $data, int $version, array $customAssert): void
|
||||
{
|
||||
$normalized = $export->normalizeFormData($data);
|
||||
$actual = $export->denormalizeFormData($normalized, $version);
|
||||
|
||||
self::assertEqualsCanonicalizing(array_keys($data), array_keys($actual));
|
||||
|
||||
foreach ($data as $key => $value) {
|
||||
self::assertArrayHasKey($key, $actual);
|
||||
if (array_key_exists($key, $customAssert)) {
|
||||
call_user_func($customAssert[$key], $actual[$key], $value);
|
||||
} elseif (is_iterable($value)) {
|
||||
continue;
|
||||
} elseif (is_object($value) && method_exists($value, 'getId')) {
|
||||
self::assertEquals($value->getId(), $actual[$key]->getId());
|
||||
} else {
|
||||
self::assertEquals($value, $actual[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the formatters type are string.
|
||||
*/
|
||||
@@ -205,7 +269,7 @@ abstract class AbstractExportTest extends WebTestCase
|
||||
// due to the fact that testing both methods use the same tools.
|
||||
|
||||
$queryKeys = $export->getQueryKeys($data);
|
||||
$query = $export->initiateQuery($modifiers, $acl, $data);
|
||||
$query = $export->initiateQuery($modifiers, $acl, $data, $exportGenerationContext = new ExportGenerationContext($this->getUser()));
|
||||
|
||||
// limit the result for the query for performance reason (only for QueryBuilder,
|
||||
// not possible in NativeQuery)
|
||||
@@ -213,7 +277,7 @@ abstract class AbstractExportTest extends WebTestCase
|
||||
$query->setMaxResults(1);
|
||||
}
|
||||
|
||||
$results = $export->getResult($query, $data);
|
||||
$results = $export->getResult($query, $data, $exportGenerationContext);
|
||||
|
||||
$this->assertIsArray(
|
||||
$results,
|
||||
@@ -295,7 +359,7 @@ abstract class AbstractExportTest extends WebTestCase
|
||||
public function testInitiateQuery(mixed $modifiers, mixed $acl, mixed $data)
|
||||
{
|
||||
foreach ($this->getExports() as $export) {
|
||||
$query = $export->initiateQuery($modifiers, $acl, $data);
|
||||
$query = $export->initiateQuery($modifiers, $acl, $data, new ExportGenerationContext($this->getUser()));
|
||||
|
||||
$this->assertTrue(
|
||||
$query instanceof QueryBuilder || $query instanceof NativeQuery,
|
||||
@@ -350,7 +414,7 @@ abstract class AbstractExportTest extends WebTestCase
|
||||
public function testSupportsModifier(mixed $modifiers, mixed $acl, mixed $data)
|
||||
{
|
||||
foreach ($this->getExports() as $export) {
|
||||
$query = $export->initiateQuery($modifiers, $acl, $data);
|
||||
$query = $export->initiateQuery($modifiers, $acl, $data, new ExportGenerationContext($this->getUser()));
|
||||
|
||||
if ($query instanceof QueryBuilder) {
|
||||
$this->assertContainsOnly(
|
||||
|
||||
@@ -11,6 +11,8 @@ declare(strict_types=1);
|
||||
|
||||
namespace Chill\MainBundle\Test\Export;
|
||||
|
||||
use Chill\MainBundle\Entity\User;
|
||||
use Chill\MainBundle\Export\ExportGenerationContext;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
use Prophecy\PhpUnit\ProphecyTrait;
|
||||
@@ -23,16 +25,6 @@ abstract class AbstractFilterTest extends KernelTestCase
|
||||
{
|
||||
use ProphecyTrait;
|
||||
|
||||
/**
|
||||
* @var \Prophecy\Prophet
|
||||
*/
|
||||
private $prophet;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->prophet = $this->getProphet();
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass(): void
|
||||
{
|
||||
if (null !== self::getContainer()) {
|
||||
@@ -43,6 +35,19 @@ abstract class AbstractFilterTest extends KernelTestCase
|
||||
self::ensureKernelShutdown();
|
||||
}
|
||||
|
||||
protected function getUser(): User
|
||||
{
|
||||
$em = static::getContainer()->get(EntityManagerInterface::class);
|
||||
if (null === $user = $em->createQueryBuilder()->select('u')
|
||||
->from(User::class, 'u')
|
||||
->setMaxResults(1)
|
||||
->getQuery()->getOneOrNullResult()) {
|
||||
throw new \RuntimeException('User not found');
|
||||
}
|
||||
|
||||
return $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a filter which will be used in tests.
|
||||
*
|
||||
@@ -74,6 +79,44 @@ abstract class AbstractFilterTest extends KernelTestCase
|
||||
*/
|
||||
abstract public static function getQueryBuilders();
|
||||
|
||||
/**
|
||||
* @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::assertEqualsCanonicalizing(array_keys($data), array_keys($actual));
|
||||
|
||||
foreach ($data as $key => $value) {
|
||||
self::assertArrayHasKey($key, $actual);
|
||||
if (array_key_exists($key, $customAssert)) {
|
||||
call_user_func($customAssert[$key], $actual[$key], $value);
|
||||
} elseif (is_iterable($value)) {
|
||||
continue;
|
||||
} elseif (is_object($value) && method_exists($value, 'getId')) {
|
||||
self::assertEquals($value->getId(), $actual[$key]->getId());
|
||||
} else {
|
||||
self::assertEquals($value, $actual[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A list of data to normalize.
|
||||
*
|
||||
* @return iterable{array}
|
||||
*/
|
||||
public static function dataProviderFormDataToNormalize(): iterable
|
||||
{
|
||||
foreach (static::getFormData() as $data) {
|
||||
yield [$data, 1, []];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare aliases array before and after that filter alter query.
|
||||
*
|
||||
@@ -83,7 +126,7 @@ abstract class AbstractFilterTest extends KernelTestCase
|
||||
{
|
||||
$aliases = $qb->getAllAliases();
|
||||
|
||||
$this->getFilter()->alterQuery($qb, $data);
|
||||
$this->getFilter()->alterQuery($qb, $data, new ExportGenerationContext($this->getUser()));
|
||||
|
||||
$alteredQuery = $qb->getAllAliases();
|
||||
|
||||
@@ -129,7 +172,9 @@ abstract class AbstractFilterTest extends KernelTestCase
|
||||
$nbOfSelect = null !== $query->getDQLPart('select') ?
|
||||
\count($query->getDQLPart('select')) : 0;
|
||||
|
||||
$this->getFilter()->alterQuery($query, $data);
|
||||
$context = new ExportGenerationContext($this->getUser());
|
||||
|
||||
$this->getFilter()->alterQuery($query, $data, $context);
|
||||
|
||||
$this->assertGreaterThanOrEqual(
|
||||
$nbOfFrom,
|
||||
@@ -170,7 +215,7 @@ abstract class AbstractFilterTest extends KernelTestCase
|
||||
*/
|
||||
public function testQueryExecution(QueryBuilder $qb, mixed $data): void
|
||||
{
|
||||
$this->getFilter()->alterQuery($qb, $data);
|
||||
$this->getFilter()->alterQuery($qb, $data, new ExportGenerationContext($this->getUser()));
|
||||
|
||||
$actual = $qb->getQuery()->getResult();
|
||||
|
||||
@@ -206,7 +251,8 @@ abstract class AbstractFilterTest extends KernelTestCase
|
||||
*/
|
||||
public function testDescriptionAction($data)
|
||||
{
|
||||
$description = $this->getFilter()->describeAction($data);
|
||||
$context = new ExportGenerationContext((new User())->setLabel('test user'));
|
||||
$description = $this->getFilter()->describeAction($data, $context);
|
||||
|
||||
$this->assertTrue(
|
||||
\is_string($description) || \is_array($description),
|
||||
@@ -262,15 +308,4 @@ abstract class AbstractFilterTest extends KernelTestCase
|
||||
yield [$data];
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetTitle()
|
||||
{
|
||||
$title = $this->getFilter()->getTitle();
|
||||
|
||||
$this->assertIsString($title);
|
||||
$this->assertNotEmpty(
|
||||
$title,
|
||||
'test that the title is not empty'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user