import { defineConfig } from "vitest/config";

/**
 * Environnement `node` par défaut (démarrage quasi instantané). Les rares
 * fichiers qui ont besoin du DOM déclarent leur propre environnement via un
 * docblock en tête de fichier :
 *
 *     // @vitest-environment jsdom
 *
 * Aucun test ne démarre de conteneur ni de vraie base : les routes API sont
 * testées via `fastify.inject()` avec un faux pool (test/helpers/fakePool.js),
 * et les tests a11y parsent le HTML statique avec jsdom + axe-core.
 */
export default defineConfig({
  test: {
    environment: "node",
    // Pool laissé au défaut (forks) : mesuré contre les alternatives sur cette
    // suite, 401 tests —
    //   forks (défaut)            : 3,5 s
    //   threads, isolate: true    : lent
    //   threads, isolate: false   : 18,8 s (mise en place de jsdom pénalisée)
    // L'intuition « threads sans isolation = plus rapide » est fausse ici.
    // Re-mesurer avant de changer.
    include: ["apps/*/test/**/*.test.js"],
    reporters: ["default"],
    coverage: {
      provider: "v8",
      reporter: ["text", "lcov"],
      include: ["apps/api/src/**/*.js"],
      // migrate.js s'exécute au démarrage du conteneur et appelle process.exit :
      // le couvrir demanderait une vraie base, ce qu'on s'interdit ici.
      // server.js n'est qu'un point d'entrée (5 lignes), la logique est dans app.js.
      exclude: ["apps/api/src/migrate.js", "apps/api/src/server.js"],
      // Seuils = cliquet anti-régression. Ils ne prouvent PAS que les tests
      // vérifient quelque chose (seule la mutation le fait, cf. `npm run
      // test:mutation`), mais ils empêchent d'ajouter du code non exécuté.
      thresholds: {
        statements: 85,
        branches: 80,
        functions: 85,
        lines: 85,
      },
    },
  },
});
