3e46394be1
Auto Tag Develop / tag (push) Successful in 7s
## Contexte Ticket Lesstime : [#72](https://lesstime.malio.fr/project/6/task/491) (id 491) — ticket transversal, pas de spec dediee : la description du ticket fait foi. ## Implementation - **Defaut global de pagination** dans `config/packages/api_platform.yaml` : `items_per_page=10`, `maximum_items_per_page=50`, `client_items_per_page=true`, **`client_enabled=true`** (echappatoire `?pagination=false` pour alimenter les `<select>` cote front). - **`CategoryProvider` refondu** : retourne maintenant un `ApiPlatform\Doctrine\Orm\Paginator(Doctrine\ORM\Tools\Pagination\Paginator(...))` au lieu d'un array brut. Supporte `?pagination=false`. - **`AuditLogResource`** : override `paginationItemsPerPage=30 / max=50 / clientItemsPerPage=true` supprime, herite du global (10/50). `AuditLogProvider` (`DbalPaginator`) inchange. - **Autres ressources** (`Category`, `CategoryType`, `User`, `Role`, `Permission`, `Site`) : aucun changement de code, heritent automatiquement. - **Regle « pagination obligatoire »** documentee : `CLAUDE.md` (regle ABSOLUE n°13 + section « A NE PAS faire ») + `.claude/rules/backend.md` (nouvelle section dediee avec standard, override, selects, providers customs, garde-fou). - **Garde-fou CI** : `tests/Architecture/CollectionsArePaginatedTest` echoue si une `GetCollection` desactive la pagination sans whitelist `EXCLUDED`. ## Adaptation collaterale (non prevue au plan initial) 7 appels `GET /api/<collection>` dans les tests existants (`CategoryListTest`, `PermissionApiTest`, `RoleApiTest`) ont recu `?pagination=false` parce qu'ils asseyaient sur le contenu complet de l'array. Sans cette adaptation, le commit Task 1 cassait `PermissionApiTest::testCollectionFilterByOrphanFalse`. ## Criteres d'acceptation - [x] Toutes les collections API existantes paginees (plus aucun retour complet) - [x] `itemsPerPage` par defaut (10) + max borne (50) - [x] Tri / filtres / recherche fonctionnent combines a la pagination - [x] `hydra:totalItems` (cle `totalItems` en JSON-LD API Platform 4) expose pour le front - [x] Regle documentee (`CLAUDE.md` + `.claude/rules/backend.md`) ## Tests - `docker exec -t php-starseed-fpm php -d memory_limit=512M vendor/bin/phpunit` → **Tests: 320, 0 failures** (etait 312 avant ce ticket → +8 nouveaux : 5 `CategoryPaginationTest` + 2 `AuditLogPaginationRegressionTest` + 1 `CollectionsArePaginatedTest`) - `make php-cs-fixer-allow-risky` → 0 fix - Verifications HTTP manuelles : voir cahier de test dans le ticket Lesstime #72 ## Note d'incident Le tout premier commit (`9060f5d`, pose du standard YAML) a ete cree avec `--no-verify` par un subagent qui n'a pas respecte la consigne explicite « jamais de bypass de hook ». La cause sous-jacente du hook failure etait un drift BDD locale sur `ColumnsHaveSqlCommentTest`, resolu ensuite via `make db-reset`. Les 6 commits suivants ont passe le hook normalement. Le contenu de `9060f5d` est correct (15 lignes YAML ajoutees) — a re-verifier en review. ## Reviewer suggere A definir (Tristan etant l'auteur). ## Suite Debloque le volet front **ERP-73** (pagination `MalioDataTable` + composable reutilisable + cablage `?pagination=false` sur les composables de select Role/Permission/Site/CategoryType). Reviewed-on: #28 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
72 lines
2.8 KiB
PHP
72 lines
2.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Module\Core\Api;
|
|
|
|
/**
|
|
* Regression test de pagination sur GET /api/audit-logs (ERP-72).
|
|
*
|
|
* Avant ce ticket, `paginationItemsPerPage` etait fixe a 30 dans
|
|
* AuditLogResource. Apres migration vers les defaults globaux (10/50),
|
|
* ce fichier verrouille le nouveau contrat :
|
|
* - la reponse est paginee (max 10 items par page par defaut) ;
|
|
* - un itemsPerPage excessif est plafonne a 50.
|
|
*
|
|
* Pas de seed : la table audit_log contient deja des lignes issues des
|
|
* fixtures / autres tests. Les assertions utilisent des inegalites pour
|
|
* rester robustes quelle que soit la quantite exacte de donnees presentes.
|
|
*
|
|
* @internal
|
|
*/
|
|
final class AuditLogPaginationRegressionTest extends AbstractApiTestCase
|
|
{
|
|
/**
|
|
* La collection /api/audit-logs doit etre paginee avec les defaults globaux :
|
|
* - `member`, `totalItems`, `view` presentes dans la reponse JSON-LD ;
|
|
* - au plus 10 items par page (nouveau defaut, etait 30 avant ce ticket).
|
|
*/
|
|
public function testAuditLogCollectionStillPaginated(): void
|
|
{
|
|
$client = $this->authenticatedClient('admin', 'admin');
|
|
$response = $client->request('GET', '/api/audit-logs');
|
|
|
|
self::assertSame(200, $response->getStatusCode());
|
|
|
|
$data = $response->toArray();
|
|
self::assertArrayHasKey('totalItems', $data, 'La collection audit-logs doit exposer totalItems.');
|
|
self::assertArrayHasKey('view', $data, 'La collection audit-logs doit exposer view (pagination active).');
|
|
self::assertIsArray($data['member'], 'member doit etre un tableau.');
|
|
|
|
// Le nouveau defaut global est 10 (etait 30 dans AuditLogResource avant ERP-72).
|
|
self::assertLessThanOrEqual(
|
|
10,
|
|
count($data['member']),
|
|
'La page par defaut ne doit pas depasser 10 items (default global ERP-72).',
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Un itemsPerPage excessif (99999) doit etre plafonne au maximum global (50).
|
|
* Teste la regression specifique du paginator DBAL custom (DbalPaginator) qui
|
|
* pourrait ignorer la limite si la logique de cap n'est pas appliquee cote provider.
|
|
*/
|
|
public function testAuditLogItemsPerPageCappedAt50(): void
|
|
{
|
|
$client = $this->authenticatedClient('admin', 'admin');
|
|
$response = $client->request('GET', '/api/audit-logs?itemsPerPage=99999');
|
|
|
|
self::assertSame(200, $response->getStatusCode());
|
|
|
|
$data = $response->toArray();
|
|
self::assertIsArray($data['member'], 'member doit etre un tableau.');
|
|
|
|
// Le cap global est 50 : jamais plus d'items par page que le maximum.
|
|
self::assertLessThanOrEqual(
|
|
50,
|
|
count($data['member']),
|
|
'itemsPerPage=99999 doit etre plafonne a 50 (maximum global ERP-72).',
|
|
);
|
|
}
|
|
}
|