# Tests HTTP du module Posts

Ce dossier contient le script PowerShell qui teste réellement les routes du `PostController` contre une instance Laravel en cours d’exécution.

Le script ne remplace pas Laravel par des mocks : il se connecte avec plusieurs comptes, envoie de vraies requêtes HTTP, utilise la base de données configurée par le backend et vérifie les réponses de l’API.

## Fichiers nécessaires

```text
database/seeders/PostApiTestSeeder.php
scripts/api-tests/post-api-smoke.ps1
scripts/api-tests/README.md
```

## Important

Exécuter ces tests uniquement sur une base locale, de développement ou de recette dédiée.

Ne jamais lancer le seeder ou le script sur une base de production. Le script crée, modifie, publie, rejette, suggère et supprime des publications de test.

---

## 1. Se placer dans le backend

Depuis PowerShell :

```powershell
cd C:\Users\Moboladji.AGBANNONDE\Desktop\Work\VIPP\AMC_new\amc-backend-v2
```

Vérifier le dossier courant :

```powershell
Get-Location
```

## 2. Vérifier les fichiers

```powershell
Test-Path .\database\seeders\PostApiTestSeeder.php
Test-Path .\scripts\api-tests\post-api-smoke.ps1
```

Résultat attendu :

```text
True
True
```

Vérifier la syntaxe du seeder :

```powershell
php -l .\database\seeders\PostApiTestSeeder.php
```

## 3. Préparer les données de test

Le seeder crée les entreprises, la configuration de validation et les comptes nécessaires.

```powershell
php artisan db:seed --class=PostApiTestSeeder
```

Comptes utilisés :

| Rôle | Email |
|---|---|
| Ambassadeur | `ambassadeur.api@amc.test` |
| Référent | `referent.api@amc.test` |
| Consultant | `consultant.api@amc.test` |
| Admin | `admin.api@amc.test` |
| Super-admin | `superadmin.api@amc.test` |
| Ambassadeur autre entreprise | `ambassadeur.autre.api@amc.test` |
| Ambassadeur sans validation référent | `ambassadeur.direct.api@amc.test` |

Mot de passe commun :

```text
PostApiTest123!
```

Le seeder est répétable. Avant chaque nouvelle campagne de test, il supprime les publications précédentes dont le contenu commence par `[API-TEST]`.

## 4. Démarrer Laravel

Dans un premier terminal PowerShell :

```powershell
cd C:\Users\Moboladji.AGBANNONDE\Desktop\Work\VIPP\AMC_new\amc-backend-v2

$env:MAIL_MAILER = "log"
$env:QUEUE_CONNECTION = "sync"

php artisan optimize:clear
php artisan serve --host=127.0.0.1 --port=8000
```

Conserver ce terminal ouvert pendant toute l’exécution.

Les emails sont écrits dans `storage/logs` au lieu d’être envoyés réellement.

## 5. Vérifier que l’API répond

Dans un deuxième terminal :

```powershell
Test-NetConnection 127.0.0.1 -Port 8000
```

Résultat attendu :

```text
TcpTestSucceeded : True
```

## 6. Régler l’encodage du terminal

Cette étape évite les textes du type `rÃ©fÃ©rent` dans PowerShell.

```powershell
chcp 65001
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
$OutputEncoding = [Console]::OutputEncoding
```

## 7. Lancer les tests

Depuis la racine du backend :

```powershell
& ".\scripts\api-tests\post-api-smoke.ps1" `
    -BaseUrl "http://127.0.0.1:8000/api"
```

Si PowerShell bloque l’exécution du fichier :

```powershell
powershell.exe `
    -NoProfile `
    -ExecutionPolicy Bypass `
    -File ".\scripts\api-tests\post-api-smoke.ps1" `
    -BaseUrl "http://127.0.0.1:8000/api"
```

Le script accepte aussi un mot de passe personnalisé :

```powershell
& ".\scripts\api-tests\post-api-smoke.ps1" `
    -BaseUrl "http://127.0.0.1:8000/api" `
    -Password "PostApiTest123!"
```

## 8. Résultat attendu

Le contrôleur est considéré comme validé lorsque le script se termine avec :

```text
=== Résultat ===
Réussis : 84
Échecs  : 0
```

Le processus retourne aussi le code de sortie `0`.

Pour vérifier le code de sortie juste après l’exécution :

```powershell
$LASTEXITCODE
```

Résultat attendu :

```text
0
```

Si au moins un test échoue, le script retourne le code `1`.

## Couverture du script

Le script teste notamment :

- `GET /api/posts` sans authentification ;
- la connexion de tous les rôles ;
- la validation `422` lors d’une création invalide ;
- `GET /api/posts/validation-config` avec validation activée ;
- `GET /api/posts/validation-config` avec validation désactivée ;
- la création en `pending` lorsque la validation est obligatoire ;
- la création directe en `approved` lorsque la validation est désactivée ;
- la création d’un véritable brouillon avec `intent: draft` ;
- le refus de programmer un brouillon par une modification classique ;
- la soumission d’un brouillon vers `pending` ;
- la soumission d’un brouillon vers `approved` ;
- la soumission d’un brouillon avec date vers `scheduled` ;
- la nouvelle soumission d’un post `rejected` ;
- `POST /api/posts` ;
- `GET /api/posts/{id}` ;
- `PUT /api/posts/{id}` ;
- `PATCH /api/posts/{id}` ;
- `PUT /api/posts/update/{id}` ;
- `GET /api/posts?status=pending` ;
- `GET /api/posts/my` ;
- `GET /api/posts/company` avec et sans pagination ;
- `GET /api/posts/stats` ;
- l’approbation par un référent ;
- le refus d’approbation par un ambassadeur ;
- la publication par le propriétaire ambassadeur ;
- l’interdiction de modifier ou supprimer un post publié ;
- le rejet avec motif obligatoire ;
- la suppression d’un post non publié ;
- l’approbation d’un post programmé ;
- la suggestion consultant vers ambassadeur ;
- la conservation de `suggested_by_user_id` ;
- l’isolation entre entreprises ;
- la visibilité admin et super-admin ;
- le `404` sur un UUID inexistant.

## Données laissées après le test

La majorité des publications temporaires est supprimée par le script.

Le post principal publié peut rester dans la base, car le test vérifie volontairement qu’un post publié ne peut plus être supprimé.

Avant une nouvelle exécution complète, relancer :

```powershell
php artisan db:seed --class=PostApiTestSeeder
```

## Consulter les logs Laravel

```powershell
Get-Content .\storage\logs\laravel.log -Tail 200
```

Pour rechercher les erreurs :

```powershell
Select-String `
    -Path .\storage\logs\laravel*.log `
    -Pattern 'ERROR','CRITICAL','EMERGENCY','Exception'
```

Aucune erreur métier inattendue ne doit apparaître pendant une exécution réussie.

## Dépannage

### Le script est introuvable

```powershell
Test-Path .\scripts\api-tests\post-api-smoke.ps1
```

Le résultat doit être `True`.

### Le serveur ne répond pas

```powershell
Test-NetConnection 127.0.0.1 -Port 8000
```

Relancer Laravel si `TcpTestSucceeded` vaut `False`.

### Une connexion échoue

Relancer le seeder :

```powershell
php artisan db:seed --class=PostApiTestSeeder
```

### Le script retourne des caractères illisibles

Exécuter les commandes UTF-8 de la section 6 avant de relancer le script.

### Le script retourne des échecs

Lire chaque ligne `[FAIL]`, puis consulter les logs Laravel :

```powershell
Get-Content .\storage\logs\laravel.log -Tail 300
```

Ne pas considérer le module comme validé tant que le résultat final n’est pas :

```text
Échecs : 0
```

## Nettoyage manuel des logs de test

Après une campagne locale :

```powershell
Remove-Item .\storage\logs\laravel*.log -Force -ErrorAction SilentlyContinue
```

Laravel recréera automatiquement les fichiers nécessaires au prochain démarrage.
