fix(tests) : fiabilise la suite PHPUnit contre la derive d'horloge (ERP-98) #47

Merged
malio merged 2 commits from fix/ERP-98-flaky-phpunit-clock into develop 2026-06-03 09:14:10 +00:00
Owner

Probleme (ERP-98)

Suite PHPUnit flaky ~1 run sur 2 -> hook pre-commit qui plante, recours au --no-verify sur des commits sains.

Cause racine

Une seule cause commune : l'horloge CLOCK_REALTIME du conteneur n'est pas monotone sous WSL2/Docker (saut arriere sous charge), alors que le code et les tests supposaient une horloge stable.

  • 401 « Invalid JWT Token » : lexik validait iat/nbf/exp avec clock_skew: 0 (LooseValidAt(.., PT0S) cote lcobucci). Un recul d'horloge apres /login_check rend le token « dans le futur » -> rejet.
  • Horodatages « meme seconde » (1780402904 > 1780402904) : colonnes TIMESTAMP(0) + sleep(1) reel. L'ecart floor-seconde n'est nul que si l'horloge recule.

Correctifs

Fichier Modif
config/packages/lexik_jwt_authentication.yaml clock_skew: 15 -> tolere la derive (benefice prod aussi)
TimestampableBlamableSubscriber injection ClockInterface (prod inchange via NativeClock)
CategoryTimestampableBlamableTest ClockSensitiveTrait + MockClock fige/avance, suppression des sleep(1)
TimestampableBlamableSubscriberTest MockClock injecte dans les 4 instanciations

Subtilite : mockTime() cree un MockClock en UTC ; les colonnes TIMESTAMP WITHOUT TIME ZONE round-trippent via le fuseau PHP (Europe/Paris) -> decalage 2h. Le mock est seede dans le fuseau par defaut (comme le NativeClock prod).

Verifications

  • make test : 464 tests verts, 0 echec / 0 erreur
  • Test timestamp cible : 5/5 deterministe (et plus rapide, sleeps reels supprimes)
  • make php-cs-fixer-allow-risky : 0 fichier a corriger
  • Deprecations/notices PHPUnit preexistantes (hors perimetre)

Pas de migration, pas de changement front, RBAC intact.

## Probleme (ERP-98) Suite PHPUnit flaky ~1 run sur 2 -> hook pre-commit qui plante, recours au `--no-verify` sur des commits sains. ## Cause racine Une seule cause commune : l'horloge `CLOCK_REALTIME` du conteneur n'est pas monotone sous WSL2/Docker (saut arriere sous charge), alors que le code et les tests supposaient une horloge stable. - **401 « Invalid JWT Token »** : lexik validait `iat`/`nbf`/`exp` avec `clock_skew: 0` (`LooseValidAt(.., PT0S)` cote lcobucci). Un recul d'horloge apres `/login_check` rend le token « dans le futur » -> rejet. - **Horodatages « meme seconde »** (`1780402904 > 1780402904`) : colonnes `TIMESTAMP(0)` + `sleep(1)` reel. L'ecart floor-seconde n'est nul que si l'horloge recule. ## Correctifs | Fichier | Modif | |---|---| | `config/packages/lexik_jwt_authentication.yaml` | `clock_skew: 15` -> tolere la derive (benefice prod aussi) | | `TimestampableBlamableSubscriber` | injection `ClockInterface` (prod inchange via NativeClock) | | `CategoryTimestampableBlamableTest` | `ClockSensitiveTrait` + MockClock fige/avance, suppression des `sleep(1)` | | `TimestampableBlamableSubscriberTest` | MockClock injecte dans les 4 instanciations | **Subtilite** : `mockTime()` cree un MockClock en UTC ; les colonnes `TIMESTAMP WITHOUT TIME ZONE` round-trippent via le fuseau PHP (Europe/Paris) -> decalage 2h. Le mock est seede dans le fuseau par defaut (comme le NativeClock prod). ## Verifications - `make test` : **464 tests verts**, 0 echec / 0 erreur - Test timestamp cible : **5/5 deterministe** (et plus rapide, sleeps reels supprimes) - `make php-cs-fixer-allow-risky` : 0 fichier a corriger - Deprecations/notices PHPUnit preexistantes (hors perimetre) Pas de migration, pas de changement front, RBAC intact.
matthieu added 1 commit 2026-06-02 15:35:33 +00:00
fix(tests) : fiabilise la suite PHPUnit contre la derive d'horloge (ERP-98)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Failing after 3m39s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m15s
dfd6e5251d
La suite echouait de facon intermittente (~1 run sur 2), faisant planter le
hook pre-commit. Cause racine unique : l'horloge CLOCK_REALTIME du conteneur
n'est pas monotone sous WSL2/Docker (saut arriere sous charge), alors que le
code et les tests supposaient une horloge stable.

- JWT « Invalid JWT Token » (401) : lexik validait iat/nbf/exp avec
  clock_skew=0 (LooseValidAt PT0S). Un recul d'horloge apres /login_check
  rendait le token « dans le futur ». Ajout de clock_skew: 15 (benefice prod
  aussi si les noeuds derivent).

- Horodatages « meme seconde » : colonnes TIMESTAMP(0) + sleep(1) reel.
  L'ecart floor-seconde n'etait nul que si l'horloge reculait. Le subscriber
  injecte desormais ClockInterface (comportement prod inchange via NativeClock)
  et les tests pilotent un MockClock fige/avance (ClockSensitiveTrait), sans
  sleep reel -> deterministe et plus rapide. Le mock est seede dans le fuseau
  PHP par defaut pour eviter le decalage UTC <-> Europe/Paris au round-trip
  des colonnes TIMESTAMP WITHOUT TIME ZONE.

make test : 464 tests verts ; test timestamp 5/5 deterministe.
matthieu added the backtype/fix labels 2026-06-02 15:35:56 +00:00
malio added 1 commit 2026-06-03 09:09:52 +00:00
Merge branch 'develop' into fix/ERP-98-flaky-phpunit-clock
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m46s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m9s
3baf2394e2
malio merged commit 9c311cb58b into develop 2026-06-03 09:14:10 +00:00
malio deleted branch fix/ERP-98-flaky-phpunit-clock 2026-06-03 09:14:11 +00:00
Sign in to join this conversation.