Sigla en azul →glosario(primera vez: expansión entre paréntesis).
M15 — Verificación, validación y calidad
Por qué existe
Sin pruebas automatizadas, cada cambio en Agenda Ops es apuesta. La calidad no es un departamento: es pirámide de tests, integración continua y revisiones que incluyen auth, IDOR y validación de entrada (hilo seguridad). Esta materia prepara el pipeline que M17 mantendrá verde y que M18 endurecerá con tests de regresión AppSec .
En resumen: la calidad deja de ser opcional: pirámide de tests, CI y reviews que incluyen seguridad.
Objetivos de aprendizaje
Al terminar debes poder:
- Diseñar una pirámide de tests (unitarios, integración, pocos E2E) para el dominio de citas/clientes.
- Escribir tests de dominio y API que fallen ante reglas de negocio rotas.
- Incluir casos de seguridad mínimos: sin auth, IDOR, input inválido.
- Configurar CI en GitHub Actions: lint, test, audit de dependencias.
- Usar mocks/fakes con criterio (no probar solo el mock).
- Aplicar checklist de code review con ítems de seguridad y calidad.
- Medir coverage útil en lógica de negocio, no en archivos boilerplate.
Cómo estudiar esta materia (lecciones)
M15 deja la calidad del piloto Agenda Ops automatizada: L01–L16.
- Cada bug encontrado → test de regresión el mismo día (regla del plan).
- Trabaja sobre spike en
projects/m15-calidad/o el repo M17 cuando exista. - CI debe ser obligatoria para merge; no “corro tests a mano cuando me acuerdo”.
- Marca lecciones al cumplir “Hecho cuando”.
- Cómo estudiar y hilo seguridad.
Semana tipo (20 h)
| Bloque | Horas | Qué haces |
|---|---|---|
| Tests | 6–8 | Lecciones unit/API de la semana |
| CI | 6–8 | Workflow Actions lint+test+audit |
| Review | 4–6 | Checklist en PR real o simulado |
| Retro | 1 | Bug → test documentado |
Si un día solo tienes 2 h: una lección práctica. No saltes la lectura de esa lección.
Lecciones
Semana 1 — Pirámide y tests de dominio (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L01 | Entorno M15 y pirámide de tests | 5 |
| L02 | Tests unitarios puros de reglas de cita | 5 |
| L03 | Qué no testear y carpetas de coverage | 5 |
| L04 | Cierre semana 1 — suite dominio y bitácora | 5 |
Semana 2 — Integración, fakes y API (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L05 | Fake repositorio y reloj para tests rápidos | 5 |
| L06 | Tests de integración con persistencia | 5 |
| L07 | Tests HTTP de API — auth y validación | 5 |
| L08 | IDOR y roles — casos 403 | 5 |
Semana 3 — CI en GitHub Actions (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L09 | Workflow GitHub Actions — esqueleto | 5 |
| L10 | Lint y formato en pipeline | 5 |
| L11 | npm audit y política de dependencias | 5 |
| L12 | Badge README y artefacto de test | 5 |
Semana 4 — Review, regresión y cierre (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L13 | Checklist de code review | 5 |
| L14 | Review simulado en PR o notas | 5 |
| L15 | Política bug → test el mismo día | 5 |
| L16 | Cierre M15 — pipeline, coverage dominio, dominio | 5 |
Empieza por L01 hoy.
Lecturas (mapa rápido)
Canon: Código limpio (cap. pruebas) + El programador pragmático (testing) + docs Vitest. Ver bibliografía.
| Semana | Lecciones | Capítulos / docs | Alternativa |
|---|---|---|---|
| 1 | L01–L04 | Código limpio cap. 9 + piramide.md |
Vitest |
| 2 | L05–L08 | Mocks/fakes + tests HTTP 401/403 | OWASP Auth (selecto) |
| 3 | L09–L12 | GitHub Actions + lint + npm audit |
Workflow en repo |
| 4 | L13–L16 | Checklist review + regresiones + cierre | OWASP Testing Guide (selecto) |
Regla: un bug encontrado → test de regresión el mismo día.
Ejemplo — tabla de casos mínimos (crear cita)
| Caso | Entrada | Esperado |
|---|---|---|
| Feliz | slot libre, usuario owner | 201 + cita |
| Duplicado | mismo slot | 409 o error dominio |
| Sin auth | sin cookie/token | 401 |
| IDOR | cita de otro negocio/usuario | 403 |
| Inválido | fin antes de inicio | 400 |
Ejemplo — workflow CI mínimo (esquema)
name: ci
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "20"
- run: npm ci
- run: npm run lint
- run: npm test
- run: npm audit --audit-level=high
Ajusta rutas si el código vive en monorepo; documenta en projects/m15-calidad/README.md.
Temario semanal
Semana 1 — Pirámide y tests de dominio (~20 h)
- Unit tests puros: reglas de citas, precios, validaciones.
- Qué no testear (framework, detalles de ORM sin valor).
- Coverage en carpetas
domain/o equivalente. - Entregable: suite inicial +
piramide.md.
Semana 2 — Integración, mocks y API (~20 h)
- Tests de integración con DB de prueba o Testcontainers (si aplica).
- Fakes de reloj o repositorio en memoria para tests rápidos.
- Tests HTTP supertest/fetch contra app levantada en test.
- Ampliar casos de seguridad del Día 1.
Semana 3 — CI y calidad en el pipeline (~20 h)
- GitHub Actions: lint, test,
npm audito equivalente. - Fallar build en audit high/critical (o documentar excepciones con ticket).
- Badge o enlace al workflow en README del proyecto.
- Entregable: workflow en
.github/workflows/(repo raíz o documentado desde M15).
Semana 4 — Review, regresión y cierre (~20 h)
- Checklist de PR: estilo, tests, seguridad, migraciones, secrets.
- Simular review en PR propio o
projects/m15-calidad/review-ejemplo.md. - Política: bug encontrado → test el mismo día.
- Changelog o notas de versión si aplicas semver en el piloto.
Prácticas
- P1 — Pirámide: Tests en ≥2 capas (unit + integration o API) documentados en
projects/m15-calidad/. - P2 — CI: Workflow verde en GitHub Actions (ruta documentada en README M15).
- P3 — Checklist:
projects/m15-calidad/checklist-review.mdaplicado a un PR (captura o comentarios).
Proyecto útil
Pipeline CI verde + coverage en negocio:
- Workflow estable en main.
- Reporte de coverage (Vitest v8 o c8) enfocado en módulos de dominio.
projects/m15-calidad/README.mdexplica cómo correr tests local y en CI.
Errores comunes
- Tests que solo assertan mocks (cero confianza).
- CI opcional o saltable con
--no-verifyhabitual. - Cero tests de auth/IDOR “porque es piloto”.
- Perseguir 100 % coverage en DTOs y cero en reglas de citas.
- No pinchar versiones en CI y builds flaky sin investigar.
Evidencia de hecho
Marca la práctica en la UI solo si existe esto (o equivalente claro):
- P1 — Pirámide:
projects/m15-calidad/piramide.md+ tests enprojects/m15-calidad/tests/(o repo producto enlazado). - P2 — CI:
.github/workflows/*.ymlverde (enlace enprojects/m15-calidad/README.md). - P3 — Checklist:
projects/m15-calidad/checklist-review.md+ evidencia de uso en PR. - Proyecto — Pipeline: coverage de dominio documentado +
npm audit(o equivalente) en CI.
Criterios de dominio
- Un bug en prod (o piloto) tendría test de regresión al día siguiente.
- CI corre lint, test y audit sin pasos manuales olvidados.
- Demuestras caso 401 y 403 con test automatizado.
- Sabes explicar qué parte de la pirámide no merece E2E todavía.