5dc5e703e3
Couvre les RG produit (M6) en tests fonctionnels API et capture le contrat de serialisation reel (DoD spec-back § 4.0.bis). Tests (tests/Module/Catalog/Api/) : - AbstractProductApiTestCase : base commune (productType find-or-create PRODUIT, productCategory, seedStorageType par sites, validProductPayload, dump DoD). - ProductSerializationContractTest : POST reel + GET liste/detail ; category en objet embarque, sites/storageTypes en tableaux d'objets, states en tableau, manufactured/containsMolasses booleens presents. Dump regenerable via PRODUCT_DOD_DUMP=1. - ProductCodeUniquenessTest (RG-6.01) : 409 doublon actif, collision sur forme normalisee, reutilisation d'un code soft-deleted (index partiel). - ProductStatesValidationTest (RG-6.02) : >=1 etat requis, valeur hors enum 422. - ProductConditionalFieldsTest (RG-6.03) : manufactured/containsMolasses forces false sans SALE (POST et PATCH), conserves avec SALE. - ProductCategoryTypeTest (RG-6.05) : 422 si categorie non-PRODUIT. - ProductStorageTypeBySiteTest (RG-6.06) : 422 si storageType hors sites choisis. - ProductRBACMatrixTest : Admin 200/201 ; Bureau/Compta/Commerciale/Usine 403 (view + manage) ; view lit mais ne gere pas. Fix contrat de serialisation : le getter containsMolasses() ne respectait pas la convention d'accesseur (get/is/has) -> le serialiseur n'exposait PAS le champ dans le JSON, alors que le DoD l'exige. Renomme en isContainsMolasses() (+ unique appelant dans ProductExportController). Defaut capte par le test de contrat. Spec : JSON reel colle dans spec-back § 4.0.bis (remplace l'esquisse). Le contrat reel est plus riche : la liste porte deja sites/storageTypes embarques, category embarque categoryTypes + audit, createdBy/updatedBy en IRI, sites avec adresse. make test vert (897 tests) ; php-cs-fixer conforme.
80 lines
2.8 KiB
PHP
80 lines
2.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Module\Catalog\Api;
|
|
|
|
/**
|
|
* RG-6.03 : « Fabrique » / « Contient de la melasse » saisissables uniquement si
|
|
* `states` contient SALE ; sinon forces `false` cote serveur (Processor), quoi
|
|
* que le client envoie.
|
|
*
|
|
* @internal
|
|
*/
|
|
final class ProductConditionalFieldsTest extends AbstractProductApiTestCase
|
|
{
|
|
public function testConditionalFieldsForcedFalseWithoutSale(): void
|
|
{
|
|
$client = $this->createAdminClient();
|
|
|
|
// Pas de SALE dans les etats mais champs conditionnels a true cote client.
|
|
$created = $client->request('POST', '/api/products', [
|
|
'headers' => ['Content-Type' => self::LD],
|
|
'json' => $this->validProductPayload([
|
|
'states' => ['PURCHASE', 'OTHER'],
|
|
'manufactured' => true,
|
|
'containsMolasses' => true,
|
|
]),
|
|
])->toArray();
|
|
|
|
self::assertResponseStatusCodeSame(201);
|
|
// Le serveur a force les deux a false (RG-6.03).
|
|
self::assertFalse($created['manufactured']);
|
|
self::assertFalse($created['containsMolasses']);
|
|
}
|
|
|
|
public function testConditionalFieldsKeptWithSale(): void
|
|
{
|
|
$client = $this->createAdminClient();
|
|
|
|
$created = $client->request('POST', '/api/products', [
|
|
'headers' => ['Content-Type' => self::LD],
|
|
'json' => $this->validProductPayload([
|
|
'states' => ['SALE'],
|
|
'manufactured' => true,
|
|
'containsMolasses' => true,
|
|
]),
|
|
])->toArray();
|
|
|
|
self::assertResponseStatusCodeSame(201);
|
|
// SALE present -> les valeurs saisies sont conservees.
|
|
self::assertTrue($created['manufactured']);
|
|
self::assertTrue($created['containsMolasses']);
|
|
}
|
|
|
|
public function testConditionalFieldsResetOnPatchRemovingSale(): void
|
|
{
|
|
$client = $this->createAdminClient();
|
|
|
|
$created = $client->request('POST', '/api/products', [
|
|
'headers' => ['Content-Type' => self::LD],
|
|
'json' => $this->validProductPayload([
|
|
'states' => ['SALE'],
|
|
'manufactured' => true,
|
|
'containsMolasses' => true,
|
|
]),
|
|
])->toArray();
|
|
self::assertResponseStatusCodeSame(201);
|
|
|
|
// On retire SALE en PATCH -> les conditionnels doivent retomber a false.
|
|
$patched = $client->request('PATCH', '/api/products/'.$created['id'], [
|
|
'headers' => ['Content-Type' => self::MERGE],
|
|
'json' => ['states' => ['PURCHASE']],
|
|
])->toArray();
|
|
|
|
self::assertResponseStatusCodeSame(200);
|
|
self::assertFalse($patched['manufactured']);
|
|
self::assertFalse($patched['containsMolasses']);
|
|
}
|
|
}
|