fix(back,front) : adresse client — au moins une categorie obligatoire
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m54s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m15s

Spec-front § Adresse : la categorie est obligatoire sur une adresse, mais
n'etait enforced ni au back ni au front.

- Back : ClientAddress::$categories porte desormais Assert\Count(min: 1)
  (POST/PATCH sans categorie -> 422). Test testAddressRequiresAtLeastOneCategory ;
  deux tests existants qui creaient une adresse sans categorie recoivent une
  categorie SECTEUR.
- Front : canValidateAddresses (creation + modification) exige >= 1 categorie
  par adresse -> bouton Enregistrer desactive tant qu'aucune categorie n'est
  choisie (meme gating que les sites).
This commit is contained in:
2026-06-03 15:57:26 +02:00
parent 9c301371fb
commit 7a45d17724
5 changed files with 40 additions and 7 deletions
@@ -167,8 +167,9 @@ final class ClientAddressTest extends AbstractCommercialApiTestCase
public function testNonBillingAddressAcceptsEmptyBillingEmail(): void
{
$this->skipIfSitesModuleDisabled();
$client = $this->createAdminClient();
$seed = $this->seedClient('Non Billing Empty Email');
$client = $this->createAdminClient();
$seed = $this->seedClient('Non Billing Empty Email');
$category = $this->createCategory('SECTEUR');
$client->request('POST', '/api/clients/'.$seed->getId().'/addresses', [
'headers' => ['Content-Type' => self::LD],
@@ -179,6 +180,7 @@ final class ClientAddressTest extends AbstractCommercialApiTestCase
'city' => 'Châtellerault',
'street' => '1 rue du Test',
'sites' => [$this->firstSiteIri()],
'categories' => ['/api/categories/'.$category->getId()],
],
]);
@@ -286,6 +288,29 @@ final class ClientAddressTest extends AbstractCommercialApiTestCase
self::assertResponseStatusCodeSame(201);
}
/**
* Spec-front § Adresse : au moins une categorie est obligatoire sur une
* adresse. POST sans categorie (mais avec site) -> 422.
*/
public function testAddressRequiresAtLeastOneCategory(): void
{
$this->skipIfSitesModuleDisabled();
$client = $this->createAdminClient();
$seed = $this->seedClient('Address No Cat');
$client->request('POST', '/api/clients/'.$seed->getId().'/addresses', [
'headers' => ['Content-Type' => self::LD],
'json' => [
'postalCode' => '86100',
'city' => 'Châtellerault',
'street' => '1 rue du Test',
'sites' => [$this->firstSiteIri()],
],
]);
self::assertResponseStatusCodeSame(422);
}
/**
* Retourne l'IRI du premier site seede (fixtures Sites).
*/