test(logistique) : durcissement tests M5 — embed FOURNISSEUR symetrique + propertyPath 422 (ERP-187)
- WeighingTicketSerializationContractTest : couvre la branche FOURNISSEUR (supplier embarque, client null) en plus de CLIENT (piege #1 symetrique, spec § 4.0.bis). - AbstractWeighingTicketApiTestCase : helpers seedTestSupplier + payload FOURNISSEUR + purge supplier au tearDown. - WeighbridgeReadingApiTest : les 422 (mode invalide / poids manquant) verifient desormais le propertyPath (garde-fou ERP-101), pas seulement le code HTTP. - NetWeightTest : docbloc isNew/contains() clarifie.
This commit is contained in:
@@ -6,6 +6,7 @@ namespace App\Tests\Module\Logistique\Api;
|
||||
|
||||
use ApiPlatform\Symfony\Bundle\Test\Client;
|
||||
use App\Module\Commercial\Domain\Entity\Client as ClientEntity;
|
||||
use App\Module\Commercial\Domain\Entity\Supplier as SupplierEntity;
|
||||
use App\Module\Core\Domain\Entity\Role;
|
||||
use App\Module\Core\Domain\Entity\User;
|
||||
use App\Module\Sites\Domain\Entity\Site;
|
||||
@@ -31,16 +32,28 @@ abstract class AbstractWeighingTicketApiTestCase extends AbstractApiTestCase
|
||||
/** Prefixe companyName des Client seedes par ces tests (purge ciblee). */
|
||||
protected const string TEST_CLIENT_PREFIX = 'ZTESTWTAPI';
|
||||
|
||||
/** Prefixe companyName des Supplier seedes par ces tests (purge ciblee). */
|
||||
protected const string TEST_SUPPLIER_PREFIX = 'ZTESTWTAPISUP';
|
||||
|
||||
protected function tearDown(): void
|
||||
{
|
||||
$em = $this->getEm();
|
||||
|
||||
// Tickets referencant un Client de test d'abord (FK client_id RESTRICT) :
|
||||
// purge DBAL brute pour liberer les Client avant de les supprimer.
|
||||
// Tickets referencant un Client OU un Supplier de test d'abord (FK
|
||||
// client_id / supplier_id RESTRICT) : purge DBAL brute pour liberer la
|
||||
// contrepartie avant de la supprimer. Un ticket FOURNISSEUR a client_id
|
||||
// NULL -> il faut bien purger aussi par supplier_id (sinon ticket orphelin).
|
||||
$em->getConnection()->executeStatement(
|
||||
'DELETE FROM weighing_ticket WHERE client_id IN (SELECT id FROM client WHERE company_name LIKE :p)',
|
||||
['p' => self::TEST_CLIENT_PREFIX.'%'],
|
||||
);
|
||||
$em->getConnection()->executeStatement(
|
||||
'DELETE FROM weighing_ticket WHERE supplier_id IN (SELECT id FROM supplier WHERE company_name LIKE :p)',
|
||||
['p' => self::TEST_SUPPLIER_PREFIX.'%'],
|
||||
);
|
||||
$em->createQuery('DELETE FROM '.SupplierEntity::class.' s WHERE s.companyName LIKE :p')
|
||||
->setParameter('p', self::TEST_SUPPLIER_PREFIX.'%')->execute()
|
||||
;
|
||||
$em->createQuery('DELETE FROM '.ClientEntity::class.' c WHERE c.companyName LIKE :p')
|
||||
->setParameter('p', self::TEST_CLIENT_PREFIX.'%')->execute()
|
||||
;
|
||||
@@ -138,6 +151,28 @@ abstract class AbstractWeighingTicketApiTestCase extends AbstractApiTestCase
|
||||
return '/api/clients/'.$client->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Seede un Supplier minimal (companyName prefixe pour la purge). Sert de
|
||||
* contrepartie aux tickets de test en branche FOURNISSEUR (RG-5.03).
|
||||
*/
|
||||
protected function seedTestSupplier(string $label): SupplierEntity
|
||||
{
|
||||
$em = $this->getEm();
|
||||
$suffix = substr(bin2hex(random_bytes(3)), 0, 6);
|
||||
|
||||
$supplier = new SupplierEntity();
|
||||
$supplier->setCompanyName(mb_strtoupper(self::TEST_SUPPLIER_PREFIX.' '.$label.' '.$suffix, 'UTF-8'));
|
||||
$em->persist($supplier);
|
||||
$em->flush();
|
||||
|
||||
return $supplier;
|
||||
}
|
||||
|
||||
protected function supplierIri(SupplierEntity $supplier): string
|
||||
{
|
||||
return '/api/suppliers/'.$supplier->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Payload POST de reference : contrepartie Client, pesee a vide + a plein en
|
||||
* mode AUTO (le Processor (re)alloue les DSD et calcule le net = 14300 - 7150).
|
||||
@@ -160,6 +195,29 @@ abstract class AbstractWeighingTicketApiTestCase extends AbstractApiTestCase
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Payload POST de reference en branche FOURNISSEUR (RG-5.03) — miroir de
|
||||
* validClientTicketPayload, contrepartie Supplier. Sert a prouver l'embed
|
||||
* symetrique de `supplier` (spec § 4.0.bis piege #1).
|
||||
*
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
protected function validSupplierTicketPayload(SupplierEntity $supplier): array
|
||||
{
|
||||
return [
|
||||
'counterpartyType' => 'FOURNISSEUR',
|
||||
'supplier' => $this->supplierIri($supplier),
|
||||
'immatriculation' => 'AB-123-CD',
|
||||
'plateFreeFormat' => false,
|
||||
'emptyDate' => '2026-06-17T09:00:00+02:00',
|
||||
'emptyWeight' => 7150,
|
||||
'emptyMode' => 'AUTO',
|
||||
'fullDate' => '2026-06-17T09:12:00+02:00',
|
||||
'fullWeight' => 14300,
|
||||
'fullMode' => 'AUTO',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* POST un ticket et renvoie la reponse (assertions de statut a la charge de
|
||||
* l'appelant).
|
||||
@@ -177,7 +235,7 @@ abstract class AbstractWeighingTicketApiTestCase extends AbstractApiTestCase
|
||||
*
|
||||
* @param array<string, mixed> $collection
|
||||
*
|
||||
* @return array<string, mixed>|null
|
||||
* @return null|array<string, mixed>
|
||||
*/
|
||||
protected function memberById(array $collection, int $id): ?array
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user