Commit 92332f21 authored by Johnny Leveneur's avatar Johnny Leveneur
Browse files

ajustement scan évènement

parent 4b53317a
Loading
Loading
Loading
Loading
+1 −0
Changes for .gitignore: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@ deploy/
vendor/
.idea
composer.lock
.phpunit.cache/
.DS_Store
node_modules/
!public/*
+11 −1
Changes for composer.json: 11 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@
        "phpunit/phpunit": "^11.5"
    },
    "scripts": {
        "test": "phpunit",
        "test:scan": "phpunit --group=scan",
        "post-install-cmd": [
            "cp -r vendor/unicaen/app/public/unicaen public/",
            "mkdir public/css",
@@ -83,7 +85,15 @@
    },
    "autoload-dev": {
        "psr-4": {
            "ApplicationTest\\": "module/Application/test"
            "ApplicationTest\\": "tests/",
            "Atelier\\": "module/Atelier/src/",
            "Etudiant\\": "module/Etudiant/src/",
            "Evenementiel\\": "module/Evenementiel/src/",
            "Fichier\\": "module/Fichier/src/",
            "Personnel\\": "module/Personnel/src/",
            "Qr\\": "module/Qr/src/",
            "Site\\": "module/Site/src/",
            "UnicaenEtat\\": "vendor/unicaen/etat/src/UnicaenEtat/"
        }
    },
    "config": {

docs/tests.md

0 → 100644
+42 −0
Changes for docs/tests.md: 42 added lines, 0 removed lines.
Original line number Diff line number Diff line
# Tests automatisés

## Environnement

Les tests doivent être lancés dans le service Docker Compose `inscription_suac`, défini dans `docker-compose.yml`. Son `Dockerfile` utilise PHP 8.2 et le dépôt est monté dans `/var/www/html`. Il s'agit du conteneur applicatif existant ; aucun conteneur de test supplémentaire n'est nécessaire. Le service doit être démarré.

PHPUnit 11 (`phpunit/phpunit: ^11.5`) est déjà déclaré comme dépendance de développement et installé dans ce conteneur. PHPUnit requiert PHP 8.2 ou supérieur et les extensions `dom`, `json`, `libxml`, `mbstring`, `xml`, `xmlwriter` et `tokenizer` ; les dépendances de la version verrouillée ont été vérifiées dans le conteneur avec `composer check-platform-reqs --lock`.

Si les dépendances doivent être installées, exécuter Composer dans ce service PHP, et non avec le PHP de la machine hôte.

## Exécution

Depuis la racine du dépôt sur la machine hôte, lancer toute la suite :

```sh
docker compose exec -T --user "$(id -u):$(id -g)" -e XDEBUG_MODE=off inscription_suac composer test
```

Lancer uniquement les tests du scan :

```sh
docker compose exec -T --user "$(id -u):$(id -g)" -e XDEBUG_MODE=off inscription_suac composer test:scan
```

Les options `--user` et `XDEBUG_MODE=off` évitent de lancer les commandes Composer en root et de produire les avertissements de journal Xdebug. Pour vérifier les dépendances dans le conteneur :

```sh
docker compose exec -T --user "$(id -u):$(id -g)" -e XDEBUG_MODE=off inscription_suac composer check-platform-reqs --lock
```

La configuration PHPUnit est dans `phpunit.xml.dist`. Son bootstrap charge uniquement `vendor/autoload.php` et définit `APPLICATION_ENV=testing` ; il ne démarre pas l’application Laminas et ne charge aucune configuration de base de données. Les tests unitaires mockent les services qui pourraient accéder à la base ; aucune opération de base de données n'est effectuée. Les tests du scan sont identifiés par le groupe PHPUnit `scan`.

## Organisation

- `tests/Unit/Scan/ScanControllerTest.php` couvre les dates calendaires, les dates nulles, les QR d’un autre événement, le message de refus et l’enregistrement effectif des pointages.
- `tests/Unit/Scan/ScanTabsViewTest.php` vérifie la visibilité des deux onglets avant, pendant et après l’événement, ainsi que le contrôle de privilège.
- `tests/` est chargé sous le namespace `ApplicationTest\` par `autoload-dev` dans `composer.json`. Les namespaces des modules applicatifs sont également déclarés dans cet autoload de développement pour permettre des tests sans démarrer le module manager.
- `composer test` exécute tous les tests ; `composer test:scan` filtre le groupe `scan`.

## Ajouter un test

Créer un fichier se terminant par `Test.php` sous `tests/Unit/` et une classe qui étend `PHPUnit\Framework\TestCase`. Utiliser des dates fixes, préférer les mocks pour isoler les services et ne pas initialiser le bootstrap web ou la connexion à la base pour un test unitaire. Ajouter `#[PHPUnit\Framework\Attributes\Group('scan')]` aux nouveaux tests liés au scan pour les inclure dans `composer test:scan`. Exécuter ensuite `composer test` ou `composer test:scan`.
+2 −7
Changes for module/Evenementiel/view/evenementiel/evenement/afficher.phtml: 2 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -27,11 +27,6 @@ $canAfficher = $this->isAllowed(EvenementPrivileges::getResourceId(EvenementPriv
$canGererEtat = (!$estAnnulee and $this->isAllowed(EvenementPrivileges::getResourceId(EvenementPrivileges::EVENEMENT_GERER_ETAT)));

$canModifierInscription = $this->isAllowed(EvenementielinscriptionPrivileges::getResourceId(EvenementielinscriptionPrivileges::MODIFIER));
$today = (new \DateTimeImmutable('today'))->format('Y-m-d');
$scanDisponible = $evenement->getJourDebut() !== null
    && $evenement->getJourFin() !== null
    && $today >= $evenement->getJourDebut()->format('Y-m-d')
    && $today <= $evenement->getJourFin()->format('Y-m-d');

?>

@@ -68,7 +63,7 @@ $scanDisponible = $evenement->getJourDebut() !== null
        Inscription et listes
    </button>

    <?php if ($canModifierInscription && $scanDisponible): ?>
    <?php if ($canModifierInscription): ?>
        <button class="nav-link" id="scan-tab"
                data-bs-toggle="tab" data-bs-target="#scan"
                type="button" role="tab" aria-controls="scan" aria-selected="false">
@@ -107,7 +102,7 @@ $scanDisponible = $evenement->getJourDebut() !== null
        <?php echo $this->partial('partial/inscription', ['evenement' => $evenement], [], null); ?>
    </div>

    <?php if ($canModifierInscription && $scanDisponible): ?>
    <?php if ($canModifierInscription): ?>
        <div id="scan" class="tab-pane "
             role="tabpanel" aria-labelledby="scan-tab" tabindex="0">
            <?php echo $this->partial('partial/scan', [
+7 −2
Changes for module/Qr/src/Controller/ScanController.php: 7 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -25,6 +25,11 @@ class ScanController extends AbstractActionController
        ]);
    }

    protected function getToday(): \DateTimeImmutable
    {
        return new \DateTimeImmutable('today');
    }

    /**
     * POST /qr/callback
     * Reçoit le payload décodé côté navigateur et renvoie un JSON.
@@ -89,7 +94,7 @@ class ScanController extends AbstractActionController
            ]);
        }

        $today = (new \DateTimeImmutable('today'))->format('Y-m-d');
        $today = $this->getToday()->format('Y-m-d');
        $jourDebut = $evenement->getJourDebut()?->format('Y-m-d');
        $jourFin = $evenement->getJourFin()?->format('Y-m-d');

@@ -97,7 +102,7 @@ class ScanController extends AbstractActionController
            return new JsonModel([
                'ok' => false
                , 'status' => 'err'
                , 'error' => "Le scan est uniquement autorisé le jour de l’événement."
                , 'error' => "Le scan est uniquement autorisé pendant les jours de l’événement."
            ]);
        }

Loading