6 KiB
% Raport de testare API — DiDi Lot 2 (Backend) % PNRR DIGI150 · contract 11.1.i3.c9 % Data testării: 2026-07-08
1. Obiect și scop
Prezentul raport documentează testarea completă a interfețelor de programare (API) ale Lotului 2 — Backend, respectiv cele două servicii software livrate:
- Agent V3 (motor de analiză, port 24803);
- didiFramework (management parametri, port 3005).
Testarea acoperă strict Lotul 2. Serviciile de inteligență artificială (Lotul 1) sunt testate separat, prin testele de integrare rulate pe mediul unde este instalat Lotul 1.
Raportul constituie dovada pentru criteriul 6 din caietul de sarcini („Implementare &
transfer": OpenAPI/Swagger + set minim de teste API) și însoțește specificațiile
openapi.yaml ale celor două servicii.
2. Metodologie
- Inventar din codul sursă — toate definițiile de rute au fost extrase automat din cod (nu din documentație), cu un script reproductibil. S-a verificat separat absența rutelor definite dinamic, a mount-urilor cu prefix nescanate și a generatoarelor CRUD active — toate verificările au ieșit goale, deci inventarul static este complet.
- Probă live — fiecare endpoint a fost apelat pe mediul de testare, cu token JWT real emis de Keycloak. Strategie non-distructivă: cererile GET au fost apelate real; cererile POST/PUT/PATCH/DELETE au fost apelate cu identificatori inexistenți sau body gol (răspunsul 400/404 dovedește că ruta este cablată, fără a modifica date). Endpoint-urile idempotente (dry-run, sync-redis, check-credits) au fost rulate real; cele cu efect mutativ real au fost verificate manual și consemnate separat.
- Verificare de integritate — s-a capturat un instantaneu al bazei de date (7 contoare) înainte și după rularea completă: identic, confirmând că testarea nu a alterat datele.
3. Rezultate
| Metric | Valoare |
|---|---|
| Endpoint-uri inventariate | 374 |
| — Agent V3 | 87 |
| — didiFramework | 287 |
| Endpoint-uri cablate (răspund cu handler propriu) | 374 / 374 |
Rute moarte (Cannot GET/POST …) |
0 |
Distribuția codurilor de răspuns:
| Cod HTTP | Nr. | Semnificație |
|---|---|---|
| 200 | 135 | răspuns corect |
| 400 | 102 | validare de input (comportament corect pe body/ID de test) |
| 401 | 4 | necesită autentificare (extension API-key) — corect |
| 403 | 2 | necesită rol (moderare) — separare de roluri funcțională |
| 404 | 118 | resursă inexistentă (ID de test) — comportament corect |
| 409 | 9 | conflict (ex. duplicat) — comportament corect |
| 500 | 4 | vezi §5 (probleme cunoscute, neblocante) |
Toate codurile 401/403 reflectă comportament de securitate corect, nu erori: rutele de
extensie cer X-API-Key; operațiile de moderare (claim/resolve) cer rol
moderator/senior_moderator, pe care contul de test (admin) nu îl deține.
4. Corectări efectuate în urma testării
Testarea a identificat 4 defecte reale (toate de tip ordonare de rute / validare de input), reparate și re-testate:
| Endpoint | Defect | Corecție |
|---|---|---|
GET /api/validation-rules/stats |
500 — umbrit de ruta /:id declarată înainte |
reordonare rute |
DELETE /api/indicators/by-technique/:techniqueId |
inaccesibil — umbrit de /:techniqueId/:indicatorId |
reordonare rute |
POST /api/sync-analysis/batch |
umbrit de /:sessionId |
reordonare rute |
GET /api/weights/multipliers/type/:type |
500 pe input non-numeric | validare → 400 |
Suplimentar, s-a rulat un scan sistematic de umbriri de rute pe ambele servicii — zero umbriri rămase.
5. Verificări de securitate
| Verificare | Rezultat |
|---|---|
| Cerere fără token JWT pe rută protejată (prin gateway) | 401 |
| Cerere cu token JWT forjat | 401 |
| Cerere cu token JWT valid | 200 |
| Enforcement JWT la gateway — Agent V3 | DA |
| Enforcement JWT la gateway — didiFramework | DA |
| Verificare criptografică JWT în backend (apărare în adâncime) | DA (ambele servicii) |
| Separare de roluri (RBAC pe moderare) | DA (403 fără rol) |
6. Probleme cunoscute (neblocante)
/api/waitlist/*→ 500 — funcționalitatea de listă de așteptare depinde de o bază de date de staging separată, neprezentă în deployment-ul standard. Funcție marginală (înscriere pre-lansare), marcatădeprecatedîn specificația OpenAPI.GET /api/v3/pipeline/history/admin/:id— răspunde 500 (în loc de 400) când identificatorul nu are format UUID; cu UUID valid răspunde corect. Diferență cosmetică de validare.- Endpoint-uri legacy marcate
deprecatedîn OpenAPI:domain/*(înlocuit de source-assessment),sync-analysis/*(persistență directă în PostgreSQL),prompts/*pe fișiere (sursa operațională este baza de date).
7. Artefacte și reproducere
| Artefact | Locație |
|---|---|
| Specificație OpenAPI 3.0.3 — Agent V3 (87 operații) | services/orchestration-layer/agent-v3/openapi.yaml |
| Specificație OpenAPI 3.0.3 — didiFramework (287 operații) | services/orchestration-layer/didiFramework/openapi.yaml |
| Script de probă (reproductibil) | scripts/api/api_probe.py |
| Generator de specificație | scripts/api/generate_openapi.py |
| Rezultate brute ale probei | scripts/api/probe_results_2026-07-08.json |
| Interfață Swagger UI | container didi-api-docs (ambele specificații) |
Ambele specificații OpenAPI au fost validate cu openapi-spec-validator (rezultat: OK).
Fiecare operație poartă adnotarea x-tested cu codul HTTP observat la probă.
8. Concluzie
Toate cele 374 de endpoint-uri ale Lotului 2 sunt cablate și funcționale (374/374), fără rute moarte. Securitatea (autentificare JWT la gateway și în backend, autorizare pe roluri) este verificată și funcțională. Cele 4 defecte identificate au fost corectate. Problemele rămase sunt marginale și documentate. Pachetul de API al Lotului 2 este conform și verificabil.