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,7 +6,8 @@ namespace App\Tests\Module\Logistique\Api;
|
||||
|
||||
/**
|
||||
* Contrat de serialisation du ticket de pesee (M5, spec-back § 4.0 / § 4.0.bis).
|
||||
* Jumeau de {@see \App\Tests\Module\Transport\Api\CarrierSerializationContractTest}.
|
||||
* Jumeau du test de contrat M4 CarrierSerializationContractTest (module Transport,
|
||||
* reference en prose pour ne pas materialiser d'import inter-module).
|
||||
*
|
||||
* Capture le JSON REEL (liste + detail) via un ticket cree par l'API (numerotation
|
||||
* serveur reelle) et reverifie les 4 pieges du RETEX M1 transposes au M5 :
|
||||
@@ -81,6 +82,44 @@ final class WeighingTicketSerializationContractTest extends AbstractWeighingTick
|
||||
$this->dumpDodIfRequested($list, $detail);
|
||||
}
|
||||
|
||||
/**
|
||||
* Piege #1 symetrique (spec § 4.0.bis) : sur une contrepartie FOURNISSEUR,
|
||||
* `supplier` doit sortir en OBJET embarque (supplier:read) et `client` etre
|
||||
* null (jamais un IRI nu). Le cas Client est couvert ci-dessus ; ce test
|
||||
* verrouille l'autre branche pour qu'un drift de read-group cote Supplier ne
|
||||
* passe pas inapercu.
|
||||
*/
|
||||
public function testSupplierCounterpartyEmbedsSupplier(): void
|
||||
{
|
||||
$site = $this->siteByCode('86');
|
||||
$http = $this->authManageOnSite($site);
|
||||
$supplierEntity = $this->seedTestSupplier('Ferraille');
|
||||
|
||||
$created = $this->postTicket($http, $this->validSupplierTicketPayload($supplierEntity));
|
||||
self::assertResponseStatusCodeSame(201);
|
||||
$createdBody = $created->toArray();
|
||||
|
||||
$id = (int) $createdBody['id'];
|
||||
$number = (string) $createdBody['number'];
|
||||
|
||||
$detail = $http->request('GET', '/api/weighing_tickets/'.$id, ['headers' => ['Accept' => self::LD]])->toArray();
|
||||
$list = $http->request('GET', '/api/weighing_tickets?search='.$number, ['headers' => ['Accept' => self::LD]])->toArray();
|
||||
|
||||
$row = $this->memberById($list, $id);
|
||||
self::assertNotNull($row, 'Le ticket fournisseur cree doit apparaitre dans la liste filtree.');
|
||||
|
||||
// Liste : supplier embarque en objet, client omis/null (skip_null_values).
|
||||
self::assertIsArray($row['supplier'], 'supplier doit etre un objet embarque (supplier:read), pas un IRI nu.');
|
||||
self::assertArrayHasKey('companyName', $row['supplier']);
|
||||
self::assertNull($row['client'] ?? null);
|
||||
self::assertSame('FOURNISSEUR', $row['counterpartyType']);
|
||||
|
||||
// Detail : meme contrat cote item.
|
||||
self::assertIsArray($detail['supplier']);
|
||||
self::assertArrayHasKey('companyName', $detail['supplier']);
|
||||
self::assertNull($detail['client'] ?? null);
|
||||
}
|
||||
|
||||
/**
|
||||
* DoD (§ 4.0.bis) : ecrit les corps JSON reels sous /tmp si WEIGHING_TICKET_DOD_DUMP
|
||||
* est positionnee (sinon no-op). A coller dans spec-back.md § 4.0.bis.
|
||||
|
||||
Reference in New Issue
Block a user