Le nom d'une machine n'est plus unique globalement mais par site : deux machines peuvent porter le même nom sur des sites différents, mais le doublon reste interdit sur un même site. - Machine : contrainte composite (name, siteId) + UniqueEntity (name, site) - UniqueConstraintSubscriber : message explicite pour uniq_machine_name_site - Migration : drop index global sur name + create unique index (name, siteid) - Front : message d'erreur inline explicite à la création (page + modale) - Tests : 4 scénarios (sites différents / même site / renommage / déplacement)
This commit is contained in:
@@ -134,6 +134,88 @@ class MachineTest extends AbstractApiTestCase
|
||||
$this->assertResponseStatusCodeSame(422);
|
||||
}
|
||||
|
||||
public function testSameNameOnDifferentSitesIsAllowed(): void
|
||||
{
|
||||
$siteA = $this->createSite('Usine A');
|
||||
$siteB = $this->createSite('Usine B');
|
||||
$this->createMachine('Pompe', $siteA);
|
||||
|
||||
$client = $this->createGestionnaireClient();
|
||||
$client->request('POST', '/api/machines', [
|
||||
'headers' => ['Content-Type' => 'application/ld+json'],
|
||||
'json' => [
|
||||
'name' => 'Pompe',
|
||||
'site' => self::iri('sites', $siteB->getId()),
|
||||
],
|
||||
]);
|
||||
|
||||
$this->assertResponseStatusCodeSame(201);
|
||||
$this->assertJsonContains(['name' => 'Pompe']);
|
||||
}
|
||||
|
||||
public function testSameNameOnSameSiteIsRejected(): void
|
||||
{
|
||||
$site = $this->createSite('Usine');
|
||||
$this->createMachine('Pompe', $site);
|
||||
|
||||
$client = $this->createGestionnaireClient();
|
||||
$client->request('POST', '/api/machines', [
|
||||
'headers' => ['Content-Type' => 'application/ld+json'],
|
||||
'json' => [
|
||||
'name' => 'Pompe',
|
||||
'site' => self::iri('sites', $site->getId()),
|
||||
],
|
||||
]);
|
||||
|
||||
$this->assertResponseStatusCodeSame(422);
|
||||
$this->assertJsonContains([
|
||||
'violations' => [
|
||||
['message' => 'Une machine avec ce nom existe déjà sur ce site.'],
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function testRenameToExistingNameOnSameSiteIsRejected(): void
|
||||
{
|
||||
$site = $this->createSite('Usine');
|
||||
$this->createMachine('Pompe', $site);
|
||||
$other = $this->createMachine('Moteur', $site);
|
||||
|
||||
$client = $this->createGestionnaireClient();
|
||||
$client->request('PATCH', self::iri('machines', $other->getId()), [
|
||||
'headers' => ['Content-Type' => 'application/merge-patch+json'],
|
||||
'json' => ['name' => 'Pompe'],
|
||||
]);
|
||||
|
||||
$this->assertResponseStatusCodeSame(422);
|
||||
$this->assertJsonContains([
|
||||
'violations' => [
|
||||
['message' => 'Une machine avec ce nom existe déjà sur ce site.'],
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function testMoveToSiteWhereNameExistsIsRejected(): void
|
||||
{
|
||||
$siteA = $this->createSite('Usine A');
|
||||
$siteB = $this->createSite('Usine B');
|
||||
$this->createMachine('Pompe', $siteB);
|
||||
$machine = $this->createMachine('Pompe', $siteA);
|
||||
|
||||
$client = $this->createGestionnaireClient();
|
||||
$client->request('PATCH', self::iri('machines', $machine->getId()), [
|
||||
'headers' => ['Content-Type' => 'application/merge-patch+json'],
|
||||
'json' => ['site' => self::iri('sites', $siteB->getId())],
|
||||
]);
|
||||
|
||||
$this->assertResponseStatusCodeSame(422);
|
||||
$this->assertJsonContains([
|
||||
'violations' => [
|
||||
['message' => 'Une machine avec ce nom existe déjà sur ce site.'],
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function testGetStructureEndpoint(): void
|
||||
{
|
||||
$machine = $this->createMachine('Machine structure');
|
||||
|
||||
Reference in New Issue
Block a user