testVitestInNode

tcmts.cli.test.e2e.vitest.testVitestInNode · #a3jotjgc · term

Vitest: expect, vi and diffs in Node, nothing installed, results cached by hash.

import { setUp } from "#codebase/tcmts/cli/test/e2e/vitest";
import assert from "node:assert/strict";

export const testVitestInNode = () => {
  const { run, tcm, write } = setUp();
  write(
    "m.ts",
    `// tcm: namespace m\nimport { expect, vi } from "vitest";\n\nexport const double = (n: number): number => n * 2;\n\n` +
      `export const testDouble = () => {\n  expect(double(2)).toBe(4);\n};\n\n` +
      `export const testMocks = () => {\n  const f = vi.fn<(x: number) => number>((x) => x + 1);\n  f(1);\n  expect(f).toHaveBeenCalledWith(1);\n};\n\n` +
      `export const testFails = () => {\n  console.log("about to fail");\n  expect({ a: double(1) }).toEqual({ a: 3 });\n};\n`,
  );
  tcm("add", "m.ts");
  const r = run("test", "m");
  assert.equal(r.status, 1);
  assert.match(r.out, /✓ m\.testDouble/);
  assert.match(r.out, /✓ m\.testMocks/);
  assert.match(
    r.out,
    /✗ m\.testFails[\s\S]*expected \{ a: 2 \} to deeply equal \{ a: 3 \}[\s\S]*- {3}"a": 3,[\s\S]*\+ {3}"a": 2,[\s\S]*│ about to fail/,
    "Vitest's message, its diff, and the test's output",
  );
  assert.match(run("test", "m").out, /2 passed, 1 failed \(2 cached\)/);
  assert.match(
    tcm("packages"),
    /vitest\s+5\s+5\.\d+\.\d+/,
    "the test framework is pinned like any package",
  );
}

uses