74 lines
2.7 KiB
PHP
74 lines
2.7 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Module\Commercial\Api;
|
|
|
|
use App\Module\Commercial\Domain\Entity\Client as ClientEntity;
|
|
|
|
/**
|
|
* Tests d'unicite — combler les trous (ERP-60).
|
|
*
|
|
* RG-1.16 (doublon de companyName parmi les actifs -> 409) est DEJA couvert par
|
|
* ClientApiTest::testPostDuplicateCompanyNameReturns409 (ERP-55). Ce fichier
|
|
* verifie l'envers de la decision Q4 (29/05/2026) : le SIREN (RG-1.15 supprimee)
|
|
* et l'email (RG-1.17 supprimee) NE SONT PLUS contraints uniques.
|
|
*
|
|
* @internal
|
|
*/
|
|
final class ClientUniquenessTest extends AbstractCommercialApiTestCase
|
|
{
|
|
private const string LD = 'application/ld+json';
|
|
|
|
/**
|
|
* RG-1.16 / RG-1.17 (Q4) : deux clients actifs peuvent partager le meme
|
|
* email principal — aucune contrainte d'unicite (un email peut servir
|
|
* plusieurs clients).
|
|
*/
|
|
public function testDuplicateEmailIsAllowed(): void
|
|
{
|
|
$client = $this->createAdminClient();
|
|
$cat = $this->createCategory('SECTEUR');
|
|
$iri = '/api/categories/'.$cat->getId();
|
|
|
|
$payload = static fn (string $name): array => [
|
|
'companyName' => $name,
|
|
'firstName' => 'A',
|
|
'phonePrimary' => '0102030405',
|
|
'email' => 'partage@test.fr',
|
|
'categories' => [$iri],
|
|
];
|
|
|
|
$client->request('POST', '/api/clients', ['headers' => ['Content-Type' => self::LD], 'json' => $payload('Email Share One')]);
|
|
self::assertResponseStatusCodeSame(201);
|
|
|
|
// Meme email, nom different -> doit passer (pas d'index unique email).
|
|
$client->request('POST', '/api/clients', ['headers' => ['Content-Type' => self::LD], 'json' => $payload('Email Share Two')]);
|
|
self::assertResponseStatusCodeSame(201);
|
|
}
|
|
|
|
/**
|
|
* RG-1.15 (Q4) : deux clients peuvent partager le meme SIREN (etablissements
|
|
* multiples). Le SIREN n'est pas ecrivable au POST (groupe accounting), on
|
|
* seede donc directement via l'ORM et on prouve que le flush ne leve aucune
|
|
* violation d'unicite.
|
|
*/
|
|
public function testDuplicateSirenIsAllowed(): void
|
|
{
|
|
// Boot kernel pour disposer de l'EM (pas d'appel HTTP necessaire ici).
|
|
self::bootKernel();
|
|
$em = $this->getEm();
|
|
|
|
$one = $this->seedClient('Siren Share One');
|
|
$two = $this->seedClient('Siren Share Two');
|
|
|
|
$one->setSiren('123456789');
|
|
$two->setSiren('123456789');
|
|
$em->flush();
|
|
|
|
// Aucune exception : preuve qu'il n'existe pas d'index unique sur siren.
|
|
self::assertSame('123456789', $em->getRepository(ClientEntity::class)->find($one->getId())->getSiren());
|
|
self::assertSame('123456789', $em->getRepository(ClientEntity::class)->find($two->getId())->getSiren());
|
|
}
|
|
}
|