feat: WebSocket temps réel + Finance Workflow + corrections

- Task #6: WebSocket /ws/dashboard + Kafka events (5 topics)
  * Backend: KafkaEventProducer, KafkaEventConsumer
  * Mobile: WebSocketService (reconnection, heartbeat, typed events)
  * DashboardBloc: Auto-refresh depuis WebSocket events

- Finance Workflow: approbations + budgets (backend + mobile)
  * Backend: entities, services, resources, migrations Flyway V6
  * Mobile: features finance_workflow complète avec BLoC

- Corrections DI: interfaces IRepository partout
  * IProfileRepository, IOrganizationRepository, IMembreRepository
  * GetIt configuré avec @injectable

- Spec-Kit: constitution + templates mis à jour
  * .specify/memory/constitution.md enrichie
  * Templates agent, plan, spec, tasks, checklist

- Nettoyage: fichiers temporaires supprimés

Signed-off-by: lions dev Team
This commit is contained in:
dahoud
2026-03-15 02:12:17 +00:00
parent bbc409de9d
commit e8ad874015
635 changed files with 58160 additions and 20674 deletions

View File

@@ -0,0 +1,276 @@
# Script PowerShell pour tester les endpoints Finance Workflow via Swagger UI
# À exécuter APRÈS le démarrage de Quarkus
param(
[string]$BaseUrl = "http://localhost:8085",
[string]$OrganizationId = "00000000-0000-0000-0000-000000000001"
)
Write-Host "============================================" -ForegroundColor Cyan
Write-Host "Finance Workflow - Tests Endpoints REST" -ForegroundColor Cyan
Write-Host "============================================" -ForegroundColor Cyan
Write-Host ""
Write-Host "Base URL: $BaseUrl" -ForegroundColor Gray
Write-Host ""
# Fonction utilitaire pour tester un endpoint
function Test-Endpoint {
param(
[string]$Name,
[string]$Method,
[string]$Url,
[object]$Body = $null,
[int[]]$ExpectedStatuses = @(200)
)
Write-Host "[$Method] $Name" -ForegroundColor Yellow
Write-Host " URL: $Url" -ForegroundColor Gray
try {
$params = @{
Uri = $Url
Method = $Method
ContentType = "application/json"
ErrorAction = "Stop"
}
if ($Body) {
$params.Body = ($Body | ConvertTo-Json -Depth 10)
Write-Host " Body: $($params.Body)" -ForegroundColor Gray
}
$response = Invoke-RestMethod @params
$statusCode = 200
if ($ExpectedStatuses -contains $statusCode) {
Write-Host " ✓ Succès (200 OK)" -ForegroundColor Green
if ($response) {
Write-Host " Response: $($response | ConvertTo-Json -Depth 3 -Compress)" -ForegroundColor Gray
}
return $true
} else {
Write-Host " ⚠ Status inattendu: $statusCode" -ForegroundColor Yellow
return $false
}
}
catch {
$statusCode = $_.Exception.Response.StatusCode.value__
if ($ExpectedStatuses -contains $statusCode) {
Write-Host " ✓ Status attendu: $statusCode" -ForegroundColor Green
return $true
} else {
Write-Host " ✗ Erreur: $statusCode - $($_.Exception.Message)" -ForegroundColor Red
return $false
}
}
finally {
Write-Host ""
}
}
# Tests des endpoints
$results = @{
Total = 0
Passed = 0
Failed = 0
}
Write-Host "=== Tests Approbations ===" -ForegroundColor Cyan
Write-Host ""
# TEST 1: GET Approbations en attente
$results.Total++
if (Test-Endpoint `
-Name "Lister les approbations en attente" `
-Method "GET" `
-Url "$BaseUrl/api/finance/approvals/pending?organizationId=$OrganizationId" `
-ExpectedStatuses @(200, 401, 403)) {
$results.Passed++
} else {
$results.Failed++
}
# TEST 2: GET Nombre d'approbations en attente
$results.Total++
if (Test-Endpoint `
-Name "Compter les approbations en attente" `
-Method "GET" `
-Url "$BaseUrl/api/finance/approvals/count/pending?organizationId=$OrganizationId" `
-ExpectedStatuses @(200, 401, 403)) {
$results.Passed++
} else {
$results.Failed++
}
# TEST 3: GET Historique des approbations
$results.Total++
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-ddTHH:mm:ss")
$endDate = (Get-Date).ToString("yyyy-MM-ddTHH:mm:ss")
if (Test-Endpoint `
-Name "Historique des approbations" `
-Method "GET" `
-Url "$BaseUrl/api/finance/approvals/history?organizationId=$OrganizationId&startDate=$startDate&endDate=$endDate" `
-ExpectedStatuses @(200, 401, 403)) {
$results.Passed++
} else {
$results.Failed++
}
Write-Host "=== Tests Budgets ===" -ForegroundColor Cyan
Write-Host ""
# TEST 4: GET Liste des budgets
$results.Total++
if (Test-Endpoint `
-Name "Lister les budgets" `
-Method "GET" `
-Url "$BaseUrl/api/finance/budgets?organizationId=$OrganizationId" `
-ExpectedStatuses @(200, 401, 403)) {
$results.Passed++
} else {
$results.Failed++
}
# TEST 5: GET Budgets filtrés par statut
$results.Total++
if (Test-Endpoint `
-Name "Lister les budgets actifs" `
-Method "GET" `
-Url "$BaseUrl/api/finance/budgets?organizationId=$OrganizationId&status=ACTIVE" `
-ExpectedStatuses @(200, 401, 403)) {
$results.Passed++
} else {
$results.Failed++
}
# TEST 6: GET Budgets filtrés par année
$results.Total++
$currentYear = (Get-Date).Year
if (Test-Endpoint `
-Name "Lister les budgets de l'année courante" `
-Method "GET" `
-Url "$BaseUrl/api/finance/budgets?organizationId=$OrganizationId&year=$currentYear" `
-ExpectedStatuses @(200, 401, 403)) {
$results.Passed++
} else {
$results.Failed++
}
Write-Host "=== Tests Validation ===" -ForegroundColor Cyan
Write-Host ""
# TEST 7: POST Budget invalide (sans lignes)
$results.Total++
$invalidBudget = @{
name = "Budget Test Invalide"
organizationId = $OrganizationId
period = "MONTHLY"
year = $currentYear
month = 3
currency = "XOF"
lines = @()
}
if (Test-Endpoint `
-Name "Créer budget invalide (sans lignes)" `
-Method "POST" `
-Url "$BaseUrl/api/finance/budgets" `
-Body $invalidBudget `
-ExpectedStatuses @(400, 401, 403)) {
$results.Passed++
} else {
$results.Failed++
}
# TEST 8: POST Budget invalide (période invalide)
$results.Total++
$invalidBudget2 = @{
name = "Budget Test"
organizationId = $OrganizationId
period = "INVALID_PERIOD"
year = $currentYear
currency = "XOF"
lines = @(
@{
category = "CONTRIBUTIONS"
name = "Test"
amountPlanned = 1000000.00
}
)
}
if (Test-Endpoint `
-Name "Créer budget avec période invalide" `
-Method "POST" `
-Url "$BaseUrl/api/finance/budgets" `
-Body $invalidBudget2 `
-ExpectedStatuses @(400, 401, 403)) {
$results.Passed++
} else {
$results.Failed++
}
Write-Host "=== Tests Swagger UI ===" -ForegroundColor Cyan
Write-Host ""
# TEST 9: Vérifier que Swagger UI est accessible
$results.Total++
Write-Host "[GET] Swagger UI accessible" -ForegroundColor Yellow
Write-Host " URL: $BaseUrl/q/swagger-ui" -ForegroundColor Gray
try {
$swaggerResponse = Invoke-WebRequest -Uri "$BaseUrl/q/swagger-ui" -ErrorAction Stop
if ($swaggerResponse.StatusCode -eq 200) {
Write-Host " ✓ Swagger UI accessible" -ForegroundColor Green
$results.Passed++
}
} catch {
Write-Host " ✗ Swagger UI inaccessible" -ForegroundColor Red
$results.Failed++
}
Write-Host ""
# TEST 10: Vérifier que l'OpenAPI spec contient Finance Workflow
$results.Total++
Write-Host "[GET] OpenAPI spec contient Finance Workflow" -ForegroundColor Yellow
Write-Host " URL: $BaseUrl/q/openapi" -ForegroundColor Gray
try {
$openApiSpec = Invoke-RestMethod -Uri "$BaseUrl/q/openapi" -ErrorAction Stop
$specJson = $openApiSpec | ConvertTo-Json -Depth 10
if ($specJson -match "approval-resource" -and $specJson -match "budget-resource") {
Write-Host " ✓ Finance Workflow endpoints trouvés dans OpenAPI" -ForegroundColor Green
$results.Passed++
} else {
Write-Host " ✗ Finance Workflow endpoints non trouvés" -ForegroundColor Red
$results.Failed++
}
} catch {
Write-Host " ✗ Erreur lors de la récupération de l'OpenAPI spec" -ForegroundColor Red
$results.Failed++
}
Write-Host ""
# Résumé
Write-Host "============================================" -ForegroundColor Cyan
Write-Host "RÉSUMÉ DES TESTS" -ForegroundColor Cyan
Write-Host "============================================" -ForegroundColor Cyan
Write-Host ""
Write-Host "Total: $($results.Total) tests" -ForegroundColor Gray
Write-Host "Réussis: $($results.Passed) tests" -ForegroundColor Green
Write-Host "Échoués: $($results.Failed) tests" -ForegroundColor Red
Write-Host ""
if ($results.Failed -eq 0) {
Write-Host "✓ TOUS LES TESTS SONT PASSÉS !" -ForegroundColor Green
Write-Host ""
Write-Host "Prochaine étape: Tester avec l'app mobile Flutter" -ForegroundColor Yellow
exit 0
} else {
$passRate = [math]::Round(($results.Passed / $results.Total) * 100, 2)
Write-Host "⚠ Taux de réussite: $passRate%" -ForegroundColor Yellow
Write-Host ""
Write-Host "Vérifiez les erreurs ci-dessus et consultez:" -ForegroundColor Yellow
Write-Host " - Logs Quarkus pour les détails des erreurs" -ForegroundColor Gray
Write-Host " - Swagger UI: $BaseUrl/q/swagger-ui" -ForegroundColor Gray
exit 1
}