<?php

declare(strict_types=1);

namespace App\Tests\Module\Transport;

use App\Module\Transport\TransportModule;
use PHPUnit\Framework\TestCase;

/**
 * Tests structurels du module Transport (M4) : identite et contrat
 * `permissions()` (socle RBAC, ERP-153).
 *
 * @internal
 */
final class TransportModuleTest extends TestCase
{
    public function testModuleIdentity(): void
    {
        self::assertSame('transport', TransportModule::ID);
        self::assertSame('Transport', TransportModule::LABEL);
        self::assertFalse(TransportModule::REQUIRED);
    }

    public function testPermissionsSetContainsExactlyThreeCodes(): 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 (§ 5.2), le test casse explicitement.
        $codes = array_column(TransportModule::permissions(), 'code');
        sort($codes);

        self::assertSame(
            [
                'transport.carriers.archive',
                'transport.carriers.manage',
                'transport.carriers.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 (TransportModule::permissions() as $permission) {
            self::assertStringStartsWith(
                TransportModule::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.');
        }
    }
}
