4.1 KiB
Backend Testing
Overview
Backend tests use Node.js 24's built-in test runner and TypeScript test files. The suite is split into three layers:
| Layer | Command | Location | Purpose |
|---|---|---|---|
| Unit | npm run test |
backend/tests/*.test.ts |
Pure helpers, validators, policy decisions, service contracts, and file/session utilities |
| Integration | npm run test:integration |
backend/tests/integration/*.test.ts |
Cross-module behavior such as DB-backed access policy and Express router factory contracts |
| E2E | npm run test:e2e |
backend/tests/e2e/*.test.ts |
Real HTTP request/response checks against local Express test apps |
| Full suite | npm run test:all |
all test folders | Runs unit, integration, and e2e in sequence |
| Verification | npm run verify |
static checks plus all test folders | Runs typecheck, lint, ESM boundary checks, and the full test suite |
Current Coverage
- Request validation and
commonErrorHandlerJSON handling. - Publish, file upload/presign, upload chunk, and tour page reorder request validation contracts.
- File service path validation, structured file error payloads, and local presigned URL fallback behavior.
- Environment validation for config-only runtime settings, including normalized file-storage provider overrides.
- Circuit breaker behavior for ignored failures, recorded failures, and open breaker rejection.
- Auth service password reset, password update rejection rules, and email verification token behavior with real bcrypt and DB writes.
- Route ID/body ID update contract enforcement.
- Permission name mapping, own-user route bypass, runtime public read bypass,
and
AccessPolicypublic-user hardening. - Generic DB API and entity service object-signature contracts.
- OpenAPI route coverage and internal
$refresolution. UploadSessionManagermetadata, chunk tracking, assembly order, and cleanup behavior.createEntityRouterservice/DB option propagation, query normalization, update ID mismatch handling, and CSV export behavior.- Public runtime list blocking and response sanitization for presentation data.
- Publish service environment copy behavior for dev to stage and stage to production, including target replacement, source preservation, audio tracks, transition settings, and UI-control settings.
- Runtime context HTTP behavior for default, valid, and unsupported runtime headers.
Environment Notes
DB-backed integration tests authenticate against the configured PostgreSQL
connection. If PostgreSQL is unavailable, those tests call t.skip() with the
connection error so non-DB integration tests can still run.
npm run test:integration runs with --test-concurrency=1 because several
integration tests share a PostgreSQL transaction connection; keep DB-backed
tests sequential unless they use isolated connections.
E2E tests bind a local HTTP listener on 127.0.0.1 with an ephemeral port. In
restricted sandboxes this may require elevated permission for local socket
binding.
Test Helpers
backend/tests/http-test-utils.ts provides startTestServer(app), which starts
an Express app on an ephemeral local port and returns { baseUrl, close }.
Use it only for e2e-style tests that must exercise real HTTP semantics.
Integration tests that do not need a network socket should drive Express apps in
memory with node-mocks-http; this keeps them usable in restricted sandboxes.
Adding Tests
- Prefer unit tests for pure helpers, validators, policies, and isolated service logic.
- Use integration tests when behavior crosses route, middleware, service, DB API, or Sequelize transaction boundaries.
- Use e2e tests when the behavior depends on real HTTP parsing, headers, status codes, or socket-level request handling.
- Keep new backend tests strict TypeScript compatible and avoid casts,
any,eslint-disable, and@ts-ignore. - When config-backed behavior must be overridden in tests, mutate the typed
config object and restore it in
finally; do not rely on changingprocess.envafter modules have importedbackend/src/config.ts. - For DB integration tests, wrap writes in a transaction and roll it back.