---
name: project_php_e2e_rollback_test
description: Tester une page PHP bout-en-bout sur la vraie base sans rien écrire — transaction + rollback dans register_shutdown_function
metadata:
  type: project
---

Le repo n'a **aucun framework de test PHP** (seulement `kea-sync-from-db/test_kea_sync.py` et
`public/assets/js/subnet-bargraph.test.html`). Pour valider une page qui écrit en base
(`subnet_copy.php`, `subnet_import.php`, `reservation_bulk.php`…) **sans polluer la base du lab**,
harnais CLI qui exécute le vrai fichier :

1. `require lib/init.php` puis `Database::get()->beginTransaction()`.
2. Neutraliser le sync (aucun appel réseau sortant vers le lab) :
   `Settings::set('freebsd_mode','1')` + `Settings::set('sync_server_url','http://127.0.0.1:1/sync')`.
   → `SyncService` renvoie juste `success=false`, message « Impossible de joindre sync_server ».
3. Session simulée : `$_SESSION['user_id']`, `['username']`, `['role']` **et `['logged_in']=true`**
   (`Auth::isLoggedIn()` teste `logged_in`, pas `user_id` — piège).
4. Remplir `$_POST` / `$_SERVER['REQUEST_METHOD']` comme le ferait le formulaire.
5. `register_shutdown_function(...)` qui inspecte le résultat (`$_SESSION['flash']`, lignes créées)
   **puis `rollBack()`** — la page finit par `exit`, et `exit` déclenche bien les shutdown functions.
   C'est le seul moyen d'observer l'après-coup d'une page qui redirige.
6. `include public/<page>.php`. Les `header()` en CLI ne font qu'un warning (filtrer
   `grep -v "Cannot modify header"`).

Un scénario par processus (la page fait `exit`) — paramétrer par `$argv[1]`.
On peut aussi modifier la config d'un subnet dans la transaction (ex. donner un
`short_lease_pool_start` temporaire à une cible qui n'en a pas) : annulé par le rollback.

**Vérifier le rollback après coup** en SQL : contrôler une valeur qu'on a modifiée
(`sync_server_url` est un bon témoin). L'auto_increment de `hosts` reste consommé — normal.

**Why:** valider un correctif sur le vrai chemin de code (pas une réimplémentation de la logique
dans le test) sans écrire dans la base du lab ni déclencher de synchro Kea. Voir
[[feedback_dev_machine_is_not_lab]], [[reference_test_db]] et [[project_copie_reservations]].
