Aller au contenu

Tests

Le backend utilise trois couches de test : les tests unitaires Jest, les suites e2e Jest et les tranches rollback sur base réelle (*.e2e.ts dans src/). Les tranches sur base réelle sont les principaux tests d’intégration car le SQL Kysely se vérifie mieux contre un vrai PostgreSQL.

pnpm test exécute Jest sur src/**/*.spec.ts.

test/kysely-stub.cjs stubbe le paquet kysely (ESM uniquement) pour que Jest puisse le require :

class Kysely {}
class PostgresDialect {}
const sql = () => ({ execute: async () => ({ rows: [] }) });
module.exports = { Kysely, PostgresDialect, sql };

Les tests unitaires se concentrent donc sur l’orchestration (services) et les builders purs (builders de modèles PDF), pas sur le SQL réel.

test/jest-e2e.json configure ts-jest avec des stubs ESM :

{
"testRegex": ".e2e-spec.ts$",
"moduleNameMapper": {
"^kysely$": "<rootDir>/kysely-stub.cjs",
"^puppeteer$": "<rootDir>/puppeteer-stub.cjs"
},
"setupFiles": ["<rootDir>/jest-e2e.setup.ts"]
}

test/jest-e2e.setup.ts désactive cron et définit NODE_ENV=test.

  • test/app.e2e-spec.ts — démarre AppModule, vérifie 401 sur /api/v1, 404 sur /
  • test/auth.e2e-spec.ts — flux d’auth complet avec surcharges de repository en mémoire (login, me, refus RBAC, rotation refresh, denylist au logout)

test/puppeteer-stub.cjs empêche Puppeteer de se charger dans Jest.

Chaque src/<module>/<module>.e2e.ts est un script autonome exécuté par pnpm db:slice:<module>. Ils compilent un module de test Nest, exécutent des opérations dans une transaction scope.audit(...) qui lève un rollback-marker, puis vérifient que la transaction est bien annulée.

Fenêtre de terminal
pnpm db:slice:core
pnpm db:slice:client
pnpm db:slice:admin
pnpm db:slice:finances
pnpm db:slice:facturation
pnpm db:slice:market
pnpm db:slice:pressing
pnpm db:slice:restaurant
pnpm db:slice:salle-fete
pnpm db:slice:rh
pnpm db:slice:audit
pnpm db:slice:uploads

Une tranche typique :

  1. Démarre Test.createTestingModule([...]).
  2. Seed des données de test dans un scope.audit(actor, async (a, tx) => { ... }).
  3. Lit les résultats et vérifie l’attribution d’audit.
  4. Lance new Error('rollback-marker').
  5. Attrape le marqueur et vérifie que rien n’a persisté.

Par exemple, admin/admin.e2e.ts vérifie :

  • mot_de_passe n’est pas retourné par les lectures du repository
  • les lignes audit.journal_audit contiennent *** ou ne contiennent pas le mot de passe en clair
  • les lignes d’audit sont attribuées à l’utilisateur actant
  • l’utilisateur de test n’existe plus après le rollback

pnpm db:smoke exécute src/db/smoke.ts, qui exerce le type Database généré et la connectivité de base contre une instance PostgreSQL réelle.

Fenêtre de terminal
pnpm db:verify

C’est la commande recommandée après tout changement de schéma ou de backend. Elle migre la base voisine, régénère les types, exécute tsc --noEmit, les tests unitaires, le test de fumée et les tranches sur base réelle.