gestion_table_tournante_libre/vitest.config.js

105 lines
6 KiB
JavaScript
Raw Permalink Normal View History

// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
// Un seul lanceur, trois projets (§ 14.4, § 14.8).
//
// node fonctions pures, sans DOM et sans greffon Svelte : un module qui
// importerait un composant échoue au chargement.
// node-long épreuves lourdes, hors de la série surveillée. Leur durée croît
// avec l'application : chacune dispose de deux minutes, là où le
// délai par défaut de Vitest, 5 s, la ferait échouer par
// dépassement et non sur un défaut. Ce délai arrête un test
// bloqué ; le plafond de la série est celui du rapporteur.
// navigateur un vrai moteur de rendu. Le projet étend vite.config.js : un
// module s'y résout par les mêmes greffons et réglages que dans la
// construction du livrable, sans seconde configuration à tenir
// d'accord avec la première. Il joue les épreuves de src/ et
// celles de l'outillage partagé de test/navigateur/.
import { defineConfig } from 'vitest/config';
import { playwright } from '@vitest/browser-playwright';
[ADD] install: Node 26 and system packages, per family and under Nix ./install.sh installs what is missing through apt, dnf, zypper or pacman, then Node of the .node-version major from nodejs.org, SHA-256 checked, outside the repository, then npm ci and Electron's binary, which its package no longer fetches at install; ldd refuses a missing library. ./install_dev.sh adds Playwright's Chromium, fonts, and podman on amd64. Under NixOS a pinned shell.nix provides Node, Electron and Chromium, which the browser tests then launch. Build-script tests run on Linux only, where § 16 builds. Checked: ten library tests, three mutations caught; local install. --- FR --- [ADD] installation : Node 26 et paquets du système, par famille et Nix ./install.sh installe ce qui manque par apt, dnf, zypper ou pacman, puis Node de la majeure de .node-version, de nodejs.org, somme SHA-256 vérifiée, hors du dépôt, puis npm ci et le binaire d'Electron, que son paquet ne télécharge plus à l'installation ; ldd refuse une bibliothèque absente. ./install_dev.sh ajoute le Chromium de Playwright, des polices, et podman sur amd64. Sous NixOS, un shell.nix épinglé fournit Node, Electron et Chromium, que lancent alors les épreuves du navigateur. Les épreuves du script de construction ne se jouent que sous Linux (§ 16). Vérifié : dix épreuves de la bibliothèque, trois mutations attrapées ; installation locale. Assisted-by: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EUXSGcwCLSC69FWEdCtWSb
2026-10-06 05:51:48 -04:00
import { optionsChromium } from './test/chromium.js';
[IMP] tests: watched series adapts to the core count, threads below 4 Below four cores the runner carried the watched series in one process, and a relaunch after a base module took 2.5 to 3 s, over the 2 s budget of § 14.14. The configuration now reads the cores the process may use: from four, full processes and the whole series, as before; below, threads on every core, and the end-to-end test moves to the long series. No test disappears or changes behaviour. A guard refuses, in these series, what a thread refuses and a process accepts; the reporter names the mode. Checked: relaunch on 2 cores 1.0 to 1.3 s, was 2.5 to 3.0; on 4 cores 1.2 to 1.5 s; process.env is copied per thread, measured. --- FR --- [IMP] épreuves : la série surveillée suit les cœurs, threads sous 4 Sous quatre cœurs, le lanceur portait la série surveillée dans un seul processus, et une relance après un module de base prenait 2,5 à 3 s, au-delà du budget de 2 s du § 14.14. La configuration lit les cœurs que le processus peut occuper : à partir de quatre, processus complets et série entière, comme avant ; en deçà, threads sur tous les cœurs, et l'épreuve de bout en bout passe dans la série longue. Aucune épreuve ne disparaît ni ne change. Une garde refuse dans ces séries ce qu'un thread refuse et qu'un processus accepte ; le rapporteur nomme le mode. Vérifié : relance sur 2 cœurs en 1,0 à 1,3 s, contre 2,5 à 3,0 ; sur 4 cœurs en 1,2 à 1,5 s ; process.env est copié par thread, mesuré. Assisted-by: Claude Opus 5.5
2026-10-06 04:54:01 -04:00
import { coeursDisponibles, reglagesSeries } from './test/machine.js';
// Les séries node suivent le nombre de cœurs de la machine (test/machine.js) :
// en deçà de quatre, des threads sur tous les cœurs, et les épreuves lourdes
// de la série surveillée passent dans la série longue (§ 14.14).
const SERIES = reglagesSeries(coeursDisponibles());
const PROCESSUS = { pool: SERIES.pool, maxWorkers: SERIES.maxWorkers };
export default defineConfig({
test: {
// test/rapporteur.js imprime, après le bilan par défaut, la durée de
// chaque projet et les dix épreuves les plus lentes, et fait échouer
// l'exécution quand node ou node-long dépasse son plafond (§ 14.14). Un
// chemin relatif se lit depuis la racine du projet.
reporters: ['default', './test/rapporteur.js'],
[ADD] tests: per-module coverage, 100 % branch floors, layer guards make couverture runs the node series under V8 instrumentation and prints one row per module, full ones included, plus a line-by-line HTML report. Four modules hold a hard 100 % branch floor — indicateurs.js, plafond.js, depot.js, journal.js — and the command fails below it; there is no global threshold, which covering the easy modules would satisfy. The tree guard refuses a lowered or global floor, a floor on a file the measure never loads, and a command that does not measure. It extends determinism and layer boundaries to src/stockage, src/csv and src/application (§ 13.4), and no longer takes a string literal for DOM access. Checked: 1266 node tests; the four floors at 100 %. --- FR --- [ADD] épreuves : couverture par module, seuils durs, gardes des couches make couverture joue la série node sous l'instrumentation de V8 et imprime une ligne par module, pleins compris, et un rapport HTML ligne à ligne. Quatre modules tiennent un seuil dur de 100 % des branches — indicateurs.js, plafond.js, depot.js, journal.js — et la commande échoue en deçà ; aucun seuil global, qu'on satisferait en couvrant les modules faciles. La garde de l'arborescence refuse un seuil abaissé ou global, un seuil sur un fichier que la mesure ne charge pas, et une commande qui ne mesure pas. Elle étend le déterminisme et les frontières des couches à src/stockage, src/csv et src/application (§ 13.4), et ne prend plus une chaîne littérale pour le DOM. Vérifié : 1266 épreuves node ; les quatre seuils à 100 %. Assisted-by: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EUXSGcwCLSC69FWEdCtWSb
2026-10-06 20:41:23 -04:00
// La couverture (§ 14.13), que lancent npm run couverture et make
// couverture : la série node sous l'instrumentation de V8, sans le
// rapporteur, dont les plafonds bornent la série surveillée et la série
// longue, non une mesure. Aucun seuil global : un pourcentage d'ensemble
// se satisfait en couvrant les modules faciles. Le tableau imprime une
// ligne par couche et par module de src/, pleins compris — que Vitest
// tait sinon quand un agent le lance — et à 0 % ceux qu'aucune épreuve ne
// charge ; coverage/index.html montre, ligne à ligne, ce qui n'est jamais
// exécuté. Quatre modules tiennent 100 % de branches, seuil dur : la
// commande échoue en deçà. Une branche nue s'y couvre par un cas ajouté,
// ou part avec le code mort ; le seuil ne s'abaisse pas, et
// test/arborescence.test.js garde ces quatre seuils, ces deux rapports
// et les deux commandes qui lancent la mesure.
coverage: {
provider: 'v8',
include: ['src/**/*.js'],
exclude: ['src/**/*.test.js'],
reporter: [['text', { skipFull: false }], 'html'],
reportsDirectory: 'coverage',
thresholds: {
'src/moteur/indicateurs.js': { branches: 100 },
'src/moteur/plafond.js': { branches: 100 },
'src/stockage/depot.js': { branches: 100 },
'src/stockage/journal.js': { branches: 100 },
},
},
// Sous surveillance, une épreuve se relance quand un module de son graphe
// d'imports change. Les fichiers des motifs se lisent hors de tout
// graphe : le contrôle de version (§ 18.5) lit les premiers par le
// système de fichiers ; la coquille s'exécute dans un processus à part,
// la configuration d'electron-builder se charge par un require natif et
// lit capacitor.config.json, et le script de construction se lance
// depuis une copie. Chaque motif rattache ses fichiers aux épreuves qui
// les lisent, et au contrôle de version quand son point 6 les balaie. Un
// fichier qui répond à un motif ne relance que les épreuves nommées, et
// plus celles qui l'importeraient : un motif ne nomme donc aucun fichier
// qu'une épreuve importe. L'option se lit au niveau du lanceur : posée
// dans un projet, elle est ignorée sans avertissement.
watchTriggerPatterns: [
{ pattern: /(^|\/)(version\.json|package-lock\.json|CHANGELOG\.md|README\.md|GUIDE-[^/]*\.md)$/,
testsToRun: () => 'scripts/version.test.js' },
{ pattern: /(^|\/)electron\/[^/]+$/,
testsToRun: () => ['test/coquille.test.js', 'test/livrable.test.js', 'scripts/version.test.js'] },
{ pattern: /(^|\/)test\/electron_factice\.js$/,
testsToRun: () => ['test/coquille.test.js', 'scripts/version.test.js'] },
{ pattern: /(^|\/)(electron-builder\.config\.cjs|capacitor\.config\.json)$/,
testsToRun: () => ['test/livrable.test.js', 'scripts/construire_windows.test.js', 'scripts/version.test.js'] },
{ pattern: /(^|\/)scripts\/construire_windows\.sh$/,
testsToRun: () => ['scripts/construire_windows.test.js', 'scripts/version.test.js'] },
],
projects: [
{ test: {
[IMP] tests: watched series adapts to the core count, threads below 4 Below four cores the runner carried the watched series in one process, and a relaunch after a base module took 2.5 to 3 s, over the 2 s budget of § 14.14. The configuration now reads the cores the process may use: from four, full processes and the whole series, as before; below, threads on every core, and the end-to-end test moves to the long series. No test disappears or changes behaviour. A guard refuses, in these series, what a thread refuses and a process accepts; the reporter names the mode. Checked: relaunch on 2 cores 1.0 to 1.3 s, was 2.5 to 3.0; on 4 cores 1.2 to 1.5 s; process.env is copied per thread, measured. --- FR --- [IMP] épreuves : la série surveillée suit les cœurs, threads sous 4 Sous quatre cœurs, le lanceur portait la série surveillée dans un seul processus, et une relance après un module de base prenait 2,5 à 3 s, au-delà du budget de 2 s du § 14.14. La configuration lit les cœurs que le processus peut occuper : à partir de quatre, processus complets et série entière, comme avant ; en deçà, threads sur tous les cœurs, et l'épreuve de bout en bout passe dans la série longue. Aucune épreuve ne disparaît ni ne change. Une garde refuse dans ces séries ce qu'un thread refuse et qu'un processus accepte ; le rapporteur nomme le mode. Vérifié : relance sur 2 cœurs en 1,0 à 1,3 s, contre 2,5 à 3,0 ; sur 4 cœurs en 1,2 à 1,5 s ; process.env est copié par thread, mesuré. Assisted-by: Claude Opus 5.5
2026-10-06 04:54:01 -04:00
name: 'node', environment: 'node', ...PROCESSUS,
include: ['src/**/*.test.js', 'scripts/**/*.test.js', 'test/**/*.test.js'],
[IMP] tests: watched series adapts to the core count, threads below 4 Below four cores the runner carried the watched series in one process, and a relaunch after a base module took 2.5 to 3 s, over the 2 s budget of § 14.14. The configuration now reads the cores the process may use: from four, full processes and the whole series, as before; below, threads on every core, and the end-to-end test moves to the long series. No test disappears or changes behaviour. A guard refuses, in these series, what a thread refuses and a process accepts; the reporter names the mode. Checked: relaunch on 2 cores 1.0 to 1.3 s, was 2.5 to 3.0; on 4 cores 1.2 to 1.5 s; process.env is copied per thread, measured. --- FR --- [IMP] épreuves : la série surveillée suit les cœurs, threads sous 4 Sous quatre cœurs, le lanceur portait la série surveillée dans un seul processus, et une relance après un module de base prenait 2,5 à 3 s, au-delà du budget de 2 s du § 14.14. La configuration lit les cœurs que le processus peut occuper : à partir de quatre, processus complets et série entière, comme avant ; en deçà, threads sur tous les cœurs, et l'épreuve de bout en bout passe dans la série longue. Aucune épreuve ne disparaît ni ne change. Une garde refuse dans ces séries ce qu'un thread refuse et qu'un processus accepte ; le rapporteur nomme le mode. Vérifié : relance sur 2 cœurs en 1,0 à 1,3 s, contre 2,5 à 3,0 ; sur 4 cœurs en 1,2 à 1,5 s ; process.env est copié par thread, mesuré. Assisted-by: Claude Opus 5.5
2026-10-06 04:54:01 -04:00
exclude: ['**/*.long.test.js', '**/*.navigateur.test.js', 'node_modules/**',
...SERIES.horsSerieSurveillee] } },
{ test: {
[IMP] tests: watched series adapts to the core count, threads below 4 Below four cores the runner carried the watched series in one process, and a relaunch after a base module took 2.5 to 3 s, over the 2 s budget of § 14.14. The configuration now reads the cores the process may use: from four, full processes and the whole series, as before; below, threads on every core, and the end-to-end test moves to the long series. No test disappears or changes behaviour. A guard refuses, in these series, what a thread refuses and a process accepts; the reporter names the mode. Checked: relaunch on 2 cores 1.0 to 1.3 s, was 2.5 to 3.0; on 4 cores 1.2 to 1.5 s; process.env is copied per thread, measured. --- FR --- [IMP] épreuves : la série surveillée suit les cœurs, threads sous 4 Sous quatre cœurs, le lanceur portait la série surveillée dans un seul processus, et une relance après un module de base prenait 2,5 à 3 s, au-delà du budget de 2 s du § 14.14. La configuration lit les cœurs que le processus peut occuper : à partir de quatre, processus complets et série entière, comme avant ; en deçà, threads sur tous les cœurs, et l'épreuve de bout en bout passe dans la série longue. Aucune épreuve ne disparaît ni ne change. Une garde refuse dans ces séries ce qu'un thread refuse et qu'un processus accepte ; le rapporteur nomme le mode. Vérifié : relance sur 2 cœurs en 1,0 à 1,3 s, contre 2,5 à 3,0 ; sur 4 cœurs en 1,2 à 1,5 s ; process.env est copié par thread, mesuré. Assisted-by: Claude Opus 5.5
2026-10-06 04:54:01 -04:00
name: 'node-long', environment: 'node', ...PROCESSUS,
include: ['src/**/*.long.test.js', 'test/**/*.long.test.js', ...SERIES.horsSerieSurveillee],
testTimeout: 120_000 } },
{ extends: './vite.config.js',
test: {
name: 'navigateur',
include: ['src/**/*.navigateur.test.js', 'test/**/*.navigateur.test.js'],
[ADD] install: Node 26 and system packages, per family and under Nix ./install.sh installs what is missing through apt, dnf, zypper or pacman, then Node of the .node-version major from nodejs.org, SHA-256 checked, outside the repository, then npm ci and Electron's binary, which its package no longer fetches at install; ldd refuses a missing library. ./install_dev.sh adds Playwright's Chromium, fonts, and podman on amd64. Under NixOS a pinned shell.nix provides Node, Electron and Chromium, which the browser tests then launch. Build-script tests run on Linux only, where § 16 builds. Checked: ten library tests, three mutations caught; local install. --- FR --- [ADD] installation : Node 26 et paquets du système, par famille et Nix ./install.sh installe ce qui manque par apt, dnf, zypper ou pacman, puis Node de la majeure de .node-version, de nodejs.org, somme SHA-256 vérifiée, hors du dépôt, puis npm ci et le binaire d'Electron, que son paquet ne télécharge plus à l'installation ; ldd refuse une bibliothèque absente. ./install_dev.sh ajoute le Chromium de Playwright, des polices, et podman sur amd64. Sous NixOS, un shell.nix épinglé fournit Node, Electron et Chromium, que lancent alors les épreuves du navigateur. Les épreuves du script de construction ne se jouent que sous Linux (§ 16). Vérifié : dix épreuves de la bibliothèque, trois mutations attrapées ; installation locale. Assisted-by: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EUXSGcwCLSC69FWEdCtWSb
2026-10-06 05:51:48 -04:00
browser: { enabled: true, headless: true, provider: playwright(optionsChromium(process.env)),
instances: [{ browser: 'chromium' }] } } },
],
},
});