supercov 0.0.16 → 0.0.18

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.
@@ -9,8 +9,22 @@ function sourcePath(moduleId) {
9
9
  : moduleId;
10
10
  return relative(process.cwd(), absolute).split(sep).join("/");
11
11
  }
12
+ function rawAttemptStatus(state, expectedFailure) {
13
+ if (!expectedFailure)
14
+ return state;
15
+ // Vitest reports an already-inverted final state for `it.fails`: pass
16
+ // means the body failed as expected, while fail means it unexpectedly
17
+ // passed. Supercov's cross-runner contract stores actual + expected, so
18
+ // undo Vitest's inversion at the adapter boundary.
19
+ if (state === "passed")
20
+ return "failed";
21
+ if (state === "failed")
22
+ return "passed";
23
+ return state;
24
+ }
12
25
  /** Records final runner outcomes, including tests that never execute hooks. */
13
26
  export default class SupercovVitestReporter {
27
+ reportedAttempts = new Set();
14
28
  onTestCaseResult(testCase) {
15
29
  const evidenceDirectory = process.env["SUPERCOV_EVIDENCE_DIR"];
16
30
  if (!evidenceDirectory)
@@ -27,7 +41,7 @@ export default class SupercovVitestReporter {
27
41
  testFile,
28
42
  title: testCase.name,
29
43
  retry,
30
- status: result.state,
44
+ status: rawAttemptStatus(result.state, testCase.options.fails),
31
45
  expectedStatus: testCase.options.fails ? "failed" : "passed",
32
46
  flaky: diagnostic?.flaky ?? false,
33
47
  provenance: inferTestProvenance({
@@ -41,6 +55,7 @@ export default class SupercovVitestReporter {
41
55
  server: [],
42
56
  };
43
57
  const safeId = testCase.id.replace(/[^a-zA-Z0-9_-]/g, "_");
58
+ this.reportedAttempts.add(`${testCase.id}:${retry}`);
44
59
  const directory = resolve(process.cwd(), evidenceDirectory, `vitest-${safeId}-${retry}-status`);
45
60
  mkdirSync(directory, { recursive: true });
46
61
  atomicWriteFileSync(resolve(directory, "mcdc.json"), `${JSON.stringify(payload)}\n`);
@@ -55,23 +70,28 @@ export default class SupercovVitestReporter {
55
70
  if (task.type === "test" && task.result?.state) {
56
71
  const testFile = sourcePath(file.filepath ?? task.filepath ?? "unknown");
57
72
  const retry = task.result.retryCount ?? 0;
73
+ if (this.reportedAttempts.has(`${task.id}:${retry}`)) {
74
+ return;
75
+ }
58
76
  const names = [task.name ?? task.id ?? "test"];
59
77
  let suite = task.suite;
60
78
  while (suite?.name) {
61
79
  names.unshift(suite.name);
62
80
  suite = suite.suite;
63
81
  }
82
+ const expectedFailure = Boolean(task.fails ?? task.options?.fails);
64
83
  const payload = {
65
84
  testId: `vitest:${task.id ?? names.join(" > ")}`,
66
85
  test: names.join(" > "),
67
86
  testFile,
68
87
  title: task.name ?? names.at(-1) ?? "test",
69
88
  retry,
70
- status: task.result.state === "pass"
89
+ status: rawAttemptStatus(task.result.state === "pass"
71
90
  ? "passed"
72
91
  : task.result.state === "fail"
73
92
  ? "failed"
74
- : "skipped",
93
+ : "skipped", expectedFailure),
94
+ expectedStatus: expectedFailure ? "failed" : "passed",
75
95
  provenance: inferTestProvenance({
76
96
  runner: "vitest",
77
97
  file: testFile,