[ERP-72] Paginer toutes les collections API + regle pagination obligatoire #28
@@ -68,6 +68,13 @@ final readonly class AuditLogProvider implements ProviderInterface
|
|||||||
*/
|
*/
|
||||||
private function provideCollection(Operation $operation, array $context): DbalPaginator
|
private function provideCollection(Operation $operation, array $context): DbalPaginator
|
||||||
{
|
{
|
||||||
|
// Contrairement aux ressources ORM (cf. CategoryProvider), ce provider
|
||||||
|
// ne gere PAS l'echappatoire `?pagination=false` : la pagination y est
|
||||||
|
// toujours forcee. `audit_log` est une table append-only a croissance
|
||||||
|
// infinie — la dumper entierement saturerait memoire/reseau et n'a aucun
|
||||||
|
// usage front (pas de <select> alimente par l'audit). Le flag global
|
||||||
|
// `pagination_client_enabled: true` reste donc volontairement inerte ici.
|
||||||
|
//
|
||||||
// `page` brut peut etre <= 0 (parametre client) → OFFSET negatif → 500 PG
|
// `page` brut peut etre <= 0 (parametre client) → OFFSET negatif → 500 PG
|
||||||
// (`SQLSTATE[22023] OFFSET must not be negative`). API Platform clampe
|
// (`SQLSTATE[22023] OFFSET must not be negative`). API Platform clampe
|
||||||
// `itemsPerPage` au max de la resource mais pas `page` ; on impose un
|
// `itemsPerPage` au max de la resource mais pas `page` ; on impose un
|
||||||
|
|||||||
@@ -71,6 +71,38 @@ final class PermissionApiTest extends AbstractApiTestCase
|
|||||||
self::assertGreaterThanOrEqual(3, $data['totalItems']);
|
self::assertGreaterThanOrEqual(3, $data['totalItems']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verrouille le chemin paginE PAR DEFAUT (ERP-72) : sans `?pagination=false`,
|
||||||
|
* `/api/permissions` doit borner la page au defaut global (10) et exposer
|
||||||
|
* `view`. Les autres tests de filtre passent `?pagination=false` et
|
||||||
|
* n'exercent donc plus ce contrat — on le reteste ici de maniere isolee.
|
||||||
|
*
|
||||||
|
* On seed 12 permissions de test pour garantir un total > 10 quelle que soit
|
||||||
|
* la quantite de permissions reelles presentes en base.
|
||||||
|
*/
|
||||||
|
public function testDefaultCollectionIsPaginatedToGlobalDefault(): void
|
||||||
|
{
|
||||||
|
$em = $this->getEm();
|
||||||
|
for ($i = 1; $i <= 12; ++$i) {
|
||||||
|
$em->persist(new Permission(sprintf('test.core.pagination.perm_%d', $i), sprintf('Perm pagination %d (test)', $i), 'core'));
|
||||||
|
}
|
||||||
|
$em->flush();
|
||||||
|
$em->clear();
|
||||||
|
|
||||||
|
$client = $this->authenticatedClient('admin', 'admin');
|
||||||
|
$response = $client->request('GET', '/api/permissions');
|
||||||
|
|
||||||
|
self::assertResponseIsSuccessful();
|
||||||
|
$data = $response->toArray();
|
||||||
|
|
||||||
|
// La page par defaut ne doit jamais depasser le maximum global (10).
|
||||||
|
self::assertLessThanOrEqual(10, count($data['member']), 'La page par defaut doit etre bornee a 10 items.');
|
||||||
|
// Avec >= 12 permissions de test (+ reelles), le total depasse une page.
|
||||||
|
self::assertGreaterThan(10, $data['totalItems']);
|
||||||
|
// `view` n'est present que lorsque la collection est reellement paginee.
|
||||||
|
self::assertArrayHasKey('view', $data, 'La collection doit exposer view quand totalItems > itemsPerPage.');
|
||||||
|
}
|
||||||
|
|
||||||
public function testCollectionFilterByModule(): void
|
public function testCollectionFilterByModule(): void
|
||||||
{
|
{
|
||||||
$client = $this->authenticatedClient('admin', 'admin');
|
$client = $this->authenticatedClient('admin', 'admin');
|
||||||
|
|||||||
@@ -157,6 +157,35 @@ final class RoleApiTest extends AbstractApiTestCase
|
|||||||
self::assertContains('test_editor', $codes);
|
self::assertContains('test_editor', $codes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verrouille le chemin paginE PAR DEFAUT (ERP-72) : le test ci-dessus passe
|
||||||
|
* `?pagination=false` (usage <select>) et n'exerce donc plus le defaut
|
||||||
|
* paginE. On seed 11 roles de test pour depasser une page (10) et verifier
|
||||||
|
* que, sans parametre, la page est bornee a 10 et expose `view`.
|
||||||
|
*/
|
||||||
|
public function testDefaultCollectionIsPaginatedToGlobalDefault(): void
|
||||||
|
{
|
||||||
|
$em = $this->getEm();
|
||||||
|
for ($i = 1; $i <= 11; ++$i) {
|
||||||
|
$em->persist(new Role(sprintf('test_pg_%d', $i), sprintf('Role pagination %d (test)', $i), false));
|
||||||
|
}
|
||||||
|
$em->flush();
|
||||||
|
$em->clear();
|
||||||
|
|
||||||
|
$client = $this->authenticatedClient('admin', 'admin');
|
||||||
|
$response = $client->request('GET', '/api/roles');
|
||||||
|
|
||||||
|
self::assertResponseIsSuccessful();
|
||||||
|
$data = $response->toArray();
|
||||||
|
|
||||||
|
// La page par defaut ne doit jamais depasser le maximum global (10).
|
||||||
|
self::assertLessThanOrEqual(10, count($data['member']), 'La page par defaut doit etre bornee a 10 items.');
|
||||||
|
// 11 roles de test + 2 systeme + editor + viewer => total > 10.
|
||||||
|
self::assertGreaterThan(10, $data['totalItems']);
|
||||||
|
// `view` n'est present que lorsque la collection est reellement paginee.
|
||||||
|
self::assertArrayHasKey('view', $data, 'La collection doit exposer view quand totalItems > itemsPerPage.');
|
||||||
|
}
|
||||||
|
|
||||||
public function testGetCollectionFilterByIsSystemTrue(): void
|
public function testGetCollectionFilterByIsSystemTrue(): void
|
||||||
{
|
{
|
||||||
$client = $this->authenticatedClient('admin', 'admin');
|
$client = $this->authenticatedClient('admin', 'admin');
|
||||||
|
|||||||
Reference in New Issue
Block a user