# Tests Locaux - CRUD Crew Members ## ✅ Migration exécutée La migration `create_crew_members_table` a été exécutée avec succès. ## 🧪 Tests rapides ### Option 1: Script PowerShell (Windows) ```powershell cd D:\dev\parcapp\api .\test-crew-members-local.ps1 ``` ### Option 2: Script Bash (Git Bash / WSL) ```bash cd D:\dev\parcapp\api chmod +x test-crew-members-local.sh ./test-crew-members-local.sh ``` ### Option 3: Tests manuels avec curl **1. Login pour obtenir le token :** ```bash curl -X POST "http://apiparcapp.test/api/login" \ -H "Content-Type: application/json" \ -d '{"email":"admin@parcapp.test","password":"password123"}' ``` Copiez le `token` de la réponse. **2. GET liste (vide au début) :** ```bash curl -X GET "http://apiparcapp.test/api/crew-members" \ -H "Authorization: Bearer VOTRE_TOKEN" \ -H "Accept: application/json" ``` **3. POST création :** ```bash curl -X POST "http://apiparcapp.test/api/crew-members" \ -H "Authorization: Bearer VOTRE_TOKEN" \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -d '{ "nom": "Ouédraogo", "prenom": "Amadou", "role": "chauffeur", "telephone": "+226 70 12 34 56" }' ``` **4. GET show (remplacer {id} par l'ID créé) :** ```bash curl -X GET "http://apiparcapp.test/api/crew-members/1" \ -H "Authorization: Bearer VOTRE_TOKEN" \ -H "Accept: application/json" ``` **5. PATCH update :** ```bash curl -X PATCH "http://apiparcapp.test/api/crew-members/1" \ -H "Authorization: Bearer VOTRE_TOKEN" \ -H "Content-Type: application/json" \ -d '{"telephone":"+226 70 99 88 77"}' ``` **6. POST upload photo (nécessite un fichier image) :** ```bash curl -X POST "http://apiparcapp.test/api/upload/crew-member-photo" \ -H "Authorization: Bearer VOTRE_TOKEN" \ -F "photo=@chemin/vers/votre/image.jpg" ``` **7. DELETE :** ```bash curl -X DELETE "http://apiparcapp.test/api/crew-members/1" \ -H "Authorization: Bearer VOTRE_TOKEN" ``` ## ✅ Checklist de validation - [ ] Migration exécutée sans erreur - [ ] Routes accessibles (`php artisan route:list | grep crew`) - [ ] GET liste retourne un array (vide ou avec données) - [ ] POST création retourne un objet avec status 201 - [ ] GET show retourne un objet - [ ] PATCH update fonctionne (mise à jour partielle) - [ ] DELETE retourne status 204 - [ ] Upload photo fonctionne et retourne une URL absolue - [ ] Tous les champs sont en camelCase dans les réponses - [ ] `photoUrl` est une URL absolue (si présente) - [ ] `createdAt` et `updatedAt` sont en ISO 8601 ## 🔍 Vérifications supplémentaires ### Vérifier la table en base ```bash php artisan tinker ``` Puis dans tinker : ```php \App\Models\CrewMember::count(); \App\Models\CrewMember::first(); ``` ### Vérifier les routes ```bash php artisan route:list | grep crew-members ``` Vous devriez voir : - `GET|HEAD api/crew-members ................... crew-members.index` - `POST api/crew-members ................... crew-members.store` - `GET|HEAD api/crew-members/{crewMember} ....... crew-members.show` - `PUT|PATCH api/crew-members/{crewMember} ....... crew-members.update` - `DELETE api/crew-members/{crewMember} ....... crew-members.destroy` - `POST api/upload/crew-member-photo` ### Tester les scopes ```bash # Recherche curl -X GET "http://apiparcapp.test/api/crew-members?search=Amadou" \ -H "Authorization: Bearer VOTRE_TOKEN" # Filtre par rôle curl -X GET "http://apiparcapp.test/api/crew-members?role=chauffeur" \ -H "Authorization: Bearer VOTRE_TOKEN" ``` ## ⚠️ Erreurs courantes ### 404 Not Found sur les routes - Vérifier que `php artisan route:clear` a été exécuté - Vérifier que les routes sont bien dans `routes/api.php` sous `auth:sanctum` ### 401 Unauthorized - Vérifier que le token est valide - Vérifier que le token est bien passé dans le header `Authorization: Bearer ...` ### 422 Validation Error - Vérifier que tous les champs requis sont présents - Vérifier que `role` est bien `chauffeur` ou `apprenti` - Vérifier que `photoUrl` commence par `http://`, `https://` ou `/storage/` ### Erreur de migration - Vérifier que la base de données est accessible - Vérifier que la table `users` existe (FK requise) ## 📝 Notes - Les réponses sont en **camelCase** (pas snake_case) - Les réponses sont des **objets/arrays bruts** (pas de wrapper `{data: ...}`) - Les URLs de photos sont **absolues** (via `MediaUrl::url()`) - Les dates sont en **ISO 8601** (`toISOString()`)