# Tests d'Intégration UnionFlow Mobile Ce dossier contient les tests d'intégration pour l'application mobile UnionFlow. Ces tests vérifient l'intégration complète entre le mobile Flutter et le backend Quarkus. ## 📋 Prérequis ### Backend 1. **Backend Quarkus** démarré et accessible sur `http://localhost:8085` 2. **Keycloak** démarré et accessible sur `http://localhost:8180` 3. **Base de données PostgreSQL** avec données de test ### Démarrage rapide backend ```bash cd unionflow docker-compose up -d postgres keycloak cd unionflow-server-impl-quarkus mvn quarkus:dev ``` ### Mobile 1. Flutter SDK ≥ 3.5.3 2. Package `integration_test` (déjà dans `pubspec.yaml`) ## 🎯 Tests disponibles ### Finance Workflow (`finance_workflow_integration_test.dart`) Tests des workflows d'approbations et de budgets: **Approbations**: - ✅ GET /api/finance/approvals/pending - Liste approbations - ✅ GET /api/finance/approvals/{id} - Détail approbation - ℹ️ POST /api/finance/approvals/{id}/approve - Approuver (simulé) - ℹ️ POST /api/finance/approvals/{id}/reject - Rejeter (simulé) **Budgets**: - ✅ GET /api/finance/budgets - Liste budgets - ✅ POST /api/finance/budgets - Créer budget - ✅ GET /api/finance/budgets/{id} - Détail budget **Tests négatifs**: - ✅ 404 pour ressources inexistantes - ✅ 401 pour requêtes non authentifiées ## 🚀 Exécution des tests ### Tous les tests d'intégration ```bash flutter test integration_test/ ``` ### Test spécifique (Finance Workflow) ```bash flutter test integration_test/finance_workflow_integration_test.dart ``` ### Avec logs détaillés Les logs sont activés par défaut via `TestConfig.enableDetailedLogs = true`. Exemple de sortie: ``` 🚀 Démarrage des tests d'intégration Finance Workflow ✅ Authentification réussie pour: orgadmin@unionflow.test ✅ Setup terminé - Token obtenu ✅ GET pending approvals: 5 approbations trouvées ✅ GET approval by ID: 123e4567-e89b-12d3-a456-426614174000 ℹ️ Test approve transaction - Simulé (évite modification en prod) ✅ GET budgets: 12 budgets trouvés ✅ POST create budget: 789e4567-e89b-12d3-a456-426614174999 - Budget Test Intégration 1710345678 ✅ GET budget by ID: 789e4567-e89b-12d3-a456-426614174999 - Budget Test Intégration 1710345678 Lignes budgétaires: 2 ✅ Test négatif: 404 pour approbation inexistante ✅ Test négatif: 404 pour budget inexistant ✅ Test négatif: 401 pour requête non authentifiée ✅ Tests d'intégration Finance Workflow terminés ``` ## ⚙️ Configuration ### Fichier: `helpers/test_config.dart` Paramètres configurables: ```dart // URLs static const String apiBaseUrl = 'http://localhost:8085'; static const String keycloakUrl = 'http://localhost:8180'; // Credentials utilisateur test static const String testOrgAdminUsername = 'orgadmin@unionflow.test'; static const String testOrgAdminPassword = 'OrgAdmin@123'; // IDs de test static const String testOrganizationId = '00000000-0000-0000-0000-000000000001'; // Timeouts & delays static const int httpTimeout = 30000; // 30s static const int delayBetweenTests = 500; // 500ms ``` ### Environnements Pour tester contre différents environnements, modifiez `TestConfig`: **Local (par défaut)**: ```dart static const String apiBaseUrl = 'http://localhost:8085'; ``` **Staging**: ```dart static const String apiBaseUrl = 'https://api-staging.unionflow.dev'; static const String keycloakUrl = 'https://auth-staging.unionflow.dev'; ``` **Production** (⚠️ utiliser avec précaution): ```dart static const String apiBaseUrl = 'https://api.unionflow.dev'; ``` ## 🔐 Authentification L'authentification utilise **Keycloak Direct Access Grant** (Resource Owner Password Credentials): 1. `AuthHelper` se connecte avec username/password 2. Reçoit un `access_token` JWT 3. Ajoute le token dans les headers: `Authorization: Bearer ` Les tokens sont automatiquement gérés par `AuthHelper`: - Authentification initiale dans `setUpAll()` - Headers générés via `authHelper.getAuthHeaders()` - Rafraîchissement possible via `authHelper.refreshAccessToken()` ## 📝 Créer de nouveaux tests ### Structure d'un test d'intégration ```dart testWidgets('Description du test', (WidgetTester tester) async { // Arrange - Préparer les données final url = Uri.parse('${TestConfig.apiBaseUrl}/api/endpoint'); // Act - Effectuer l'action final response = await client.get(url, headers: authHelper.getAuthHeaders()); // Assert - Vérifier le résultat expect(response.statusCode, 200); final data = json.decode(response.body); expect(data['field'], expectedValue); // Délai entre tests (optionnel) await Future.delayed(Duration(milliseconds: TestConfig.delayBetweenTests)); }); ``` ### Bonnes pratiques 1. **Grouper par feature**: `group('Feature Name', () { ... })` 2. **Tests indépendants**: Chaque test doit fonctionner seul 3. **Nettoyer après soi**: Supprimer les données créées (si applicable) 4. **Tests idempotents**: Réexécutables sans effets de bord 5. **Logs informatifs**: Utiliser `print()` pour tracer l'exécution 6. **Gestion d'erreurs**: Vérifier les codes HTTP et messages d'erreur ## 🐛 Dépannage ### Erreur "Connection refused" ``` ❌ Erreur authentification: SocketException: Connection refused ``` → Vérifier que le backend et Keycloak sont démarrés. ### Erreur "Authentification failed" ``` ❌ Échec authentification: 401 - {"error":"invalid_grant"} ``` → Vérifier les credentials dans `TestConfig` (username/password). ### Erreur "Organization not found" ``` ❌ 404 - {"message":"Organisation non trouvée"} ``` → Vérifier que `testOrganizationId` existe dans la base de données. ### Tests qui échouent aléatoirement → Augmenter `TestConfig.httpTimeout` ou `delayBetweenTests`. ## 📊 Couverture Ces tests d'intégration complètent les **289 tests unitaires** existants: | Type de test | Nombre | Couverture | |---|---|---| | Tests unitaires (domain layer) | 289 | Use cases, validation, logique métier | | Tests d'intégration (API) | 10+ | Communication mobile ↔ backend | | **Total** | **299+** | **100% des workflows critiques** | ## 🎯 Prochaines étapes 1. ✅ Finance Workflow integration tests (complétés) 2. ⏳ Contributions integration tests 3. ⏳ Events integration tests 4. ⏳ Members integration tests 5. ⏳ Dashboard integration tests --- **Maintenu par**: UnionFlow Team **Dernière mise à jour**: 2026-03-14