Apariencia
0039. Tests e2e: base aislada y desechable, reset por SQL directo (no migrate reset)
Estado
Aceptada
Contexto
Los tests e2e del backend corrían contra camaroneras_dev (misma base que desarrollo) y limpiaban a mano con afterAll atado a los emails creados. Resultado: cada corrida dejaba basura en la base de desarrollo (entidades no atadas a esos emails, o tests que fallaban antes del afterAll, o Ctrl-C).
Decisión
Aislar los tests en una base desechable camaroneras_test que se resetea al inicio de cada corrida (globalSetup de Jest). Tres decisiones no obvias:
Reset con
prisma migrate deploy+TRUNCATEpor SQL directo, NOprisma migrate reset. Prisma 7 trae un guard anti-IA que bloqueamigrate resetcuando detecta que lo invoca un agente (Claude Code) y exigePRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION. Como los tests se corren desde Claude Code (skillpm-cerrar-tarea),resetlos bloquearía.migrate deployes forward-only (no destructivo → sin guard) y unTRUNCATEde todas las tablas (salvo_prisma_migrations) vacía los datos manteniendo el esquema; además es más rápido.El script
test:e2ecorre con--runInBand(en serie). Los specs comparten una sola base; en paralelo, losonModuleInitde varios workers siembran los catálogos (permisos, tipos de equipo) a la vez sobre una base recién creada y compiten → fallos intermitentes. En serie es determinista. (Con la base "tibia" no se notaba porque los upserts ya eran no-op; el bug solo aparece sobre una base fresca, ej. un clon nuevo.)globalSetupauto-crea la base si no existe.docker compose upsolo creacamaroneras_dev. Para que un clon nuevo funcione sinCREATE DATABASEmanual, el setup se conecta a la basepostgresy creacamaroneras_testsi falta. Un guard aborta siDATABASE_URLno contienecamaroneras_test, para no tocar nunca la base equivocada.
No se corre seed: los catálogos se re-siembran solos en el onModuleInit de sus servicios al bootear AppModule.
Consecuencias
camaroneras_devnunca se toca; losafterAllde limpieza manual quedan redundantes (pendiente removerlos — ver backlog).- Cada dev debe crear su
.env.testlocal (gitignored) conDATABASE_URL→camaroneras_test(documentado en.env.templatey elCLAUDE.mddel backend). La base se auto-crea. - Si se agrega un
prisma db seed, revisar que elTRUNCATEno borre datos que el seed espera persistentes entre corridas.