@mostajs/mjs-unit 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -2
- package/bin/cli.mjs +42 -11
- package/dist/index.d.ts +54 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +207 -23
- package/dist/index.js.map +1 -1
- package/dist/report.d.ts +12 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +45 -0
- package/dist/report.js.map +1 -1
- package/llms.txt +16 -5
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -64,6 +64,12 @@ test("async", async () => { ok(await maFonction.async()); });
|
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
> Ne pas appeler `run()` dans le fichier : le **runner** s'en charge (les cas enregistrés via `test()` sont exécutés groupés par fichier).
|
|
67
|
+
>
|
|
68
|
+
> **Depuis 0.7.0, le runner relève ce qu'il a exécuté** : par fichier, cas enregistrés contre cas
|
|
69
|
+
> exécutés, et il imprime le compte (`✓ 49/49 test(s) exécutés sur 7 fichier(s)`). Un fichier sans
|
|
70
|
+
> aucun test fait échouer la suite ; un fichier qui appelle `run()` lui-même reste au rapport ; et
|
|
71
|
+
> `node fichier.test.mjs` dont les cas ne sont jamais exécutés sort en code 1, avec un message —
|
|
72
|
+
> l'absence de résultat n'est pas un succès.
|
|
67
73
|
|
|
68
74
|
## Lancer
|
|
69
75
|
|
|
@@ -83,12 +89,26 @@ npm run build >/dev/null
|
|
|
83
89
|
node node_modules/@mostajs/mjs-unit/bin/cli.mjs test-scripts/*.test.mjs
|
|
84
90
|
```
|
|
85
91
|
|
|
92
|
+
## Rapport JUnit XML (0.8.0)
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
mjs-unit test-scripts/*.test.mjs --junit=test-scripts/.out/junit.xml --timeout=10000
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Le fichier suit le schéma lu par Jenkins, GitLab (`artifacts:reports:junit`), GitHub et QATrax : une
|
|
99
|
+
`<testsuite>` par fichier, un `<testcase name classname file time>` par cas, `<failure>` pour une assertion
|
|
100
|
+
tombée, `<error>` pour une exception inattendue ou un délai dépassé, `<skipped message>` pour un cas ignoré,
|
|
101
|
+
les étiquettes en `<property name="tag">`. `--tag=securite` ne joue que les cas étiquetés.
|
|
102
|
+
|
|
86
103
|
## API
|
|
87
104
|
|
|
88
105
|
| Fonction | Rôle |
|
|
89
106
|
|---|---|
|
|
90
|
-
| `test(name, fn
|
|
91
|
-
| `
|
|
107
|
+
| `test(name, fn, { timeout?, tags? })` | Enregistre un cas (sync ou async) ; délai et étiquettes à la JUnit |
|
|
108
|
+
| `test.skip(name, fn?, raison?)` | Cas ignoré, raison rapportée (`@Disabled`) |
|
|
109
|
+
| `test.each(table)(name, fn)` | Un cas par ligne ; `%s`, `%i`, `$cle` dans le nom (`@ParameterizedTest`) |
|
|
110
|
+
| `describe(group, body)` | Groupe : préfixe les noms, et devient le `classname` JUnit |
|
|
111
|
+
| `beforeAll/afterAll/beforeEach/afterEach(fn)` | Crochets, au niveau du fichier ou d'un `describe` |
|
|
92
112
|
| `expect(v).toBe/toEqual/toBeTruthy/toBeFalsy/toContain` | Assertions fluides |
|
|
93
113
|
| `ok/equal/deepEqual(...)` | Assertions directes |
|
|
94
114
|
| `throwsAsync/doesNotThrowAsync(fn)` | Vérifie qu'une promesse (ne) lève (pas) |
|
package/bin/cli.mjs
CHANGED
|
@@ -6,16 +6,20 @@
|
|
|
6
6
|
* Usage : mjs-unit <fichier-de-test...> [options]
|
|
7
7
|
* --report[=fichier] écrit une preuve HTML (défaut : test-report.html)
|
|
8
8
|
* --json[=fichier] écrit un rapport JSON (défaut : test-report.json)
|
|
9
|
-
* --
|
|
9
|
+
* --junit[=fichier] écrit un rapport JUnit XML (défaut : test-report.xml) — Jenkins, GitLab, GitHub, QATrax
|
|
10
|
+
* --timeout=ms délai par défaut de chaque cas (un cas le surcharge par { timeout })
|
|
11
|
+
* --tag=a,b ne joue que les cas étiquetés a ou b ; les autres sont rapportés ignorés
|
|
12
|
+
* --title="…" titre des rapports
|
|
10
13
|
*
|
|
11
14
|
* @author Dr Hamid MADANI <drmdh@msn.com> · AGPL-3.0-or-later
|
|
12
15
|
*/
|
|
13
16
|
import { register } from "node:module";
|
|
14
17
|
import { pathToFileURL } from "node:url";
|
|
15
18
|
import { writeFileSync } from "node:fs";
|
|
19
|
+
import { hostname } from "node:os";
|
|
16
20
|
|
|
17
21
|
register(new URL("../loader.mjs", import.meta.url));
|
|
18
|
-
const { run, pending } = await import("../dist/index.js");
|
|
22
|
+
const { run, pending, registered, takeRuns, setDefaultTimeout, setTagFilter } = await import("../dist/index.js");
|
|
19
23
|
|
|
20
24
|
// ── Découpe arguments / options ──────────────────────────────────────────────
|
|
21
25
|
const argv = process.argv.slice(2);
|
|
@@ -27,26 +31,48 @@ const opt = (name) => {
|
|
|
27
31
|
};
|
|
28
32
|
const htmlOut = opt("report"); // "" si présent sans valeur, undefined si absent
|
|
29
33
|
const jsonOut = opt("json");
|
|
34
|
+
const junitOut = opt("junit");
|
|
30
35
|
const title = opt("title");
|
|
36
|
+
if (opt("timeout")) setDefaultTimeout(Number(opt("timeout")));
|
|
37
|
+
if (opt("tag")) setTagFilter(opt("tag").split(","));
|
|
31
38
|
const files = argv.filter((a) => !a.startsWith("--"));
|
|
32
39
|
if (!files.length) { console.error("usage: mjs-unit <fichier-de-test...> [--report[=f]] [--json[=f]]"); process.exit(2); }
|
|
33
40
|
|
|
34
41
|
// ── Exécution, une suite par fichier ─────────────────────────────────────────
|
|
35
|
-
|
|
42
|
+
// Le CLI DEMANDE au module ce qui a été enregistré et ce qui a été exécuté, fichier par fichier : il
|
|
43
|
+
// ne suppose rien. Deux trous fermés en 0.7.0 — un fichier qui appelait run() lui-même s'exécutait
|
|
44
|
+
// hors du rapport, et un fichier sans aucun test disparaissait sans un mot.
|
|
45
|
+
let totalFail = 0, totalDeclares = 0, totalExecutes = 0;
|
|
36
46
|
const suites = [];
|
|
37
47
|
for (const f of files) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
48
|
+
const avant = registered();
|
|
49
|
+
takeRuns(); // rien d'un fichier précédent ne doit être attribué à celui-ci
|
|
50
|
+
await import(pathToFileURL(f).href); // le fichier enregistre ses cas (et peut appeler run() lui-même)
|
|
51
|
+
if (pending() > 0) await run(f); // on exécute les cas restants, groupés par fichier
|
|
52
|
+
const declares = registered() - avant;
|
|
53
|
+
const executions = takeRuns();
|
|
54
|
+
const { classnameDe } = await import("../dist/report.js");
|
|
55
|
+
const results = executions.flatMap((r) => r.results).map((r) => ({ ...r, classname: classnameDe(f, r.groups) }));
|
|
56
|
+
const cas = results.filter((r) => !r.hook); // un crochet en échec est rapporté, mais n'est pas un cas déclaré
|
|
57
|
+
totalFail += executions.reduce((n, r) => n + r.failed, 0);
|
|
58
|
+
if (declares === 0) {
|
|
59
|
+
console.error(`\n✗ ${f} : aucun test enregistré — un fichier de test vide n'est pas un succès.`);
|
|
60
|
+
totalFail++;
|
|
61
|
+
continue;
|
|
43
62
|
}
|
|
63
|
+
if (cas.length !== declares) {
|
|
64
|
+
console.error(`\n✗ ${f} : ${declares} test(s) enregistré(s), ${cas.length} exécuté(s).`);
|
|
65
|
+
totalFail++;
|
|
66
|
+
}
|
|
67
|
+
totalDeclares += declares; totalExecutes += cas.length;
|
|
68
|
+
suites.push({ file: f, results });
|
|
44
69
|
}
|
|
70
|
+
console.log(`\n${totalExecutes === totalDeclares ? "✓" : "✗"} ${totalExecutes}/${totalDeclares} test(s) exécutés sur ${suites.length} fichier(s) — compte relevé auprès du module, pas supposé`);
|
|
45
71
|
|
|
46
72
|
// ── Reporters optionnels ─────────────────────────────────────────────────────
|
|
47
|
-
if (htmlOut !== undefined || jsonOut !== undefined) {
|
|
48
|
-
const { renderHtmlReport, renderJsonReport } = await import("../dist/report.js");
|
|
49
|
-
const report = { suites, generatedAt: new Date().toISOString(), title: title || undefined };
|
|
73
|
+
if (htmlOut !== undefined || jsonOut !== undefined || junitOut !== undefined) {
|
|
74
|
+
const { renderHtmlReport, renderJsonReport, renderJunitReport } = await import("../dist/report.js");
|
|
75
|
+
const report = { suites, generatedAt: new Date().toISOString(), title: title || undefined, hostname: hostname() };
|
|
50
76
|
if (htmlOut !== undefined) {
|
|
51
77
|
const out = htmlOut || "test-report.html";
|
|
52
78
|
writeFileSync(out, renderHtmlReport(report));
|
|
@@ -57,6 +83,11 @@ if (htmlOut !== undefined || jsonOut !== undefined) {
|
|
|
57
83
|
writeFileSync(out, renderJsonReport(report));
|
|
58
84
|
console.log(`📄 Rapport JSON : ${out}`);
|
|
59
85
|
}
|
|
86
|
+
if (junitOut !== undefined) {
|
|
87
|
+
const out = junitOut || "test-report.xml";
|
|
88
|
+
writeFileSync(out, renderJunitReport(report));
|
|
89
|
+
console.log(`📄 Rapport JUnit XML : ${out}`);
|
|
90
|
+
}
|
|
60
91
|
}
|
|
61
92
|
|
|
62
93
|
if (totalFail > 0) process.exitCode = 1;
|
package/dist/index.d.ts
CHANGED
|
@@ -6,18 +6,42 @@
|
|
|
6
6
|
* @author Dr Hamid MADANI <drmdh@msn.com>
|
|
7
7
|
* @license AGPL-3.0-or-later
|
|
8
8
|
*/
|
|
9
|
+
/** Options d'un cas (0.8.0, à la manière de JUnit 5 : @Timeout, @Tag, @Disabled). */
|
|
10
|
+
export interface TestOptions {
|
|
11
|
+
timeout?: number;
|
|
12
|
+
tags?: string[];
|
|
13
|
+
skip?: boolean | string;
|
|
14
|
+
}
|
|
15
|
+
type Fn = (...a: any[]) => void | Promise<void>;
|
|
9
16
|
export interface TestCase {
|
|
10
17
|
name: string;
|
|
11
|
-
fn:
|
|
18
|
+
fn: Fn;
|
|
12
19
|
skip?: boolean;
|
|
20
|
+
skipReason?: string;
|
|
21
|
+
title?: string;
|
|
22
|
+
groups?: string[];
|
|
23
|
+
timeout?: number;
|
|
24
|
+
tags?: string[];
|
|
13
25
|
}
|
|
14
|
-
/** Enregistre un test (exécuté par `run()`). */
|
|
15
|
-
export declare function test(name: string, fn:
|
|
26
|
+
/** Enregistre un test (exécuté par `run()`). `opts` : { timeout (ms), tags, skip } — comme @Timeout, @Tag, @Disabled. */
|
|
27
|
+
export declare function test(name: string, fn: Fn, opts?: TestOptions): void;
|
|
16
28
|
export declare namespace test {
|
|
17
|
-
var skip: (name: string, fn
|
|
29
|
+
var skip: (name: string, fn?: Fn, raison?: string) => void;
|
|
30
|
+
var each: (table: unknown[]) => (name: string, fn: Fn, opts?: TestOptions) => void;
|
|
18
31
|
}
|
|
19
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* Groupe logique. Le nom des cas reste PRÉFIXÉ (`groupe › cas`, compatibilité < 0.8.0) ; le groupe est aussi
|
|
34
|
+
* porté à part (`groups`), et c'est lui que les rapports mettent en `classname` — le titre JUnit reste le nom nu.
|
|
35
|
+
*/
|
|
20
36
|
export declare function describe(group: string, body: () => void): void;
|
|
37
|
+
export declare const beforeAll: (fn: () => void | Promise<void>) => void;
|
|
38
|
+
export declare const afterAll: (fn: () => void | Promise<void>) => void;
|
|
39
|
+
export declare const beforeEach: (fn: () => void | Promise<void>) => void;
|
|
40
|
+
export declare const afterEach: (fn: () => void | Promise<void>) => void;
|
|
41
|
+
/** Délai par défaut de chaque cas, en ms (0 : aucun). Le CLI le pose par `--timeout=`. */
|
|
42
|
+
export declare function setDefaultTimeout(ms: number): void;
|
|
43
|
+
/** Ne jouer que les cas portant l'une de ces étiquettes (les autres sont dits ignorés). Le CLI : `--tag=`. */
|
|
44
|
+
export declare function setTagFilter(tags: string[]): void;
|
|
21
45
|
export declare function ok(cond: unknown, message?: string): void;
|
|
22
46
|
export declare function equal(actual: unknown, expected: unknown, message?: string): void;
|
|
23
47
|
export declare function deepEqual(actual: unknown, expected: unknown, message?: string): void;
|
|
@@ -179,17 +203,32 @@ export declare function expect(actual: unknown): {
|
|
|
179
203
|
*/
|
|
180
204
|
toReject: (matcher?: RegExp | string, m?: string) => Promise<unknown>;
|
|
181
205
|
};
|
|
182
|
-
/**
|
|
206
|
+
/**
|
|
207
|
+
* Issue d'un cas de test (consommé par les reporters, ex. `./report`). `status` reste pass|fail|skip
|
|
208
|
+
* (compatibilité) ; `kind` dit, à la JUnit, si un échec est une assertion tombée (`failure`) ou une exception
|
|
209
|
+
* inattendue (`error`).
|
|
210
|
+
*/
|
|
183
211
|
export interface TestResult {
|
|
184
212
|
name: string;
|
|
185
213
|
status: "pass" | "fail" | "skip";
|
|
186
214
|
error?: string;
|
|
187
215
|
durationMs: number;
|
|
216
|
+
kind?: "failure" | "error";
|
|
217
|
+
errorType?: string;
|
|
218
|
+
stack?: string;
|
|
219
|
+
skipReason?: string;
|
|
220
|
+
title?: string;
|
|
221
|
+
groups?: string[];
|
|
222
|
+
tags?: string[];
|
|
223
|
+
classname?: string;
|
|
224
|
+
/** Résultat d'un crochet (afterAll en échec…) : il compte comme erreur, pas comme un cas déclaré. */
|
|
225
|
+
hook?: boolean;
|
|
188
226
|
}
|
|
189
227
|
export interface RunResult {
|
|
190
228
|
passed: number;
|
|
191
229
|
failed: number;
|
|
192
230
|
skipped: number;
|
|
231
|
+
errors?: number;
|
|
193
232
|
label: string;
|
|
194
233
|
results: TestResult[];
|
|
195
234
|
}
|
|
@@ -197,4 +236,13 @@ export interface RunResult {
|
|
|
197
236
|
export declare function run(label?: string): Promise<RunResult>;
|
|
198
237
|
/** Nombre de tests en attente (diagnostic). */
|
|
199
238
|
export declare function pending(): number;
|
|
239
|
+
/** Nombre total de cas enregistrés depuis le chargement du module (test et test.skip). */
|
|
240
|
+
export declare function registered(): number;
|
|
241
|
+
/**
|
|
242
|
+
* Relève — et vide — les résultats des `run()` exécutés depuis le dernier relevé. C'est ce qui permet
|
|
243
|
+
* au CLI de porter au rapport un fichier qui a appelé `run()` lui-même : avant 0.7.0, ses cas
|
|
244
|
+
* s'exécutaient mais n'apparaissaient nulle part.
|
|
245
|
+
*/
|
|
246
|
+
export declare function takeRuns(): RunResult[];
|
|
247
|
+
export {};
|
|
200
248
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,20 +6,82 @@
|
|
|
6
6
|
* @author Dr Hamid MADANI <drmdh@msn.com>
|
|
7
7
|
* @license AGPL-3.0-or-later
|
|
8
8
|
*/
|
|
9
|
+
const _hooks = [];
|
|
10
|
+
/** Pile des `describe` ouverts : un cas, un crochet, savent dans quel groupe ils naissent. */
|
|
11
|
+
const _groupes = [];
|
|
12
|
+
let _delaiDefaut = 0;
|
|
13
|
+
let _filtreTags = [];
|
|
9
14
|
const _suite = [];
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
/** Total des cas ENREGISTRÉS depuis le chargement du module — ce que le CLI compare aux exécutés. */
|
|
16
|
+
let _enregistres = 0;
|
|
17
|
+
/** Les `run()` exécutés et pas encore relevés — un fichier qui appelle `run()` lui-même y laisse ses résultats. */
|
|
18
|
+
const _executions = [];
|
|
19
|
+
// ── L'ABSENCE DE RÉSULTAT N'EST PAS UN SUCCÈS (0.7.0) ────────────────────────────────────────────
|
|
20
|
+
// `test()` enregistre, `run()` exécute. Un fichier lancé par `node fichier.test.mjs` sans `run()`
|
|
21
|
+
// n'exécutait RIEN et sortait en code 0 : un vert mensonger. À la sortie du processus, des cas
|
|
22
|
+
// enregistrés et jamais exécutés sont désormais DITS, et le code de sortie passe à 1.
|
|
23
|
+
let _gardeInstallee = false;
|
|
24
|
+
function _installerGarde() {
|
|
25
|
+
if (_gardeInstallee || typeof process === "undefined" || typeof process.once !== "function")
|
|
26
|
+
return;
|
|
27
|
+
_gardeInstallee = true;
|
|
28
|
+
process.once("beforeExit", () => {
|
|
29
|
+
if (_suite.length === 0)
|
|
30
|
+
return;
|
|
31
|
+
console.error(`\n✗ mjs-unit : ${_suite.length} test(s) enregistré(s) et JAMAIS exécuté(s) — lancez le fichier par \`mjs-unit <fichier>\` (ou appelez run()). Rien n'a été vérifié.`);
|
|
32
|
+
process.exitCode = 1;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function _enregistrer(name, fn, o = {}) {
|
|
36
|
+
const skip = o.skip === true || typeof o.skip === "string";
|
|
37
|
+
_suite.push({ name, title: name, fn, groups: [..._groupes], ...(skip ? { skip: true, ...(typeof o.skip === "string" ? { skipReason: o.skip } : {}) } : {}),
|
|
38
|
+
...(o.timeout ? { timeout: o.timeout } : {}), ...(o.tags?.length ? { tags: [...o.tags] } : {}) });
|
|
39
|
+
_enregistres++;
|
|
40
|
+
_installerGarde();
|
|
13
41
|
}
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
/**
|
|
42
|
+
/** Enregistre un test (exécuté par `run()`). `opts` : { timeout (ms), tags, skip } — comme @Timeout, @Tag, @Disabled. */
|
|
43
|
+
export function test(name, fn, opts) { _enregistrer(name, fn, opts); }
|
|
44
|
+
/** Test ignoré (compté à part) ; la raison, facultative, est rapportée — comme @Disabled("raison"). */
|
|
45
|
+
test.skip = (name, fn = () => { }, raison) => { _enregistrer(name, fn, { skip: raison ?? true }); };
|
|
46
|
+
/**
|
|
47
|
+
* Tests paramétrés (comme @ParameterizedTest) : un cas par ligne. Le nom s'interpole : `%s` (valeurs dans
|
|
48
|
+
* l'ordre), `%i` (rang de la ligne), `$cle` (ligne objet).
|
|
49
|
+
*/
|
|
50
|
+
test.each = (table) => (name, fn, opts) => {
|
|
51
|
+
table.forEach((ligne, i) => {
|
|
52
|
+
const args = Array.isArray(ligne) ? ligne : [ligne];
|
|
53
|
+
let k = 0;
|
|
54
|
+
const nom = name.replace(/%i/g, String(i)).replace(/%s/g, () => fmt(args[k++]))
|
|
55
|
+
.replace(/\$([A-Za-z_]\w*)/g, (m, c) => (ligne && typeof ligne === "object" && !Array.isArray(ligne) && c in ligne ? fmt(ligne[c]) : m));
|
|
56
|
+
_enregistrer(nom, () => fn(...args), opts);
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Groupe logique. Le nom des cas reste PRÉFIXÉ (`groupe › cas`, compatibilité < 0.8.0) ; le groupe est aussi
|
|
61
|
+
* porté à part (`groups`), et c'est lui que les rapports mettent en `classname` — le titre JUnit reste le nom nu.
|
|
62
|
+
*/
|
|
17
63
|
export function describe(group, body) {
|
|
18
64
|
const start = _suite.length;
|
|
19
|
-
|
|
65
|
+
_groupes.push(group);
|
|
66
|
+
try {
|
|
67
|
+
body();
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
_groupes.pop();
|
|
71
|
+
}
|
|
20
72
|
for (let i = start; i < _suite.length; i++)
|
|
21
73
|
_suite[i].name = `${group} › ${_suite[i].name}`;
|
|
22
74
|
}
|
|
75
|
+
/** Crochets (comme @BeforeAll, @AfterAll, @BeforeEach, @AfterEach) : au niveau du fichier, ou d'un `describe`. */
|
|
76
|
+
const _crochet = (type) => (fn) => { _hooks.push({ type, groups: [..._groupes], fn }); };
|
|
77
|
+
export const beforeAll = _crochet("beforeAll");
|
|
78
|
+
export const afterAll = _crochet("afterAll");
|
|
79
|
+
export const beforeEach = _crochet("beforeEach");
|
|
80
|
+
export const afterEach = _crochet("afterEach");
|
|
81
|
+
/** Délai par défaut de chaque cas, en ms (0 : aucun). Le CLI le pose par `--timeout=`. */
|
|
82
|
+
export function setDefaultTimeout(ms) { _delaiDefaut = Math.max(0, Number(ms) || 0); }
|
|
83
|
+
/** Ne jouer que les cas portant l'une de ces étiquettes (les autres sont dits ignorés). Le CLI : `--tag=`. */
|
|
84
|
+
export function setTagFilter(tags) { _filtreTags = (tags ?? []).map((t) => String(t).trim()).filter(Boolean); }
|
|
23
85
|
// ── Assertions ───────────────────────────────────────────────────────────────
|
|
24
86
|
class AssertionError extends Error {
|
|
25
87
|
constructor(m) { super(m); this.name = "AssertionError"; }
|
|
@@ -304,41 +366,163 @@ function matchMessage(err, matcher, m) {
|
|
|
304
366
|
throw new AssertionError(m ?? `exception « ${msg} » ne matche pas ${matcher}`);
|
|
305
367
|
}
|
|
306
368
|
const _now = () => (typeof performance !== "undefined" ? performance.now() : Date.now());
|
|
369
|
+
class TimeoutError extends Error {
|
|
370
|
+
constructor(m) { super(m); this.name = "TimeoutError"; }
|
|
371
|
+
}
|
|
372
|
+
/** Une assertion tombée (la nôtre, celle de node:assert, de chai…) est un ÉCHEC ; tout le reste, une ERREUR. */
|
|
373
|
+
const _nature = (e) => {
|
|
374
|
+
const x = e;
|
|
375
|
+
const errorType = x?.name || x?.constructor?.name || typeof e;
|
|
376
|
+
const failure = errorType === "AssertionError" || x?.code === "ERR_ASSERTION";
|
|
377
|
+
return { kind: failure ? "failure" : "error", errorType, error: x?.message ?? String(e), ...(x?.stack ? { stack: String(x.stack).slice(0, 8000) } : {}) };
|
|
378
|
+
};
|
|
379
|
+
async function _executer(fn, ms) {
|
|
380
|
+
if (!ms) {
|
|
381
|
+
await fn();
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
let t;
|
|
385
|
+
try {
|
|
386
|
+
await Promise.race([Promise.resolve().then(fn), new Promise((_, rej) => { t = setTimeout(() => rej(new TimeoutError(`délai dépassé : ${ms} ms`)), ms); })]);
|
|
387
|
+
}
|
|
388
|
+
finally {
|
|
389
|
+
if (t)
|
|
390
|
+
clearTimeout(t);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
const _prefixe = (a, b) => a.length <= b.length && a.every((g, i) => g === b[i]);
|
|
394
|
+
const _cle = (g) => JSON.stringify(g);
|
|
307
395
|
/** Exécute les tests enregistrés, affiche le rapport, positionne `process.exitCode` si échec. */
|
|
308
396
|
export async function run(label = "") {
|
|
309
|
-
let passed = 0, failed = 0, skipped = 0;
|
|
397
|
+
let passed = 0, failed = 0, skipped = 0, errors = 0;
|
|
310
398
|
const results = [];
|
|
311
399
|
if (label)
|
|
312
400
|
console.log(`\n▶ ${label}`);
|
|
401
|
+
const hooks = _hooks.splice(0);
|
|
402
|
+
const de = (type, g) => hooks.filter((h) => h.type === type && _cle(h.groups) === _cle(g));
|
|
403
|
+
const ouverts = []; // portées dont le beforeAll a été joué
|
|
404
|
+
const echecsPortee = new Map(); // portée → motif de l'échec de son beforeAll
|
|
405
|
+
const base = (t) => ({ name: t.name, title: t.title ?? t.name, groups: t.groups ?? [], ...(t.tags ? { tags: t.tags } : {}) });
|
|
406
|
+
const erreurCrochet = (type, g, e) => {
|
|
407
|
+
const n = _nature(e);
|
|
408
|
+
failed++;
|
|
409
|
+
errors++;
|
|
410
|
+
console.log(` ✗ ${type}${g.length ? ` (${g.join(" › ")})` : ""}\n ${n.error}`);
|
|
411
|
+
results.push({ name: `${type}${g.length ? ` — ${g.join(" › ")}` : ""}`, title: type, groups: g, status: "fail", durationMs: 0, ...n, kind: "error", hook: true });
|
|
412
|
+
};
|
|
413
|
+
const fermerJusqua = async (g) => {
|
|
414
|
+
while (ouverts.length && !_prefixe(ouverts[ouverts.length - 1], g)) {
|
|
415
|
+
const p = ouverts.pop();
|
|
416
|
+
for (const h of de("afterAll", p)) {
|
|
417
|
+
try {
|
|
418
|
+
await h.fn();
|
|
419
|
+
}
|
|
420
|
+
catch (e) {
|
|
421
|
+
erreurCrochet("afterAll", p, e);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
};
|
|
426
|
+
const ouvrir = async (g) => {
|
|
427
|
+
for (let k = 0; k <= g.length; k++) {
|
|
428
|
+
const p = g.slice(0, k);
|
|
429
|
+
if (ouverts.some((o) => _cle(o) === _cle(p)))
|
|
430
|
+
continue;
|
|
431
|
+
ouverts.push(p);
|
|
432
|
+
const parent = [...echecsPortee.entries()].find(([c]) => _prefixe(JSON.parse(c), p));
|
|
433
|
+
if (parent) {
|
|
434
|
+
echecsPortee.set(_cle(p), parent[1]);
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
for (const h of de("beforeAll", p)) {
|
|
438
|
+
try {
|
|
439
|
+
await h.fn();
|
|
440
|
+
}
|
|
441
|
+
catch (e) {
|
|
442
|
+
echecsPortee.set(_cle(p), `beforeAll a échoué : ${_nature(e).error}`);
|
|
443
|
+
break;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
};
|
|
313
448
|
for (const t of _suite) {
|
|
314
|
-
|
|
315
|
-
|
|
449
|
+
const g = t.groups ?? [];
|
|
450
|
+
const filtre = _filtreTags.length && !(t.tags ?? []).some((x) => _filtreTags.includes(x));
|
|
451
|
+
if (t.skip || filtre) {
|
|
452
|
+
const raison = t.skip ? t.skipReason : `filtré : --tag=${_filtreTags.join(",")}`;
|
|
453
|
+
console.log(` ⊘ ${t.name} (ignoré${raison ? ` : ${raison}` : ""})`);
|
|
316
454
|
skipped++;
|
|
317
|
-
results.push({
|
|
455
|
+
results.push({ ...base(t), status: "skip", durationMs: 0, ...(raison ? { skipReason: raison } : {}) });
|
|
318
456
|
continue;
|
|
319
457
|
}
|
|
458
|
+
await fermerJusqua(g);
|
|
459
|
+
await ouvrir(g);
|
|
320
460
|
const t0 = _now();
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
461
|
+
const motifPortee = [...echecsPortee.entries()].find(([c]) => _prefixe(JSON.parse(c), g))?.[1];
|
|
462
|
+
let echec = motifPortee ? Object.assign(new Error(motifPortee), { name: "HookError" }) : undefined;
|
|
463
|
+
if (!echec) {
|
|
464
|
+
const avant = hooks.filter((h) => h.type === "beforeEach" && _prefixe(h.groups, g)).sort((a, b) => a.groups.length - b.groups.length);
|
|
465
|
+
const apres = hooks.filter((h) => h.type === "afterEach" && _prefixe(h.groups, g)).sort((a, b) => b.groups.length - a.groups.length);
|
|
466
|
+
try {
|
|
467
|
+
for (const h of avant)
|
|
468
|
+
await h.fn();
|
|
469
|
+
await _executer(t.fn, t.timeout ?? _delaiDefaut);
|
|
470
|
+
}
|
|
471
|
+
catch (e) {
|
|
472
|
+
echec = e;
|
|
473
|
+
}
|
|
474
|
+
for (const h of apres) {
|
|
475
|
+
try {
|
|
476
|
+
await h.fn();
|
|
477
|
+
}
|
|
478
|
+
catch (e) {
|
|
479
|
+
if (!echec)
|
|
480
|
+
echec = e;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
const d = _now() - t0;
|
|
485
|
+
if (!echec) {
|
|
324
486
|
console.log(` ✓ ${t.name}`);
|
|
325
487
|
passed++;
|
|
326
|
-
results.push({
|
|
488
|
+
results.push({ ...base(t), status: "pass", durationMs: d });
|
|
489
|
+
continue;
|
|
327
490
|
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
491
|
+
const n = _nature(echec);
|
|
492
|
+
failed++;
|
|
493
|
+
if (n.kind === "error")
|
|
494
|
+
errors++;
|
|
495
|
+
console.log(` ✗ ${t.name}${n.kind === "error" ? ` [erreur ${n.errorType}]` : ""}\n ${n.error}`);
|
|
496
|
+
results.push({ ...base(t), status: "fail", durationMs: d, ...n });
|
|
497
|
+
}
|
|
498
|
+
await fermerJusqua([]);
|
|
499
|
+
while (ouverts.length) {
|
|
500
|
+
const p = ouverts.pop();
|
|
501
|
+
for (const h of de("afterAll", p)) {
|
|
502
|
+
try {
|
|
503
|
+
await h.fn();
|
|
504
|
+
}
|
|
505
|
+
catch (e) {
|
|
506
|
+
erreurCrochet("afterAll", p, e);
|
|
507
|
+
}
|
|
334
508
|
}
|
|
335
509
|
}
|
|
336
|
-
console.log(`\n${failed === 0 ? "✅" : "❌"} ${passed} passé(s), ${failed} échoué(s)${skipped ? `, ${skipped} ignoré(s)` : ""}`);
|
|
510
|
+
console.log(`\n${failed === 0 ? "✅" : "❌"} ${passed} passé(s), ${failed} échoué(s)${errors ? ` dont ${errors} erreur(s)` : ""}${skipped ? `, ${skipped} ignoré(s)` : ""}`);
|
|
337
511
|
if (failed > 0 && typeof process !== "undefined")
|
|
338
512
|
process.exitCode = 1;
|
|
339
513
|
_suite.length = 0; // réinitialise pour un éventuel run suivant
|
|
340
|
-
|
|
514
|
+
const r = { passed, failed, skipped, errors, label, results };
|
|
515
|
+
_executions.push(r);
|
|
516
|
+
return r;
|
|
341
517
|
}
|
|
342
518
|
/** Nombre de tests en attente (diagnostic). */
|
|
343
519
|
export function pending() { return _suite.length; }
|
|
520
|
+
/** Nombre total de cas enregistrés depuis le chargement du module (test et test.skip). */
|
|
521
|
+
export function registered() { return _enregistres; }
|
|
522
|
+
/**
|
|
523
|
+
* Relève — et vide — les résultats des `run()` exécutés depuis le dernier relevé. C'est ce qui permet
|
|
524
|
+
* au CLI de porter au rapport un fichier qui a appelé `run()` lui-même : avant 0.7.0, ses cas
|
|
525
|
+
* s'exécutaient mais n'apparaissaient nulle part.
|
|
526
|
+
*/
|
|
527
|
+
export function takeRuns() { return _executions.splice(0); }
|
|
344
528
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/report.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @mostajs/mjs-unit/report — Reporters de preuve de test (HTML &
|
|
2
|
+
* @mostajs/mjs-unit/report — Reporters de preuve de test (HTML, JSON & JUnit XML).
|
|
3
3
|
*
|
|
4
4
|
* Fonctions PURES : prennent un agrégat de résultats (`TestReport`) et rendent
|
|
5
5
|
* une chaîne. Aucune E/S, aucun accès disque — l'appelant (CLI ou script) écrit
|
|
@@ -20,7 +20,18 @@ export interface TestReport {
|
|
|
20
20
|
suites: ReportSuite[];
|
|
21
21
|
generatedAt: string;
|
|
22
22
|
title?: string;
|
|
23
|
+
hostname?: string;
|
|
23
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Le `classname` JUnit d'un cas : le chemin du fichier sans extension, en notation pointée, suivi de ses
|
|
27
|
+
* groupes `describe` — `test-scripts/a.test.mjs` + [Groupe] → `test-scripts.a.test.Groupe`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function classnameDe(file: string, groups?: string[]): string;
|
|
30
|
+
/**
|
|
31
|
+
* Rapport JUnit XML — le schéma qu'attendent Jenkins, GitLab, GitHub, Azure DevOps et les outils de traçabilité.
|
|
32
|
+
* Une suite par fichier ; échec d'assertion → <failure>, exception inattendue → <error>, ignoré → <skipped>.
|
|
33
|
+
*/
|
|
34
|
+
export declare function renderJunitReport(report: TestReport): string;
|
|
24
35
|
/** Totaux sur l'ensemble des suites. */
|
|
25
36
|
export declare function summarize(report: TestReport): {
|
|
26
37
|
total: number;
|
package/dist/report.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,sDAAsD;AACtD,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE;AACpE,uCAAuC;AACvC,MAAM,WAAW,UAAU;IAAG,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,sDAAsD;AACtD,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE;AACpE,uCAAuC;AACvC,MAAM,WAAW,UAAU;IAAG,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;AAE7G;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,MAAM,CAGvE;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA0B5D;AAWD,wCAAwC;AACxC,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU;;;;;;EAG3C;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE3D;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAmD3D"}
|
package/dist/report.js
CHANGED
|
@@ -1,3 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Le `classname` JUnit d'un cas : le chemin du fichier sans extension, en notation pointée, suivi de ses
|
|
3
|
+
* groupes `describe` — `test-scripts/a.test.mjs` + [Groupe] → `test-scripts.a.test.Groupe`.
|
|
4
|
+
*/
|
|
5
|
+
export function classnameDe(file, groups = []) {
|
|
6
|
+
const base = String(file ?? "").replace(/\\/g, "/").replace(/^\.?\//, "").replace(/\.(m?[jt]s|cjs)$/, "").replace(/\//g, ".");
|
|
7
|
+
return [base, ...groups].filter(Boolean).join(".");
|
|
8
|
+
}
|
|
9
|
+
// XML 1.0 : ni caractère de contrôle (hors tabulation et sauts de ligne), ni `]]>` nu dans une section CDATA.
|
|
10
|
+
const xmlPropre = (v) => String(v ?? "").replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\uFFFE\uFFFF]/g, "");
|
|
11
|
+
const attrXml = (v) => xmlPropre(v).replace(/[&<>"']/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]));
|
|
12
|
+
const cdata = (v) => `<![CDATA[${xmlPropre(v).replace(/]]>/g, "]]]]><![CDATA[>")}]]>`;
|
|
13
|
+
const sec = (ms) => (Math.max(0, ms || 0) / 1000).toFixed(3);
|
|
14
|
+
/**
|
|
15
|
+
* Rapport JUnit XML — le schéma qu'attendent Jenkins, GitLab, GitHub, Azure DevOps et les outils de traçabilité.
|
|
16
|
+
* Une suite par fichier ; échec d'assertion → <failure>, exception inattendue → <error>, ignoré → <skipped>.
|
|
17
|
+
*/
|
|
18
|
+
export function renderJunitReport(report) {
|
|
19
|
+
const comptes = (rs) => ({
|
|
20
|
+
tests: rs.length,
|
|
21
|
+
failures: rs.filter((r) => r.status === "fail" && r.kind !== "error").length,
|
|
22
|
+
errors: rs.filter((r) => r.status === "fail" && r.kind === "error").length,
|
|
23
|
+
skipped: rs.filter((r) => r.status === "skip").length,
|
|
24
|
+
time: rs.reduce((n, r) => n + (r.durationMs || 0), 0),
|
|
25
|
+
});
|
|
26
|
+
const horodatage = String(report.generatedAt ?? "").replace(/\.\d+Z$|Z$/, "");
|
|
27
|
+
const suites = report.suites.map((s, i) => {
|
|
28
|
+
const c = comptes(s.results);
|
|
29
|
+
const cas = s.results.map((r) => {
|
|
30
|
+
const ouverture = `<testcase name="${attrXml(r.title ?? r.name)}" classname="${attrXml(r.classname ?? classnameDe(s.file, r.groups))}" file="${attrXml(s.file)}" time="${sec(r.durationMs)}"`;
|
|
31
|
+
const props = r.tags?.length ? `<properties>${r.tags.map((t) => `<property name="tag" value="${attrXml(t)}"/>`).join("")}</properties>` : "";
|
|
32
|
+
let corps = "";
|
|
33
|
+
if (r.status === "skip")
|
|
34
|
+
corps = r.skipReason ? `<skipped message="${attrXml(r.skipReason)}"/>` : "<skipped/>";
|
|
35
|
+
else if (r.status === "fail") {
|
|
36
|
+
const balise = r.kind === "error" ? "error" : "failure";
|
|
37
|
+
corps = `<${balise} message="${attrXml(r.error ?? "")}" type="${attrXml(r.errorType ?? (balise === "error" ? "Error" : "AssertionError"))}">${cdata(r.stack ?? r.error ?? "")}</${balise}>`;
|
|
38
|
+
}
|
|
39
|
+
return props || corps ? ` ${ouverture}>${props}${corps}</testcase>` : ` ${ouverture}/>`;
|
|
40
|
+
}).join("\n");
|
|
41
|
+
return ` <testsuite name="${attrXml(s.file)}" id="${i}" tests="${c.tests}" failures="${c.failures}" errors="${c.errors}" skipped="${c.skipped}" time="${sec(c.time)}" timestamp="${attrXml(horodatage)}" hostname="${attrXml(report.hostname ?? "localhost")}">\n${cas}\n </testsuite>`;
|
|
42
|
+
});
|
|
43
|
+
const t = comptes(report.suites.flatMap((s) => s.results));
|
|
44
|
+
return `<?xml version="1.0" encoding="UTF-8"?>\n<testsuites name="${attrXml(report.title ?? "mjs-unit")}" tests="${t.tests}" failures="${t.failures}" errors="${t.errors}" skipped="${t.skipped}" time="${sec(t.time)}" timestamp="${attrXml(horodatage)}">\n${suites.join("\n")}\n</testsuites>\n`;
|
|
45
|
+
}
|
|
1
46
|
const esc = (s) => String(s).replace(/[&<>"]/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """ }[c]));
|
|
2
47
|
const tally = (results) => ({
|
|
3
48
|
passed: results.filter((r) => r.status === "pass").length,
|
package/dist/report.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
package/llms.txt
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> Micro-framework de test ZÉRO DÉPENDANCE pour l'écosystème @mostajs/* : API test/expect, runner CLI,
|
|
4
4
|
> et un resolver ESM qui exécute sous Node les dist à imports SANS extension (moduleResolution=bundler).
|
|
5
5
|
|
|
6
|
-
- Version: 0.
|
|
6
|
+
- Version: 0.7.0 · Licence: AGPL-3.0-or-later · Auteur: Dr Hamid MADANI <drmdh@msn.com>
|
|
7
7
|
- Chemin: mostajs/mosta-mjs-unit
|
|
8
8
|
|
|
9
9
|
## RÔLE
|
|
@@ -26,7 +26,7 @@ réécrit `./x` → `./x.js` puis `./x/index.js`.
|
|
|
26
26
|
- `./register` (register.mjs) : enregistre le resolver via `node --import`.
|
|
27
27
|
- `./loader` (loader.mjs) : le hook `resolve` (pour usage avancé).
|
|
28
28
|
- bin `mjs-unit` (bin/cli.mjs) : runner — active le resolver, importe les fichiers, exécute.
|
|
29
|
-
Options : `--report[=fichier]` (preuve HTML, défaut test-report.html), `--json[=fichier]`,
|
|
29
|
+
Options : `--report[=fichier]` (preuve HTML, défaut test-report.html), `--json[=fichier]`, `--junit[=fichier]` (JUnit XML, 0.8.0), `--timeout=ms`, `--tag=a,b`,
|
|
30
30
|
`--title="…"`. Ex. : `mjs-unit test-scripts/*.test.mjs --report --title="Mon module"`.
|
|
31
31
|
|
|
32
32
|
## API
|
|
@@ -43,14 +43,21 @@ réécrit `./x` → `./x.js` puis `./x/index.js`.
|
|
|
43
43
|
une chaîne-message. Pour exiger une sous-chaîne en asynchrone, passer une RegExp.
|
|
44
44
|
⚠️ Avant la 0.5.0, toute RegExp passée ici était **décorative** — un refus survenant pour la
|
|
45
45
|
MAUVAISE raison passait inaperçu. Relire les essais qui en passaient une.
|
|
46
|
-
- run(label?): Promise<{passed, failed, skipped, label, results}> // exécute les cas ; exitCode=1 si échec
|
|
47
|
-
results: { name, status: 'pass'|'fail'|'skip', error?, durationMs }[]
|
|
46
|
+
- run(label?): Promise<{passed, failed, skipped, errors, label, results}> // exécute les cas ; exitCode=1 si échec
|
|
47
|
+
results: { name, status: 'pass'|'fail'|'skip', error?, durationMs, kind?: 'failure'|'error', errorType?, stack?, skipReason?, title?, groups?, tags?, classname?, hook? }[]
|
|
48
|
+
- test(name, fn, { timeout?, tags?, skip? }) · test.skip(name, fn?, raison?) · test.each(table)(name, fn, opts?) // 0.8.0, notions JUnit 5
|
|
49
|
+
- beforeAll/afterAll/beforeEach/afterEach(fn) // au niveau du fichier ou d'un describe — 0.8.0
|
|
50
|
+
- setDefaultTimeout(ms) · setTagFilter(tags) // ce que le CLI pose par --timeout= et --tag= — 0.8.0
|
|
48
51
|
- pending(): number
|
|
52
|
+
- registered(): number // total des cas enregistrés (test + test.skip) depuis le chargement — 0.7.0
|
|
53
|
+
- takeRuns(): RunResult[] // relève et vide les run() exécutés — le CLI s'en sert pour rapporter un fichier qui a appelé run() — 0.7.0
|
|
49
54
|
|
|
50
55
|
## API — REPORT (./report, preuve de test, fonctions pures)
|
|
51
56
|
- renderHtmlReport(report: TestReport): string // document HTML autonome (thème sombre, cartes + tables par suite, durées, échappement anti-injection)
|
|
52
57
|
- renderJsonReport(report: TestReport): string // JSON { ...report, summary }
|
|
53
58
|
- summarize(report): { passed, failed, skipped, total, suites }
|
|
59
|
+
- renderJunitReport(report): string // JUnit XML (testsuites/testsuite/testcase, failure≠error, skipped, properties tag) — 0.8.0
|
|
60
|
+
- classnameDe(file, groups?): string // 'test-scripts/a.test.mjs' + ['G'] → 'test-scripts.a.test.G' — 0.8.0
|
|
54
61
|
- TestReport = { suites: { file, results: TestResult[] }[], generatedAt: string, title?: string }
|
|
55
62
|
L'appelant écrit le fichier ; le CLI le fait via `--report`/`--json`.
|
|
56
63
|
|
|
@@ -81,7 +88,11 @@ node node_modules/@mostajs/mjs-unit/bin/cli.mjs test-scripts/*.test.mjs
|
|
|
81
88
|
- Importer la racine d'un module @mostajs qui ré-exporte des composants React (ex. @mostajs/audit → AuditPage)
|
|
82
89
|
charge react/lucide-react. En test, importer par SOUS-CHEMINS (dist/lib/*.js) pour éviter ces peers.
|
|
83
90
|
- Le runner exécute les cas en attente APRÈS import du fichier. Si le fichier appelle run() lui-même,
|
|
84
|
-
le runner ne ré-exécute pas (pending()===0).
|
|
91
|
+
le runner ne ré-exécute pas (pending()===0) mais, depuis 0.7.0, PORTE SES RÉSULTATS AU RAPPORT.
|
|
92
|
+
Forme recommandée : ne PAS appeler run() et lancer par le CLI.
|
|
93
|
+
- L'ABSENCE DE RÉSULTAT N'EST PAS UN SUCCÈS (0.7.0) : le CLI relève, par fichier, enregistrés vs
|
|
94
|
+
exécutés et échoue (code 1) sur un fichier sans test ; `node fichier` avec des cas jamais exécutés
|
|
95
|
+
sort en code 1 avec un message. Le compte s'imprime : « ✓ N/N test(s) exécutés sur F fichier(s) ».
|
|
85
96
|
- Le resolver n'agit que sur les specifiers RELATIFS sans extension ; les packages (bare) passent normalement.
|
|
86
97
|
|
|
87
98
|
## CONVENTION (écosystème)
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mostajs/mjs-unit",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Micro-framework de test pour l'
|
|
3
|
+
"version": "0.8.0",
|
|
4
|
+
"description": "Micro-framework de test pour l'\u00e9cosyst\u00e8me @mostajs/* : z\u00e9ro d\u00e9pendance, API minimale (test/expect/run), runner CLI (preuves HTML/JSON/JUnit XML via --report/--json/--junit), notions JUnit (échec/erreur, classname, crochets, délai, étiquettes, tests paramétrés), reporters r\u00e9utilisables (./report), et un resolver ESM qui ex\u00e9cute sous Node les dist \u00e0 imports sans extension (convention moduleResolution=bundler).",
|
|
5
5
|
"author": "Dr Hamid MADANI <drmdh@msn.com>",
|
|
6
6
|
"license": "AGPL-3.0-or-later",
|
|
7
7
|
"type": "module",
|
|
@@ -42,6 +42,11 @@
|
|
|
42
42
|
"README.md",
|
|
43
43
|
"LICENSE"
|
|
44
44
|
],
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc -p tsconfig.json",
|
|
47
|
+
"test": "bash test-scripts/run-tests.sh",
|
|
48
|
+
"report": "npm run build && node bin/cli.mjs test-scripts/*.test.mjs --report=test-report.html --title=\"@mostajs/mjs-unit \u2014 auto-preuve\""
|
|
49
|
+
},
|
|
45
50
|
"devDependencies": {
|
|
46
51
|
"typescript": "^5.6.0",
|
|
47
52
|
"@types/node": "^22.0.0"
|
|
@@ -59,10 +64,5 @@
|
|
|
59
64
|
"nature": "primitif",
|
|
60
65
|
"reutilisabilite": "universelle",
|
|
61
66
|
"depend_de": []
|
|
62
|
-
},
|
|
63
|
-
"scripts": {
|
|
64
|
-
"build": "tsc -p tsconfig.json",
|
|
65
|
-
"test": "bash test-scripts/run-tests.sh",
|
|
66
|
-
"report": "npm run build && node bin/cli.mjs test-scripts/*.test.mjs --report=test-report.html --title=\"@mostajs/mjs-unit — auto-preuve\""
|
|
67
67
|
}
|
|
68
|
-
}
|
|
68
|
+
}
|