Testing del backend
proteus-backend tiene suite de jest (jest.config.ts, ~144 archivos .test.ts). El frontend usa
Karma/Jasmine pero prácticamente no tiene tests.
npm test # toda la suite
npx jest tests/integration # solo integración HTTP
npx jest tests/integration/patient
npm run test:postgres # SPs contra Postgres real (--runInBand)
npm run test:mysql # SPs contra MySQL real
npm run test:migration # migración (los estructurales no necesitan DB)
QUIET_TESTS=0 npx jest ... # ver los console.* reales al depurar
CLAUDE.md del repo dice que no hay test runnerEstá desactualizado. Hay jest.config.ts, npm test y ~144 archivos .test.ts en tests/.
Las tres familias
tests/unit/
Unitarios puros. Ejemplo: unit/permissions.
tests/integration/
Un directorio por módulo o service. Ejercitan el borde HTTP real con supertest: el controller, el
pipeline de validación de routing-controllers y el CustomErrorHandler de producción.
No tocan red ni base: mockean los bordes (AjoloteService, AccessService, el service del módulo) con
jest.mock. Validan dos cosas:
- que class-validator funcione (requeridos, tipos, formatos, rangos);
- que los errores handleados vuelvan con el status y la forma correctos.
Módulos cubiertos: auth, atention-process, authorization, capita, document, health-center,
insurance, patient, patient-agreement, permissions, rules-engine.
Helpers compartidos en tests/integration/helpers/:
| Helper | Qué da |
|---|---|
testApp.ts | buildTestApp(controllers, opts?): una app Express mínima con el SecurityMiddleware real, la validación real y el CustomErrorHandler real |
authMock.ts | BEARER, AUTH_USER, LOCAL_USER, makeAjoloteMock(), makeAccessAuthMock(), primeHappyAuth(ajolote, access) |
validateDto.ts | validateDto(cls, payload), constraintsFor, hasError — testear un DTO sin levantar el server |
Si necesitás algo extra, va como helper local en la carpeta de tu módulo.
tests/migration/
Caracterización de stored procedures contra una base real. El motor se elige con
TEST_DB_ENGINE=mysql|postgres. Es la red de seguridad de la migración a Postgres.
Variante: validar SQL crudo contra el schema real
Para un service de SQL crudo hay un tercer tipo de red útil: capturar el SQL que genera y planificarlo con
EXPLAIN (GENERIC_PLAN) (Postgres 16+), que valida una consulta con $n sin ejecutarla ni bindear
params.
No necesita que las tablas tengan datos y caza tabla o columna inexistente, sintaxis, función que no existe y tipos incompatibles.
Molde: tests/integration/control-dashboard/control-dashboard-sql.test.ts (42 queries de 8 endpoints). Se
gatea con hasTestDatabase(), igual que los tests de SPs. Receta completa en
Porteo de SQL.
Config
preset: ts-jest · roots: tests/ · testMatch: **/*.test.ts · testTimeout: 60s ·
setupFiles: [reflect-metadata, loadEnv] (TypeORM necesita reflect-metadata) ·
setupFilesAfterEach: quietConsole (silencia el ruido de console.* del código de producción) ·
moduleNameMapper que replica los alias de paths.
Gotchas
- El archivo debe terminar en
.test.ts(no.spec.ts), o jest no lo descubre. - Un alias nuevo hay que agregarlo también al
moduleNameMapperdejest.config.ts, no solo atsconfig.jsonyAppConfig.ts. Ver Arquitectura. - Los tests de SP corren
--runInBanda propósito: comparten la base. - Los módulos ESM-only rompen ts-jest (
file-typefue el caso). Se resuelven con un mock virtual en el test. - Un service "v2" muy acoplado puede no ser unit-testeable en aislamiento. En esos casos el test de integración HTTP es la única cobertura razonable: no fuerces el unitario.