# Sécurité de la base de données pendant les tests

> Mise à jour : 17 juillet 2026

## Règle essentielle

`php artisan migrate` applique seulement les migrations manquantes à la base
configurée. Cette commande ne vide pas les tables.

En revanche, un test Laravel utilisant `RefreshDatabase` peut lancer
`migrate:fresh`. Cette opération supprime les tables de la base ciblée avant de
les recréer. La suite de tests ne doit donc jamais pointer vers `kview_investor`, une
base UAT ou une base de production.

## Protection mise en place

La suite PHPUnit force les valeurs suivantes dans `phpunit.xml` :

```text
APP_ENV=testing
DB_CONNECTION=pgsql
DB_DATABASE=kview_investor_testing
DB_URL=
```

Deux verrous complémentaires protègent les données :

1. `tests/bootstrap.php` vérifie ces variables avant de charger un seul test ;
2. `tests/TestCase.php` vérifie la configuration réellement résolue par
   Laravel avant l'exécution de `RefreshDatabase`.

Les tests sont refusés si l'environnement n'est pas `testing`, si le moteur
n'est pas PostgreSQL ou si le nom de la base ne se termine pas par `_test` ou
`_testing`. Le verrou vérifie aussi un éventuel `DB_URL`.

Une configuration en cache incorrecte provoque donc un arrêt explicite, jamais
un repli silencieux vers la base applicative.

## Préparation sur une nouvelle machine

Après avoir créé la base locale `kview_investor`, créer une deuxième base vide avec
un rôle PostgreSQL autorisé à créer des bases :

```sql
CREATE DATABASE kview_investor_testing OWNER kview_investor_user;
```

Exemple macOS si le rôle système possède les droits :

```bash
createdb --owner=kview_investor_user kview_investor_testing
```

Les identifiants, l'hôte et le port restent ceux du fichier `.env`. Seul le nom
de la base est remplacé par PHPUnit. Si la base dédiée n'existe pas ou si
`kview_investor_user` n'y a pas accès, les tests échouent sans toucher à `kview_investor`.

Si Laravel signale une configuration mise en cache, exécuter :

```bash
php artisan config:clear
```

Puis lancer normalement :

```bash
php artisan test
```

## Commandes à distinguer

| Commande | Effet |
| --- | --- |
| `git pull` | Met à jour les fichiers ; ne modifie pas directement la base. |
| `php artisan migrate` | Applique les migrations manquantes et conserve les données, sous réserve que chaque migration soit correctement écrite. |
| `php artisan migrate:status` | Affiche l'état des migrations sans modifier la base. |
| `php artisan test` | Utilise exclusivement `kview_investor_testing`, qui peut être recréée par les tests. |
| `php artisan migrate:fresh` | Supprime toutes les tables de la base ciblée ; ne jamais l'exécuter sur une base contenant des données à conserver. |

## Limite importante

Cette protection empêche la suite PHPUnit d'effacer la mauvaise base. Elle ne
peut pas protéger une personne qui lance manuellement `migrate:fresh`,
`db:wipe` ou une commande SQL destructive avec les bons accès. Les sauvegardes
restent indispensables dès que kView INVESTOR héberge des données réelles.
