Aller au contenu

Tests

Le TDD est obligatoire pour toute fonctionnalité : on aligne le besoin, on écrit les tests qui échouent (rouge), on implémente jusqu'au vert, et tous les tests passent avant de marquer la tâche terminée.

Deux tiers de tests

Tier Fichiers Ce qu'ils font
Intégration (primaire) tests/**/*.spec.ts Instancient le vrai service et frappent une SQLite :memory:.
E2E tests/e2e/ Démarrent l'app NestJS complète avec une SQLite in-memory réelle.

Les tests d'intégration sont le tier principal : ils sont rapides et exercent la logique métier réelle contre une base réelle.

Lancer les tests

pnpm run test         # tests d'intégration
pnpm run test:watch   # mode watch
pnpm run test:cov     # avec couverture
pnpm run test:e2e     # tests e2e

Tous tournent avec NODE_ENV=test.

Organisation

Les fichiers de test reflètent l'arborescence source :

Source Test
app/auth/auth.service.ts tests/app/auth/auth.service.spec.ts
web/guards/require-workspace.guard.ts tests/web/guards/require-workspace.guard.spec.ts

Setup de la base

Chaque fichier de test importe '../../db-setup' en tête. Ce module exécute, dans un beforeAll global, un sequelize.sync({ force: true }) et seede les groupes par défaut.

Le schéma est remis à zéro une fois par fichier

tests/db-setup.ts utilise beforeAll, pas beforeEach : le schéma est recréé une fois par fichier de test, pas entre chaque test. Les valeurs sous contrainte UNIQUE (noms de groupes, emails, noms de workspaces) doivent donc être distinctes entre tous les tests d'un même fichier.

Ordre de troncature et contraintes FK

Les contraintes de clés étrangères sont appliquées. Dans les beforeEach, on tronque les tables qu'on modifie en ordre enfant-d'abord, et on seede les lignes parentes (users, workspaces, groups) avant les enfants (memberships, notifications, invitations).

Factories

Les factories vivent dans tests/factories/<entity>.factory.ts et exportent build<Entity>(overrides?): <Entity> retournant une entité de domaine avec des valeurs par défaut basées sur faker.

import { buildUser } from '../../factories/user.factory';

const user = buildUser({ email: 'closer@acme.test' });

En savoir plus

Pour les patterns détaillés — seeding avec prérequis FK, stub des dépendances de service, accès typé aux modèles dans les specs — voir la compétence ikloze-testing du dépôt.