Ir al contenido

Tests

Ventana de terminal
bun test --preload ./test/setup.ts

Tres capas en una sola corrida:

Capa Qué cubre DB
Unitarios (test/unit/) Servicios, utils, lógica pura No
HTTP (test/http.test.ts) Rutas vía app.handle, validaciones, 4xx No
E2E (test/e2e/) Flujos completos con Eden Treaty Sí (pisa_api_test)

Los e2e truncan todas las tablas entre tests: la base es desechable. El rol por defecto pisa no tiene CREATEDB, así que el CREATE DATABASE va como superusuario:

Ventana de terminal
podman exec mi_postgres psql -U postgres -d postgres \
-c "CREATE DATABASE pisa_api_test OWNER pisa;"
DATABASE_URL=postgresql://pisa:pisa_password@localhost:5432/pisa_api_test \
bun --bun ./node_modules/drizzle-kit/bin.cjs push
podman exec -i mi_postgres psql -U pisa -d pisa_api_test < src/db/triggers.sql

test/setup.ts fuerza DATABASE_URL y TEST_DATABASE_URL hacia esa base (asignación forzada, no ??=, porque Bun auto-carga .env), así que nunca toca tu base de desarrollo.

Ventana de terminal
env -u DATABASE_URL -u TEST_DATABASE_URL \
bun test --preload ./test/setup.ts test/e2e/reservas.test.ts

Des-entornar las variables evita que una DATABASE_URL exportada en la shell gane sobre la de tests.

  • Eden Treaty (treaty<App>(app)) contra la instancia real: tipos end-to-end sin red.
  • test/e2e/ayuda.ts aporta el harness: api, limpiarDB() (TRUNCATE … CASCADE de 23 tablas), adminBootstrap() idempotente, loginAdmin(), eventoBase() e importarDos().
  • Los timers no se esperan: los jobs se disparan por su endpoint HTTP con x-cron-secret.

Trampas ya resueltas (no redescubrir):

  • .post()/.get() van directo sobre el recurso; segmentos dinámicos con api.participantes({ id }).
  • El multipart (t.File()) no lo infiere treaty: se usa app.handle + FormData.
  • t.Union(enum.enumValues.map(...)) colapsa el tipo a never: en los schemas van tuplas explícitas de t.Literal.
  • Rate limit alto solo en el proceso de test (RATE_LIMIT_MAX=100000, asignación forzada en ayuda.ts).
Ventana de terminal
bunx tsc --noEmit --moduleResolution bundler --module ES2022 --target ES2021 --strict --skipLibCheck --types bun-types
bunx biome lint ./src
bun test --preload ./test/setup.ts
bunx drizzle-kit check