# Finance Workflow - Tests

**Date:** 2026-03-14
**Status:** EN COURS

## Tests unitaires - Limitation JWT

### Problème identifié

Les services `ApprovalService` et `BudgetService` injectent directement `JsonWebToken` via `@Inject`, ce qui rend difficile les tests unitaires purs avec Mockito :

```java
@ApplicationScoped
public class ApprovalService {
    @Inject
    JsonWebToken jwt; // Injection directe, difficile à mocker

    public TransactionApprovalResponse approveTransaction(UUID approvalId, ApproveTransactionRequest request) {
        String userEmail = jwt.getClaim("email"); // Dépendance JWT
        UUID userId = UUID.fromString(jwt.getClaim("sub"));
        ...
    }
}
```

### Solutions possibles

**Option 1: Tests d'intégration avec @QuarkusTest** (RECOMMANDÉ)
```java
@QuarkusTest
@TestSecurity(user = "admin@test.com", roles = {"ORG_ADMIN"})
class ApprovalServiceIntegrationTest {
    @Inject
    ApprovalService service;

    @Test
    void testApprove() {
        // Tests with real JWT injection
    }
}
```

**Option 2: Refactoring pour dependency injection explicite**

Modifier les services pour accepter userId en paramètre :
```java
public TransactionApprovalResponse approveTransaction(
    UUID approvalId,
    ApproveTransactionRequest request,
    UUID userId,  // Explicit parameter
    String userEmail
) {
    // No JWT dependency
}
```

Puis les Resources extraient le JWT et passent les paramètres.

**Option 3: Tests via REST endpoints**

Tester les fonctionnalités via les endpoints REST avec RestAssured :
```java
given()
    .auth().oauth2(token)
    .contentType(ContentType.JSON)
    .body(request)
.when()
    .post("/api/finance/approvals/{id}/approve", approvalId)
.then()
    .statusCode(200);
```

### Décision actuelle

Pour l'instant, on procède avec :
1. **Tests de migration Flyway** - Vérifier que V6 s'exécute sans erreur
2. **Tests manuels via Swagger UI** - Vérifier que les endpoints fonctionnent
3. **Tests d'intégration REST** (P1) - À créer après validation initiale

Les tests unitaires purs des services seront ajoutés en P1 après refactoring si nécessaire.

## Tests à effectuer

### ✅ P0 - Production Blockers

- [ ] **Migration Flyway V6**
  - Exécuter `mvn quarkus:dev` et vérifier les logs Flyway
  - Vérifier que les 4 tables sont créées : transaction_approvals, approver_actions, budgets, budget_lines
  - Vérifier les contraintes CHECK, foreign keys, et indexes

- [ ] **Endpoints REST - Swagger UI**
  - Démarrer Quarkus dev: `mvn quarkus:dev`
  - Accéder à http://localhost:8085/q/swagger-ui
  - Tester GET /api/finance/approvals/pending
  - Tester POST /api/finance/approvals (approve/reject)
  - Tester GET /api/finance/budgets
  - Tester POST /api/finance/budgets (create)
  - Tester GET /api/finance/budgets/{id}/tracking

- [ ] **Intégration mobile-backend**
  - Lancer le backend (port 8085)
  - Lancer l'app mobile Flutter en dev
  - Naviguer vers Finance Workflow
  - Vérifier que les approbations se chargent
  - Vérifier que les budgets se chargent
  - Tester une approbation end-to-end
  - Tester la création d'un budget

### P1 - Post-Production

- [ ] **Tests d'intégration RestAssured**
  - ApprovalResourceIntegrationTest (E2E workflow)
  - BudgetResourceIntegrationTest (CRUD complet)

- [ ] **Tests unitaires entités**
  - TransactionApprovalTest (méthodes métier: hasAllApprovals, isExpired, countApprovals)
  - BudgetTest (méthodes métier: recalculateTotals, getRealizationRate, isOverBudget)

- [ ] **Tests repositories**
  - TransactionApprovalRepositoryTest (requêtes personnalisées)
  - BudgetRepositoryTest (filtres, recherches)

### P2 - Couverture complète

- [ ] Refactoring services pour faciliter tests unitaires
- [ ] Tests unitaires services (après refactoring)
- [ ] Tests de charge (performance)
- [ ] Tests de sécurité (autorisations)

## Commandes utiles

```bash
# Démarrer Quarkus en mode dev
cd unionflow/unionflow-server-impl-quarkus
mvn quarkus:dev

# Vérifier migration Flyway
tail -f target/quarkus.log | grep Flyway

# Exécuter tests d'intégration (quand créés)
mvn test -Dtest=ApprovalResourceIntegrationTest

# Générer rapport de couverture
mvn clean verify
# Rapport: target/site/jacoco/index.html
```

## Notes

- Les fichiers de tests créés (`ApprovalServiceTest.java`, `BudgetServiceTest.java`) ne compilent pas actuellement à cause des dépendances JWT
- Ils peuvent servir de base pour des tests d'intégration futurs
- La priorité P0 est de valider que le backend fonctionne (migration + endpoints)
