Files
Starseed/tests/Module/FieldSales/FieldSalesModuleTest.php
T
Matthieu be9204eca7
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m26s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Failing after 13s
feat(field_sales) : fondations du module Tournées + VisitableInterface + RBAC (ERP-123)
- Module FieldSales (ID field_sales, REQUIRED false) avec 2 permissions
  field_sales.tours.view / .manage (scope V0.2, pas de reports.*), active
  dans config/modules.php.
- Contrat partage VisitableInterface (getId/getDisplayName/getVisitableType)
  implemente par Client (client) et Supplier (supplier) sans import inter-module.
  Note doctrine.yaml : contrat polymorphe (2 implementations) donc resolu par
  service via (tier_type, tier_id), pas via resolve_target_entities.
- 3 miroirs RBAC alignes : sidebar.php (section Tournées, item /tours, i18n
  sidebar.field_sales.*), personas.ts et SeedE2ECommand.php (user-full) ;
  matrice metier RbacSeeder (Commerciale = view+manage, Bureau = view, Compta
  exclue, Admin bypass).
2026-06-11 14:51:52 +02:00

49 lines
1.6 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Tests\Module\FieldSales;
use App\Module\FieldSales\FieldSalesModule;
use PHPUnit\Framework\TestCase;
/**
* Tests structurels du module FieldSales (M6) : identite du module et contrat
* `permissions()`. Fige le set de permissions du scope V0.2 (tournees seules,
* plus aucune permission `reports.*`).
*
* @internal
*/
final class FieldSalesModuleTest extends TestCase
{
public function testModuleIdentity(): void
{
self::assertSame('field_sales', FieldSalesModule::ID);
self::assertSame('Tournées', FieldSalesModule::LABEL);
self::assertFalse(FieldSalesModule::REQUIRED);
}
public function testPermissionsSetContainsExactlyTwoCodes(): void
{
// Garde-fou : si quelqu'un ajoute/retire une permission sans ajuster les
// tests ou la doc, ce test casse explicitement. Le scope V0.2 est limite
// aux tournees (view + manage) : aucune permission `reports.*`.
$codes = array_column(FieldSalesModule::permissions(), 'code');
sort($codes);
self::assertSame(
['field_sales.tours.manage', 'field_sales.tours.view'],
$codes,
);
}
public function testEveryPermissionCodeIsPrefixedByModuleId(): void
{
// Invariant verifie aussi par app:sync-permissions : chaque code doit
// etre prefixe par "<ID>." (sinon la commande de sync echoue).
foreach (FieldSalesModule::permissions() as $permission) {
self::assertStringStartsWith(FieldSalesModule::ID.'.', $permission['code']);
}
}
}