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
- Backend Quarkus démarré et accessible sur
http://localhost:8085 - Keycloak démarré et accessible sur
http://localhost:8180 - Base de données PostgreSQL avec données de test
Démarrage rapide backend
cd unionflow
docker-compose up -d postgres keycloak
cd unionflow-server-impl-quarkus
mvn quarkus:dev
Mobile
- Flutter SDK ≥ 3.5.3
- Package
integration_test(déjà danspubspec.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
flutter test integration_test/
Test spécifique (Finance Workflow)
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:
// 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):
static const String apiBaseUrl = 'http://localhost:8085';
Staging:
static const String apiBaseUrl = 'https://api-staging.unionflow.dev';
static const String keycloakUrl = 'https://auth-staging.unionflow.dev';
Production (⚠️ utiliser avec précaution):
static const String apiBaseUrl = 'https://api.unionflow.dev';
🔐 Authentification
L'authentification utilise Keycloak Direct Access Grant (Resource Owner Password Credentials):
AuthHelperse connecte avec username/password- Reçoit un
access_tokenJWT - Ajoute le token dans les headers:
Authorization: Bearer <token>
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
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
- Grouper par feature:
group('Feature Name', () { ... }) - Tests indépendants: Chaque test doit fonctionner seul
- Nettoyer après soi: Supprimer les données créées (si applicable)
- Tests idempotents: Réexécutables sans effets de bord
- Logs informatifs: Utiliser
print()pour tracer l'exécution - 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
- ✅ Finance Workflow integration tests (complétés)
- ⏳ Contributions integration tests
- ⏳ Events integration tests
- ⏳ Members integration tests
- ⏳ Dashboard integration tests
Maintenu par: UnionFlow Team Dernière mise à jour: 2026-03-14