259 lines
9.4 KiB
Markdown
259 lines
9.4 KiB
Markdown
# Reporte de Pruebas — Anexo 76
|
|
|
|
## Resumen ejecutivo
|
|
|
|
| Herramienta | Archivos | Pruebas | Estado |
|
|
|-------------|----------|---------|--------|
|
|
| Backend — pytest | 4 | 11 | Pasando |
|
|
| Frontend — Vitest (server) | 8 | 68 | Pasando |
|
|
| Frontend — Playwright (E2E) | 5 | 28 | Pasando |
|
|
| **Total** | **17** | **107** | **Pasando** |
|
|
|
|
---
|
|
|
|
## Backend — pytest (11 pruebas)
|
|
|
|
Ubicacion: `backend/tests/`
|
|
|
|
### e2e/test_inventory_flow_anexo24.py — 1 prueba
|
|
|
|
**test_e2e_inventory_flow_import_then_export** — la prueba mas importante del repositorio. Simula el flujo completo del negocio:
|
|
|
|
1. Crea una factura de importacion TEM con 10 piezas
|
|
2. La procesa — genera movimiento ENTRY en el inventario
|
|
3. Crea una factura de exportacion consumiendo 4 piezas
|
|
4. La procesa — genera CONSUMPTION y DISCHARGE
|
|
5. Verifica que el saldo neto es positivo y menor a 10
|
|
|
|
### integration/ — 5 pruebas
|
|
|
|
- **test_process_export_endpoint_consumes_existing_balances** — exportacion consume saldos existentes correctamente
|
|
- **test_process_export_prevents_negative_balance** — exportacion no puede consumir mas de lo que hay
|
|
- **test_process_endpoint_prevents_double_processing_import** — una factura no se puede procesar dos veces
|
|
- **test_process_import_endpoint_creates_balance_entries** — importacion TEM genera entradas de balance
|
|
- **test_process_import_def_does_not_create_balance_entries** — importacion DEF no genera entradas de balance
|
|
|
|
### unit/ — 5 pruebas
|
|
|
|
- **test_net_balance_accounts_for_returns_and_entry_void** — balance neto calcula correctamente entradas, consumos, devoluciones y anulaciones
|
|
- **test_fifo_consumption_algorithm_uses_oldest_lots_first** — algoritmo PEPS consume primero los lotes mas antiguos
|
|
- **test_assign_values_iva_lines_currency_me** — calculo de IVA en moneda extranjera
|
|
- **test_assign_values_iva_lines_currency_mn** — calculo de IVA en moneda local
|
|
- **test_assign_values_iva_lines_currency_mc** — calculo de IVA en moneda manual
|
|
|
|
### Comando
|
|
|
|
```bash
|
|
docker exec -it anexo76-backend pytest /app/tests/ -v
|
|
```
|
|
|
|
---
|
|
|
|
## Frontend Vitest — 68 pruebas
|
|
|
|
Vitest corre en Node sin navegador. Prueba funciones puras que reciben datos y devuelven un resultado.
|
|
|
|
### backend.test.ts — 2 pruebas
|
|
|
|
Verifica que el backend esta disponible desde el contenedor del frontend usando la red interna de Docker.
|
|
|
|
- **el backend esta corriendo y responde** — GET /api/health devuelve 200
|
|
- **el endpoint de facturas responde** — el endpoint de invoices responde (200, 401, 403 o 422 son validos)
|
|
|
|
Nota: no se usa `docker exec` porque el contenedor del frontend no tiene acceso a Docker. Se usa la URL interna `http://backend:8000` de la red Docker Compose.
|
|
|
|
### utils.getInvoiceTypeColor.test.ts — 19 pruebas
|
|
|
|
Prueba que cada tipo de factura devuelve el color Tailwind correcto para mostrarse en la UI.
|
|
|
|
- Entradas invalidas (null, undefined, '') devuelven gris por defecto
|
|
- TEM / IMPO TEM -> rojo (bg-red-100)
|
|
- DEF / IMPO DEF -> verde (bg-green-100)
|
|
- MEX / COMP MEX -> morado (bg-purple-100)
|
|
- CAM REG -> azul (bg-blue-100)
|
|
- EXPO / EXDEF / PTERM -> azul (bg-blue-100)
|
|
- IMP REP -> azul claro (bg-sky-100)
|
|
- Tipo desconocido -> gris por defecto
|
|
|
|
### utils.getFileHelpers.test.ts — 9 pruebas
|
|
|
|
Prueba extraccion de nombres de archivo desde rutas y formateo para mostrar al usuario.
|
|
|
|
- null / undefined -> string vacio
|
|
- Ruta normal '/uploads/file.png' -> 'file.png'
|
|
- Ruta con query string '/uploads/file.png?token=123' -> 'file.png' sin el token
|
|
- Con fileType -> 'file.png (PDF)'
|
|
|
|
### utils.getBackendAssetUrl.test.ts — 5 pruebas
|
|
|
|
Prueba construccion de URLs del backend evitando duplicar /api.
|
|
|
|
Deuda tecnica identificada: la funcion depende de import.meta.env.VITE_API_URL. Se pasa baseUrl explicitamente en cada test.
|
|
|
|
- null / undefined -> string vacio
|
|
- URL completa -> se devuelve sin modificar
|
|
- /api/... con base /api -> evita /api/api/
|
|
- Ruta normal -> URL completa correcta
|
|
|
|
### date-utils.test.ts — 17 pruebas
|
|
|
|
Prueba conversion de fechas entre zona local y UTC ISO.
|
|
|
|
- prepareDateForBackend: vacio -> null, fecha + hora -> ISO string valido
|
|
- loadServerDate: null/undefined -> '', ISO UTC -> YYYY-MM-DD, fecha plana sin modificar
|
|
- addDaysLocal: vacio -> '', suma normal, cambio de mes, ano bisiesto (2024-02-29)
|
|
- getCurrentLocal*: verifica formato con regex — no valor exacto porque cambia cada dia
|
|
|
|
### csv-import-commit-metrics.test.ts — 11 pruebas
|
|
|
|
Prueba metricas del resultado de importacion CSV.
|
|
|
|
- totalSkippedFromCommit: null -> 0, objeto vacio -> 0, suma correcta de campos skipped
|
|
- criticalReferenceGaps: null -> 0, objeto vacio -> 0, campo presente -> su valor
|
|
- referenceStateReady: null -> true, campo booleano respeta el valor
|
|
|
|
### csv-import-status-api.test.ts — 4 pruebas
|
|
|
|
Prueba isWaitingConfirmationPayload. fetchCsvImportStatus no se prueba porque depende del backend.
|
|
|
|
- null / {} -> false
|
|
- { status: 'waiting_confirmation' } -> true
|
|
- { job_id: 'abc', total_rows: 10 } -> true
|
|
|
|
### Comando
|
|
|
|
```bash
|
|
docker exec -it anexo76-frontend pnpm test:unit --project server
|
|
```
|
|
|
|
---
|
|
|
|
## Frontend Playwright E2E — 28 pruebas
|
|
|
|
Playwright abre un navegador real y prueba flujos completos con el backend y Keycloak levantados.
|
|
|
|
### Configuracion
|
|
|
|
- **workers: 1** — las pruebas con login no pueden correr en paralelo
|
|
- **headless: false** — necesario para estabilidad en Windows
|
|
- **timeout: 60000** — Keycloak puede tardar hasta 60 segundos
|
|
- **storageState** — sesion guardada en e2e/.auth/user.json y reutilizada
|
|
|
|
### auth.setup.ts — 1 prueba
|
|
|
|
Login inicial con credenciales demo/demo123. Guarda la sesion para reutilizar.
|
|
|
|
### full-flow.spec.ts — 4 pruebas
|
|
|
|
Conecta backend y frontend — corre pytest primero y si pasa, verifica el frontend.
|
|
|
|
- **pruebas del backend pasan antes de continuar** — ejecuta pytest /app/tests/ y verifica 11 passed
|
|
- **Import Invoices TEM carga despues de que backend pasa** — URL /invoices + main visible
|
|
- **Export Invoices carga despues de que backend pasa** — URL /invoices + main visible
|
|
- **Reportes de facturas carga despues de que backend pasa** — URL /reports + main visible
|
|
|
|
### login.spec.ts — 3 pruebas
|
|
|
|
- Login exitoso redirige al dashboard
|
|
- Dashboard muestra h1 visible
|
|
- Credenciales incorrectas se quedan en /login
|
|
|
|
### navigation.spec.ts — 10 pruebas
|
|
|
|
- Dashboard carga con h1 visible
|
|
- Header muestra Aduanasoft S.A. de C.V.
|
|
- Menu lateral tiene Audit Logs, Customs Brokers, Fractions, Pedimentos
|
|
- Audit Logs, Customs Brokers, Fraction Sitar y Pedimentos cargan sin error
|
|
|
|
### modules.spec.ts — 10 pruebas
|
|
|
|
- Import Invoices TEM y DEF cargan sin error
|
|
- Export Invoices carga sin error
|
|
- Fixed Catalogs, General Catalogs, Transportes, Goods, Settings, Reportes cargan sin error
|
|
- Logout redirige a /login
|
|
|
|
### Comando
|
|
|
|
```bash
|
|
# Desde la carpeta frontend en Windows
|
|
pnpm test:e2e
|
|
|
|
# Suite especifica
|
|
pnpm test:e2e --grep "Flujo completo"
|
|
pnpm test:e2e --grep "Login"
|
|
pnpm test:e2e --grep "Modulos"
|
|
pnpm test:e2e --grep "Navegacion"
|
|
```
|
|
|
|
---
|
|
|
|
## Archivos que NO se prueban con Vitest
|
|
|
|
| Archivo | Razon |
|
|
|---------|-------|
|
|
| api.ts | Depende de fetch, cookies, window, document |
|
|
| auth.ts | Depende de Keycloak JS, cookies, window |
|
|
| session-manager.ts | Depende de window, setInterval, eventos DOM |
|
|
| sso.ts | Depende de Keycloak JS y browser |
|
|
| csv-import-pending.ts | Depende de localStorage |
|
|
| csv-import-session.ts | Depende de sessionStorage |
|
|
| csv-upload-row-count.ts | Depende de File.text(), API del browser |
|
|
| fetchCsvImportStatus | Depende de api que necesita el backend |
|
|
|
|
---
|
|
|
|
## Pruebas pendientes para el futuro
|
|
|
|
### Necesitan datos en la BD
|
|
- Buscar una factura especifica en Import Invoices
|
|
- Filtrar por fecha en Reportes
|
|
- Verificar que tablas muestran registros tras procesar una factura
|
|
|
|
### Necesitan mas usuarios
|
|
- RBAC: usuario sin permisos intenta acceder a ruta protegida
|
|
- Admin vs usuario normal ven opciones distintas
|
|
|
|
### Necesitan flujo completo
|
|
- Subir un CSV y verificar que el proceso funciona
|
|
- Crear una factura y verificar que aparece en la tabla
|
|
|
|
---
|
|
|
|
## Estructura de archivos final
|
|
|
|
```
|
|
backend/tests/
|
|
├── conftest.py
|
|
├── fixtures/
|
|
│ └── builders.py
|
|
├── e2e/
|
|
│ └── test_inventory_flow_anexo24.py 1 test
|
|
├── integration/
|
|
│ ├── test_export_process_api.py 3 tests
|
|
│ └── test_import_process_api.py 2 tests
|
|
└── unit/
|
|
└── invoices/
|
|
├── test_balance_algorithm.py 2 tests
|
|
└── test_currency_conversion.py 3 tests
|
|
|
|
frontend/src/lib/
|
|
├── backend.test.ts 2 tests
|
|
├── utils.getInvoiceTypeColor.test.ts 19 tests
|
|
├── utils.getFileHelpers.test.ts 9 tests
|
|
├── utils.getBackendAssetUrl.test.ts 5 tests
|
|
├── date-utils.test.ts 17 tests
|
|
├── csv-import-commit-metrics.test.ts 11 tests
|
|
└── csv-import-status-api.test.ts 4 tests
|
|
|
|
frontend/e2e/
|
|
├── .auth/user.json
|
|
├── auth.setup.ts 1 test
|
|
├── full-flow.spec.ts 4 tests
|
|
├── login.spec.ts 3 tests
|
|
├── navigation.spec.ts 10 tests
|
|
└── modules.spec.ts 10 tests
|
|
```
|
|
|
|
---
|
|
|
|
*Anexo 76 — Reporte de Pruebas v3.0 — 107 pruebas totales* |