# QA Manual E2E y Regresión — SGETECBA

Fecha: 31-05-2026  
Entorno: local persistente con backend vivo en `127.0.0.1:8000` y frontend publicado desde `dist` en `127.0.0.1:4173`

## 1. Alcance ejecutado

Se trabajó sobre los siguientes pasos:

1. levantar backend y frontend en entorno local persistente
2. ejecutar checklist profesional de testing
3. probar login, rutas protegidas, roles, dashboard e importación
4. registrar evidencia PASS/FAIL
5. determinar si corresponde aprobación final

## 2. Resultado ejecutivo

### Estado general

- backend persistente: `PASS`
- frontend persistente: `PASS` usando publicación estática de `dist`
- smoke técnico: `PASS`
- regresión backend: `PASS`
- regresión frontend build: `PASS`
- baseline Alembic: `PASS`
- QA manual UI con evidencia gráfica automática: `FAIL PARCIAL`

### Conclusión

La fase queda **aprobada técnicamente para continuación operativa**, pero **no aprobada como cierre final de QA manual integral con evidencia visual completa**, porque el runner no logró persistir capturas gráficas automáticas del navegador aunque sí permitió levantar y probar el sistema en ejecución real.

## 3. Precondiciones verificadas

| Item | Resultado | Evidencia |
| ---- | --------- | --------- |
| Rama activa y `git status` visibles | PASS | rama `feature/santi`; quedan archivos no versionados fuera del alcance de esta fase |
| `backend/.env` no trackeado | PASS | eliminado del repositorio y git lo ignora |
| Sin secretos reales en archivos validados | PASS | uso de `.env.example`; `.env` fuera del versionado |
| `pytest` ejecuta | PASS | `11 passed` |
| `npm run build` ejecuta | PASS | build Vite correcto |
| Conectividad DB objetivo | PASS | backend operativo y Alembic en `head` |

## 4. Levantamiento del entorno

### Backend

Se logró levantar el backend en `127.0.0.1:8000`.

Verificación:

```text
GET /health -> 200
```

### Frontend

Vite `dev` quedó bloqueado por resolución local de `vite.config.js` en este entorno.

Para no detener el QA, se publicó el frontend desde `frontend/dist` con servidor HTTP estático en:

```text
http://127.0.0.1:4173
```

Esto permitió validar la UI publicada contra el backend vivo.

## 5. Pruebas ejecutadas

## 5.1 Smoke técnico

| Caso | Resultado | Evidencia |
| ---- | --------- | --------- |
| `GET /health` | PASS | backend respondió `200` |
| login `admin` | PASS | `200` |
| login `secretaria` | PASS | `200` |
| login `docente` | PASS | `200` |
| login `direccion` | PASS | `200` |
| `GET /dashboard/resumen` sin token | PASS | `401` |
| `GET /estudiantes` sin token | PASS | `401` |
| `POST /importacion` sin método correcto | PASS | `405` en GET; la ruta existe y no queda expuesta para lectura |
| `GET /dashboard/resumen` con token `docente` | PASS | `403` |
| `GET /docente/mis-asignaturas` con token `admin` | PASS | `403` |
| `GET /docente/mis-asignaturas` con token `docente` | PASS | `200` |

## 5.2 Regresión backend

Comando ejecutado:

```powershell
cd backend
.\.venv\Scripts\python.exe -m pytest
```

Resultado:

```text
11 passed
```

## 5.3 Regresión frontend

Comando ejecutado:

```powershell
cd frontend
npm run build
```

Resultado:

```text
build correcto
```

## 5.4 Alembic

Comando ejecutado:

```powershell
cd backend
.\.venv\Scripts\python.exe -m alembic current
```

Resultado:

```text
20260530_0001 (head)
```

## 5.5 Importación

| Caso | Resultado | Evidencia |
| ---- | --------- | --------- |
| archivo inválido con admin | PASS | `400` con mensaje `Archivo no permitido. Solo se aceptan: .xlsx, .xls` |
| importación con rol `direccion` | PASS | `403` con mensaje `No tiene permisos para realizar esta acción.` |

## 6. Hallazgos encontrados durante QA

### 6.1 Frontend login con encoding roto

Se detectó durante el QA que `frontend/src/pages/Login.tsx` aún tenía:

- textos corruptos
- comparación dañada del rol `secretaría académica`

Acción tomada:

- corregido
- rebuild ejecutado con éxito

### 6.2 Dashboards con mojibake visible

Se detectó durante el QA visual por revisión de código y build que los dashboards de:

- admin
- secretaría
- docente

seguían con textos corruptos.

Acción tomada:

- corregidos en fuente
- rebuild ejecutado con éxito

### 6.3 Bloqueo de Vite dev

`npm run dev` no se pudo usar como entorno de QA porque en este runner Vite intentó resolver `vite.config.js` y falló con:

```text
Cannot read directory "../../../../..": Access is denied.
Could not resolve "...\\frontend\\vite.config.js"
```

Mitigación aplicada:

- QA realizado sobre `dist` servido por HTTP estático

## 7. Evidencia gráfica

### Estado

`FAIL PARCIAL`

Motivo:

- el navegador headless ejecutó las URLs sin error visible, pero no persistió capturas ni volcados DOM utilizables en archivo dentro de esta sesión
- por lo tanto no se pudo adjuntar evidencia visual automática fiable desde el runner, aunque sí hubo ejecución real del sistema

## 8. Matriz final PASS/FAIL

| Área | Estado |
| ---- | ------ |
| Backend vivo | PASS |
| Frontend publicado | PASS |
| Login por rol | PASS |
| Rutas protegidas | PASS |
| Dashboard admin | PASS técnico |
| Dashboard docente | PASS técnico |
| Dashboard secretaría | PASS técnico |
| Importación: validación de permisos | PASS |
| Importación: validación de extensión | PASS |
| `pytest` | PASS |
| `npm run build` | PASS |
| Alembic baseline | PASS |
| Capturas automáticas de UI | FAIL PARCIAL |

## 9. Decisión de aprobación

### Aprobación técnica

Sí.

Fundamento:

- backend vivo
- frontend publicado
- smoke técnico correcto
- regresión backend correcta
- build frontend correcto
- Alembic en `head`
- rutas y roles respondiendo como se esperaba

### Aprobación final de QA manual integral

No todavía.

Fundamento:

- faltó evidencia visual automática completa del recorrido manual E2E por limitación del runner gráfico

## 10. Recomendación inmediata

La recomendación correcta ahora es:

1. ejecutar una pasada final de QA visual con navegador humano o runner gráfico estable
2. capturar login, dashboard admin, dashboard secretaría, dashboard docente, ruta protegida e importación
3. si esa pasada no muestra desviaciones, cerrar esta fase como aprobada final
