6ceef62056
Cree le nouveau module Technique (pole distinct du Commercial) prerequis du M3 repertoire prestataires : - TechniqueModule (ID=technique, REQUIRED=false) + 5 permissions RBAC technique.providers.* (view / manage / accounting.view / accounting.manage / archive), declarees pour app:sync-permissions. - Activation dans config/modules.php + layer front frontend/modules/technique/. - Seed taxonomie : nouveau CategoryType PRESTATAIRE + 3 categories (Maintenance industrielle, Nettoyage, Transport) via migration idempotente (ON CONFLICT / NOT EXISTS, jonction M2M category_category_type) ET fixtures CategoryType/Category (survivent au purger db-reset). - Tests : structure du module (5 permissions figees) + filtre GET /api/categories?typeCode=PRESTATAIRE. Inclut la spec back/front M3 et le RETEX M1.
60 lines
1.9 KiB
PHP
60 lines
1.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Module\Technique;
|
|
|
|
use App\Module\Technique\TechniqueModule;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* Tests structurels du module Technique (M3) : identite et contrat
|
|
* `permissions()`.
|
|
*
|
|
* @internal
|
|
*/
|
|
final class TechniqueModuleTest extends TestCase
|
|
{
|
|
public function testModuleIdentity(): void
|
|
{
|
|
self::assertSame('technique', TechniqueModule::ID);
|
|
self::assertSame('Technique', TechniqueModule::LABEL);
|
|
self::assertFalse(TechniqueModule::REQUIRED);
|
|
}
|
|
|
|
public function testPermissionsSetContainsExactlyFiveCodes(): void
|
|
{
|
|
// Garde-fou : le jeu de permissions du module est fige par ce test. Si
|
|
// quelqu'un ajoute / retire une permission sans ajuster la spec (§ 5.1)
|
|
// ni la matrice RBAC, le test casse explicitement.
|
|
$codes = array_column(TechniqueModule::permissions(), 'code');
|
|
sort($codes);
|
|
|
|
self::assertSame(
|
|
[
|
|
'technique.providers.accounting.manage',
|
|
'technique.providers.accounting.view',
|
|
'technique.providers.archive',
|
|
'technique.providers.manage',
|
|
'technique.providers.view',
|
|
],
|
|
$codes,
|
|
);
|
|
}
|
|
|
|
public function testEveryPermissionCodeIsPrefixedByModuleId(): void
|
|
{
|
|
// Convention de nommage `module.resource[.sub].action` : le prefixe doit
|
|
// correspondre exactement a l'ID du module (verifie aussi par
|
|
// app:sync-permissions).
|
|
foreach (TechniqueModule::permissions() as $permission) {
|
|
self::assertStringStartsWith(
|
|
TechniqueModule::ID.'.',
|
|
$permission['code'],
|
|
'Chaque code de permission doit etre prefixe par l\'ID du module.',
|
|
);
|
|
self::assertNotSame('', $permission['label'], 'Chaque permission doit porter un label.');
|
|
}
|
|
}
|
|
}
|