test(commercial) : POST sous-ressource sur client inexistant -> 404 (ERP-110)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m55s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m27s

This commit is contained in:
Matthieu
2026-06-04 13:34:00 +02:00
parent b564838c2e
commit ad32d8147d
@@ -140,6 +140,25 @@ final class ClientSubResourceApiTest extends AbstractCommercialApiTestCase
self::assertSame('L\'adresse email n\'est pas valide.', $byPath['email']);
}
/**
* ERP-110 : avec read:false sur le POST, un parent introuvable n'est plus
* intercepte au stade lecture. Le 404 est desormais porte par
* ClientContactProcessor::linkParent (sinon 500 au persist sur client_id
* NOT NULL). Le payload est valide pour atteindre le processor (apres la
* validation).
*/
public function testPostContactOnMissingClientReturns404(): void
{
$client = $this->createAdminClient();
$client->request('POST', '/api/clients/999999/contacts', [
'headers' => ['Content-Type' => self::LD, 'Accept' => self::LD],
'json' => ['firstName' => 'Orphan'],
]);
self::assertResponseStatusCodeSame(404);
}
public function testPatchContactNormalizes(): void
{
$client = $this->createAdminClient();
@@ -276,6 +295,32 @@ final class ClientSubResourceApiTest extends AbstractCommercialApiTestCase
self::assertResponseStatusCodeSame(201);
}
/**
* ERP-110 : POST adresse sur un client inexistant -> 404 porte par
* ClientAddressProcessor::linkParent (read:false). Payload valide (site +
* categorie, RG-1.10 / RG-1.29) pour atteindre le processor.
*/
public function testPostAddressOnMissingClientReturns404(): void
{
$this->skipIfSitesModuleDisabled();
$client = $this->createAdminClient();
$siteIri = $this->firstSiteIri();
$category = $this->createCategory('SECTEUR');
$client->request('POST', '/api/clients/999999/addresses', [
'headers' => ['Content-Type' => self::LD, 'Accept' => self::LD],
'json' => [
'postalCode' => '75001',
'city' => 'Paris',
'street' => '2 rue Neuve',
'sites' => [$siteIri],
'categories' => ['/api/categories/'.$category->getId()],
],
]);
self::assertResponseStatusCodeSame(404);
}
// === RIBs ===
public function testPostRibByAdminReturns201(): void
@@ -334,6 +379,23 @@ final class ClientSubResourceApiTest extends AbstractCommercialApiTestCase
self::assertResponseStatusCodeSame(201);
}
/**
* ERP-110 : POST RIB sur un client inexistant -> 404 porte par
* ClientRibProcessor::linkParent (read:false). L'admin porte
* commercial.clients.accounting.manage ; payload valide (BIC / IBAN).
*/
public function testPostRibOnMissingClientReturns404(): void
{
$client = $this->createAdminClient();
$client->request('POST', '/api/clients/999999/ribs', [
'headers' => ['Content-Type' => self::LD, 'Accept' => self::LD],
'json' => ['label' => 'Orphan', 'bic' => self::VALID_BIC, 'iban' => self::VALID_IBAN],
]);
self::assertResponseStatusCodeSame(404);
}
public function testDeleteRibNonLcrReturns204(): void
{
$client = $this->createAdminClient();