runtime-requirements.test.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { mkdtemp, readFile, rm } from "node:fs/promises";
  2. import { tmpdir } from "node:os";
  3. import { join } from "node:path";
  4. import { afterEach, beforeEach, describe, expect, it } from "vitest";
  5. import {
  6. ensureNodeRuntimePinFiles,
  7. evaluateSqliteMemorySupport,
  8. formatSqliteMemorySupportWarning,
  9. inspectNodeRuntimePinFiles,
  10. parseNodeMajor,
  11. } from "../runtime-requirements.js";
  12. let tempRoot: string;
  13. describe("runtime requirements", () => {
  14. beforeEach(async () => {
  15. tempRoot = await mkdtemp(join(tmpdir(), "inkos-runtime-requirements-"));
  16. });
  17. afterEach(async () => {
  18. await rm(tempRoot, { recursive: true, force: true });
  19. });
  20. it("parses Node major versions", () => {
  21. expect(parseNodeMajor("v20.17.0")).toBe(20);
  22. expect(parseNodeMajor("v22.19.0")).toBe(22);
  23. });
  24. it("marks sqlite memory acceleration unavailable below Node 22", () => {
  25. const result = evaluateSqliteMemorySupport({
  26. nodeVersion: "v20.17.0",
  27. hasNodeSqlite: false,
  28. });
  29. expect(result.ok).toBe(false);
  30. expect(result.detail).toContain("Node 22+");
  31. expect(result.detail).toContain("v20.17.0");
  32. });
  33. it("marks sqlite memory acceleration available on supported runtimes", () => {
  34. const result = evaluateSqliteMemorySupport({
  35. nodeVersion: "v22.19.0",
  36. hasNodeSqlite: true,
  37. });
  38. expect(result.ok).toBe(true);
  39. expect(result.detail).toContain("v22.19.0");
  40. });
  41. it("formats an early warning for unsupported sqlite memory runtimes", () => {
  42. const warning = formatSqliteMemorySupportWarning({
  43. nodeVersion: "v20.17.0",
  44. hasNodeSqlite: false,
  45. });
  46. expect(warning).toContain("v20.17.0");
  47. expect(warning).toContain("Node 22+");
  48. expect(warning).toContain("memory.db live sync");
  49. });
  50. it("does not format a warning on supported runtimes", () => {
  51. const warning = formatSqliteMemorySupportWarning({
  52. nodeVersion: "v22.19.0",
  53. hasNodeSqlite: true,
  54. });
  55. expect(warning).toBeNull();
  56. });
  57. it("reports missing node runtime pin files", async () => {
  58. const status = await inspectNodeRuntimePinFiles(tempRoot);
  59. expect(status.ok).toBe(false);
  60. expect(status.detail).toContain(".nvmrc");
  61. expect(status.detail).toContain(".node-version");
  62. });
  63. it("writes node runtime pin files for old projects", async () => {
  64. const repair = await ensureNodeRuntimePinFiles(tempRoot);
  65. expect(repair.updated).toBe(true);
  66. expect(repair.written).toEqual([".nvmrc", ".node-version"]);
  67. await expect(readFile(join(tempRoot, ".nvmrc"), "utf-8")).resolves.toBe("22\n");
  68. await expect(readFile(join(tempRoot, ".node-version"), "utf-8")).resolves.toBe("22\n");
  69. const status = await inspectNodeRuntimePinFiles(tempRoot);
  70. expect(status.ok).toBe(true);
  71. });
  72. });