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:
276
unionflow/TEST_ENDPOINTS_SWAGGER.ps1
Normal file
276
unionflow/TEST_ENDPOINTS_SWAGGER.ps1
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user