@mcptoolshop/venvkit 0.2.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/LICENSE +21 -0
- package/README.md +249 -0
- package/dist/doctorLite.d.ts +75 -0
- package/dist/doctorLite.d.ts.map +1 -0
- package/dist/doctorLite.js +705 -0
- package/dist/doctorLite.js.map +1 -0
- package/dist/doctorLite.test.d.ts +2 -0
- package/dist/doctorLite.test.d.ts.map +1 -0
- package/dist/doctorLite.test.js +268 -0
- package/dist/doctorLite.test.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/integration.test.d.ts +2 -0
- package/dist/integration.test.d.ts.map +1 -0
- package/dist/integration.test.js +245 -0
- package/dist/integration.test.js.map +1 -0
- package/dist/mapRender.d.ts +105 -0
- package/dist/mapRender.d.ts.map +1 -0
- package/dist/mapRender.js +718 -0
- package/dist/mapRender.js.map +1 -0
- package/dist/mapRender.test.d.ts +2 -0
- package/dist/mapRender.test.d.ts.map +1 -0
- package/dist/mapRender.test.js +571 -0
- package/dist/mapRender.test.js.map +1 -0
- package/dist/map_cli.d.ts +3 -0
- package/dist/map_cli.d.ts.map +1 -0
- package/dist/map_cli.js +278 -0
- package/dist/map_cli.js.map +1 -0
- package/dist/map_cli.test.d.ts +2 -0
- package/dist/map_cli.test.d.ts.map +1 -0
- package/dist/map_cli.test.js +276 -0
- package/dist/map_cli.test.js.map +1 -0
- package/dist/runLog.d.ts +71 -0
- package/dist/runLog.d.ts.map +1 -0
- package/dist/runLog.js +98 -0
- package/dist/runLog.js.map +1 -0
- package/dist/runLog.test.d.ts +2 -0
- package/dist/runLog.test.d.ts.map +1 -0
- package/dist/runLog.test.js +327 -0
- package/dist/runLog.test.js.map +1 -0
- package/dist/scanEnvPaths.d.ts +18 -0
- package/dist/scanEnvPaths.d.ts.map +1 -0
- package/dist/scanEnvPaths.js +174 -0
- package/dist/scanEnvPaths.js.map +1 -0
- package/dist/scanEnvPaths.test.d.ts +2 -0
- package/dist/scanEnvPaths.test.d.ts.map +1 -0
- package/dist/scanEnvPaths.test.js +250 -0
- package/dist/scanEnvPaths.test.js.map +1 -0
- package/dist/taskCluster.d.ts +62 -0
- package/dist/taskCluster.d.ts.map +1 -0
- package/dist/taskCluster.js +180 -0
- package/dist/taskCluster.js.map +1 -0
- package/dist/taskCluster.test.d.ts +2 -0
- package/dist/taskCluster.test.d.ts.map +1 -0
- package/dist/taskCluster.test.js +375 -0
- package/dist/taskCluster.test.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +8 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctorLite.js","sourceRoot":"","sources":["../doctorLite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctorLite.test.d.ts","sourceRoot":"","sources":["../doctorLite.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
// venvkit/doctorLite.test.ts
|
|
2
|
+
// Unit tests for doctorLite using injectable runner for deterministic testing
|
|
3
|
+
import { describe, it, expect, vi } from "vitest";
|
|
4
|
+
import { doctorLite } from "./doctorLite.js";
|
|
5
|
+
// Helper to create RunResult
|
|
6
|
+
function ok(stdout, stderr = "") {
|
|
7
|
+
return { ok: true, exitCode: 0, stdout, stderr, timedOut: false };
|
|
8
|
+
}
|
|
9
|
+
function fail(exitCode, stderr, stdout = "") {
|
|
10
|
+
return { ok: false, exitCode, stdout, stderr, timedOut: false };
|
|
11
|
+
}
|
|
12
|
+
function timeout() {
|
|
13
|
+
return { ok: false, exitCode: null, stdout: "", stderr: "", timedOut: true };
|
|
14
|
+
}
|
|
15
|
+
// Common canned responses
|
|
16
|
+
const FACTS_HEALTHY_VENV = JSON.stringify({
|
|
17
|
+
version: "3.11.5 (main, Aug 24 2023)",
|
|
18
|
+
version_info: [3, 11, 5, "final", 0],
|
|
19
|
+
executable: "C:\\repo\\.venv\\Scripts\\python.exe",
|
|
20
|
+
prefix: "C:\\repo\\.venv",
|
|
21
|
+
base_prefix: "C:\\Python311",
|
|
22
|
+
bits: 64,
|
|
23
|
+
machine: "AMD64",
|
|
24
|
+
os: "windows",
|
|
25
|
+
py_path: ["C:\\repo\\.venv\\Scripts", "C:\\repo\\.venv\\Lib\\site-packages"],
|
|
26
|
+
enable_user_site: false,
|
|
27
|
+
user_site: "C:\\Users\\test\\AppData\\Roaming\\Python\\Python311\\site-packages",
|
|
28
|
+
});
|
|
29
|
+
const FACTS_BASE_PYTHON = JSON.stringify({
|
|
30
|
+
version: "3.11.5 (main, Aug 24 2023)",
|
|
31
|
+
version_info: [3, 11, 5, "final", 0],
|
|
32
|
+
executable: "C:\\Python311\\python.exe",
|
|
33
|
+
prefix: "C:\\Python311",
|
|
34
|
+
base_prefix: "C:\\Python311", // same as prefix = not a venv
|
|
35
|
+
bits: 64,
|
|
36
|
+
machine: "AMD64",
|
|
37
|
+
os: "windows",
|
|
38
|
+
py_path: ["C:\\Python311\\Lib\\site-packages"],
|
|
39
|
+
enable_user_site: true,
|
|
40
|
+
user_site: "C:\\Users\\test\\AppData\\Roaming\\Python\\Python311\\site-packages",
|
|
41
|
+
});
|
|
42
|
+
const FACTS_32BIT = JSON.stringify({
|
|
43
|
+
version: "3.11.5 (main, Aug 24 2023)",
|
|
44
|
+
version_info: [3, 11, 5, "final", 0],
|
|
45
|
+
executable: "C:\\Python311-32\\python.exe",
|
|
46
|
+
prefix: "C:\\Python311-32",
|
|
47
|
+
base_prefix: "C:\\Python311-32",
|
|
48
|
+
bits: 32,
|
|
49
|
+
machine: "x86",
|
|
50
|
+
os: "windows",
|
|
51
|
+
py_path: [],
|
|
52
|
+
enable_user_site: false,
|
|
53
|
+
user_site: "",
|
|
54
|
+
});
|
|
55
|
+
const PIP_VERSION_OK = "pip 23.2.1 from C:\\repo\\.venv\\Lib\\site-packages\\pip (python 3.11)";
|
|
56
|
+
const PIP_VERSION_MISMATCH = "pip 23.2.1 from C:\\repo\\.venv\\Lib\\site-packages\\pip (python 3.10)";
|
|
57
|
+
const IMPORTS_ALL_OK = JSON.stringify({
|
|
58
|
+
imports: [
|
|
59
|
+
{ module: "ssl", ok: true },
|
|
60
|
+
{ module: "ctypes", ok: true },
|
|
61
|
+
{ module: "sqlite3", ok: true },
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
const IMPORTS_SSL_FAIL = JSON.stringify({
|
|
65
|
+
imports: [
|
|
66
|
+
{ module: "ssl", ok: false, err: "ImportError('DLL load failed')", tb: "..." },
|
|
67
|
+
{ module: "ctypes", ok: true },
|
|
68
|
+
{ module: "sqlite3", ok: true },
|
|
69
|
+
],
|
|
70
|
+
});
|
|
71
|
+
const IMPORTS_DLL_FAIL = JSON.stringify({
|
|
72
|
+
imports: [
|
|
73
|
+
{ module: "ssl", ok: true },
|
|
74
|
+
{ module: "ctypes", ok: true },
|
|
75
|
+
{ module: "sqlite3", ok: true },
|
|
76
|
+
{ module: "torch", ok: false, err: "OSError('DLL load failed while importing torch')", tb: "..." },
|
|
77
|
+
],
|
|
78
|
+
});
|
|
79
|
+
const IMPORTS_ABI_MISMATCH = JSON.stringify({
|
|
80
|
+
imports: [
|
|
81
|
+
{ module: "ssl", ok: true },
|
|
82
|
+
{ module: "ctypes", ok: true },
|
|
83
|
+
{ module: "sqlite3", ok: true },
|
|
84
|
+
{
|
|
85
|
+
module: "numpy",
|
|
86
|
+
ok: false,
|
|
87
|
+
err: "ImportError('mach-o file, but is an incompatible architecture')",
|
|
88
|
+
tb: "...",
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
});
|
|
92
|
+
// Helper to create a mock runner with specific responses
|
|
93
|
+
function createMockRunner(overrides) {
|
|
94
|
+
return vi.fn(async (cmd, args) => {
|
|
95
|
+
const arg = args.join(" ");
|
|
96
|
+
// Order matters - more specific checks first
|
|
97
|
+
if (arg.includes("print('ok')"))
|
|
98
|
+
return ok("ok\n");
|
|
99
|
+
// pip --version
|
|
100
|
+
if (arg.includes("-m pip --version") || (arg.includes("pip") && arg.includes("--version"))) {
|
|
101
|
+
return overrides.pip ?? ok(PIP_VERSION_OK);
|
|
102
|
+
}
|
|
103
|
+
// pip check (strict mode)
|
|
104
|
+
if (arg.includes("-m pip check") || (arg.includes("pip") && arg.includes("check"))) {
|
|
105
|
+
return overrides.pipCheck ?? ok("");
|
|
106
|
+
}
|
|
107
|
+
// Import probe - check for importlib import
|
|
108
|
+
if (arg.includes("importlib.import_module")) {
|
|
109
|
+
return ok(overrides.imports ?? IMPORTS_ALL_OK);
|
|
110
|
+
}
|
|
111
|
+
// HTTPS probe - check for urllib
|
|
112
|
+
if (arg.includes("urllib.request.urlopen")) {
|
|
113
|
+
return ok(overrides.https ?? JSON.stringify({ ok: true, status: 200 }));
|
|
114
|
+
}
|
|
115
|
+
// Multi-version scan - check for importlib.metadata
|
|
116
|
+
if (arg.includes("importlib.metadata") || arg.includes("md.distributions")) {
|
|
117
|
+
return ok(overrides.multiVersion ?? JSON.stringify({ multi: {}, sys_path_top: [] }));
|
|
118
|
+
}
|
|
119
|
+
// Facts - this is the fallback for json.dumps (sys, platform, site)
|
|
120
|
+
if (arg.includes("sys.version") || arg.includes("platform.machine")) {
|
|
121
|
+
return ok(overrides.facts ?? FACTS_HEALTHY_VENV);
|
|
122
|
+
}
|
|
123
|
+
return fail(1, "unknown command: " + arg);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
describe("doctorLite", () => {
|
|
127
|
+
describe("healthy environment", () => {
|
|
128
|
+
it("returns good status for healthy venv (subprocess checks only)", async () => {
|
|
129
|
+
// Note: This test uses a fake venv path, so pyvenv.cfg validation will fail.
|
|
130
|
+
// We use a base python config (NOT_A_VENV) to skip pyvenv.cfg validation.
|
|
131
|
+
// For full integration testing with real venvs, use a real path.
|
|
132
|
+
const runner = createMockRunner({ facts: FACTS_BASE_PYTHON });
|
|
133
|
+
const report = await doctorLite({ pythonPath: "C:\\Python311\\python.exe" }, runner);
|
|
134
|
+
// Base python gets NOT_A_VENV (info, penalty 10) + USER_SITE_ENABLED (warn, penalty 10)
|
|
135
|
+
// Score: 100 - 10 - 10 = 80, which is "warn" status
|
|
136
|
+
expect(report.findings.filter((f) => f.severity === "bad")).toHaveLength(0);
|
|
137
|
+
expect(report.score).toBeGreaterThanOrEqual(70);
|
|
138
|
+
});
|
|
139
|
+
it("healthy venv subprocess checks pass (ignoring pyvenv.cfg)", async () => {
|
|
140
|
+
const runner = createMockRunner({});
|
|
141
|
+
const report = await doctorLite({ pythonPath: "C:\\repo\\.venv\\Scripts\\python.exe" }, runner);
|
|
142
|
+
// Since the venv path doesn't exist, pyvenv.cfg validation fails (penalty 25).
|
|
143
|
+
// But all subprocess-based checks pass - no bad findings from subprocess probes.
|
|
144
|
+
const subprocessFindings = report.findings.filter((f) => f.code !== "PYVENV_CFG_INVALID");
|
|
145
|
+
expect(subprocessFindings.filter((f) => f.severity === "bad")).toHaveLength(0);
|
|
146
|
+
expect(subprocessFindings.filter((f) => f.severity === "warn")).toHaveLength(0);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
describe("python execution failures", () => {
|
|
150
|
+
it("detects missing python executable", async () => {
|
|
151
|
+
const runner = vi.fn(async () => fail(1, "spawn ENOENT"));
|
|
152
|
+
const report = await doctorLite({ pythonPath: "/nonexistent/python" }, runner);
|
|
153
|
+
expect(report.status).toBe("bad");
|
|
154
|
+
expect(report.score).toBe(0);
|
|
155
|
+
expect(report.findings.some((f) => f.code === "PYTHON_EXEC_MISSING")).toBe(true);
|
|
156
|
+
});
|
|
157
|
+
it("detects timeout", async () => {
|
|
158
|
+
const runner = vi.fn(async () => timeout());
|
|
159
|
+
const report = await doctorLite({ pythonPath: "/slow/python" }, runner);
|
|
160
|
+
expect(report.status).toBe("bad");
|
|
161
|
+
expect(report.findings.some((f) => f.code === "PYTHON_EXEC_MISSING")).toBe(true);
|
|
162
|
+
expect(report.findings[0]?.evidence?.timedOut).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe("venv detection", () => {
|
|
166
|
+
it("detects non-venv interpreter", async () => {
|
|
167
|
+
const runner = createMockRunner({ facts: FACTS_BASE_PYTHON });
|
|
168
|
+
const report = await doctorLite({ pythonPath: "C:\\Python311\\python.exe" }, runner);
|
|
169
|
+
expect(report.findings.some((f) => f.code === "NOT_A_VENV")).toBe(true);
|
|
170
|
+
// NOT_A_VENV is info severity, so status might still be good
|
|
171
|
+
expect(report.findings.find((f) => f.code === "NOT_A_VENV")?.severity).toBe("info");
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
describe("architecture checks", () => {
|
|
175
|
+
it("detects arch mismatch when 64-bit required but 32-bit found", async () => {
|
|
176
|
+
const runner = createMockRunner({ facts: FACTS_32BIT });
|
|
177
|
+
const report = await doctorLite({ pythonPath: "C:\\Python311-32\\python.exe", requireX64: true }, runner);
|
|
178
|
+
expect(report.status).toBe("bad");
|
|
179
|
+
expect(report.score).toBeLessThanOrEqual(15); // clamped for ARCH_MISMATCH
|
|
180
|
+
expect(report.findings.some((f) => f.code === "ARCH_MISMATCH")).toBe(true);
|
|
181
|
+
});
|
|
182
|
+
it("does not flag arch when requireX64 is false", async () => {
|
|
183
|
+
const runner = createMockRunner({ facts: FACTS_32BIT });
|
|
184
|
+
const report = await doctorLite({ pythonPath: "C:\\Python311-32\\python.exe", requireX64: false }, runner);
|
|
185
|
+
expect(report.findings.some((f) => f.code === "ARCH_MISMATCH")).toBe(false);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe("pip checks", () => {
|
|
189
|
+
it("detects pip missing", async () => {
|
|
190
|
+
const runner = createMockRunner({ pip: fail(1, "No module named pip") });
|
|
191
|
+
const report = await doctorLite({ pythonPath: "C:\\repo\\.venv\\Scripts\\python.exe" }, runner);
|
|
192
|
+
expect(report.findings.some((f) => f.code === "PIP_MISSING")).toBe(true);
|
|
193
|
+
});
|
|
194
|
+
it("detects pip version mismatch", async () => {
|
|
195
|
+
const runner = createMockRunner({ pip: ok(PIP_VERSION_MISMATCH) });
|
|
196
|
+
const report = await doctorLite({ pythonPath: "C:\\repo\\.venv\\Scripts\\python.exe" }, runner);
|
|
197
|
+
expect(report.findings.some((f) => f.code === "PIP_POINTS_TO_OTHER_PYTHON")).toBe(true);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
describe("import failures", () => {
|
|
201
|
+
it("detects SSL broken", async () => {
|
|
202
|
+
const runner = createMockRunner({ imports: IMPORTS_SSL_FAIL });
|
|
203
|
+
const report = await doctorLite({ pythonPath: "C:\\repo\\.venv\\Scripts\\python.exe" }, runner);
|
|
204
|
+
expect(report.findings.some((f) => f.code === "SSL_BROKEN")).toBe(true);
|
|
205
|
+
});
|
|
206
|
+
it("detects DLL load failure", async () => {
|
|
207
|
+
const runner = createMockRunner({ imports: IMPORTS_DLL_FAIL });
|
|
208
|
+
const report = await doctorLite({ pythonPath: "C:\\repo\\.venv\\Scripts\\python.exe", requiredModules: ["torch"] }, runner);
|
|
209
|
+
expect(report.status).toBe("bad");
|
|
210
|
+
expect(report.score).toBeLessThanOrEqual(25); // clamped for DLL_LOAD_FAIL
|
|
211
|
+
expect(report.findings.some((f) => f.code === "DLL_LOAD_FAIL")).toBe(true);
|
|
212
|
+
});
|
|
213
|
+
it("detects ABI mismatch (macOS ARM)", async () => {
|
|
214
|
+
const runner = createMockRunner({ imports: IMPORTS_ABI_MISMATCH });
|
|
215
|
+
const report = await doctorLite({ pythonPath: "C:\\repo\\.venv\\Scripts\\python.exe", requiredModules: ["numpy"] }, runner);
|
|
216
|
+
expect(report.status).toBe("bad");
|
|
217
|
+
expect(report.score).toBeLessThanOrEqual(25); // clamped for ABI_MISMATCH
|
|
218
|
+
expect(report.findings.some((f) => f.code === "ABI_MISMATCH")).toBe(true);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
describe("HTTPS probe", () => {
|
|
222
|
+
it("detects cert verification failure", async () => {
|
|
223
|
+
const runner = createMockRunner({
|
|
224
|
+
https: JSON.stringify({
|
|
225
|
+
ok: false,
|
|
226
|
+
err: "SSLError('certificate_verify_failed')",
|
|
227
|
+
tb: "...",
|
|
228
|
+
}),
|
|
229
|
+
});
|
|
230
|
+
const report = await doctorLite({ pythonPath: "C:\\repo\\.venv\\Scripts\\python.exe", httpsProbe: true }, runner);
|
|
231
|
+
expect(report.findings.some((f) => f.code === "CERT_STORE_FAIL")).toBe(true);
|
|
232
|
+
const finding = report.findings.find((f) => f.code === "CERT_STORE_FAIL");
|
|
233
|
+
expect(finding?.evidence?.certish).toBe(true);
|
|
234
|
+
});
|
|
235
|
+
it("detects network failure (non-cert)", async () => {
|
|
236
|
+
const runner = createMockRunner({
|
|
237
|
+
https: JSON.stringify({
|
|
238
|
+
ok: false,
|
|
239
|
+
err: "URLError('getaddrinfo failed')",
|
|
240
|
+
tb: "...",
|
|
241
|
+
}),
|
|
242
|
+
});
|
|
243
|
+
const report = await doctorLite({ pythonPath: "C:\\repo\\.venv\\Scripts\\python.exe", httpsProbe: true }, runner);
|
|
244
|
+
expect(report.findings.some((f) => f.code === "CERT_STORE_FAIL")).toBe(true);
|
|
245
|
+
const finding = report.findings.find((f) => f.code === "CERT_STORE_FAIL");
|
|
246
|
+
expect(finding?.evidence?.certish).toBe(false);
|
|
247
|
+
expect(finding?.why).toContain("Network/TLS");
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
describe("scoring", () => {
|
|
251
|
+
it("clamps score for hard failures", async () => {
|
|
252
|
+
const runner = createMockRunner({ facts: FACTS_32BIT });
|
|
253
|
+
const report = await doctorLite({ pythonPath: "C:\\Python311-32\\python.exe", requireX64: true }, runner);
|
|
254
|
+
// ARCH_MISMATCH penalty is 80, but score is clamped to max 15
|
|
255
|
+
expect(report.score).toBeLessThanOrEqual(15);
|
|
256
|
+
});
|
|
257
|
+
it("accumulates penalties correctly", async () => {
|
|
258
|
+
const runner = createMockRunner({
|
|
259
|
+
facts: FACTS_BASE_PYTHON, // NOT_A_VENV (10) + USER_SITE_ENABLED (10)
|
|
260
|
+
pip: fail(1, "missing"), // PIP_MISSING (25)
|
|
261
|
+
});
|
|
262
|
+
const report = await doctorLite({ pythonPath: "C:\\Python311\\python.exe" }, runner);
|
|
263
|
+
// 100 - 10 (NOT_A_VENV) - 10 (USER_SITE_ENABLED) - 25 (PIP_MISSING) = 55
|
|
264
|
+
expect(report.score).toBe(55);
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
//# sourceMappingURL=doctorLite.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctorLite.test.js","sourceRoot":"","sources":["../doctorLite.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
// integration.test.ts
|
|
2
|
+
// End-to-end integration tests for venvkit workflow
|
|
3
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
4
|
+
import * as fs from "node:fs/promises";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
import * as os from "node:os";
|
|
7
|
+
import { scanEnvPaths } from "./scanEnvPaths.js";
|
|
8
|
+
import { mapRender } from "./mapRender.js";
|
|
9
|
+
import { appendRunLog, readRunLog, summarizeRuns } from "./runLog.js";
|
|
10
|
+
import { clusterRuns, summarizeClusters } from "./taskCluster.js";
|
|
11
|
+
describe("integration", () => {
|
|
12
|
+
let tempDir;
|
|
13
|
+
beforeEach(async () => {
|
|
14
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "venvkit-integration-"));
|
|
15
|
+
});
|
|
16
|
+
afterEach(async () => {
|
|
17
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
18
|
+
});
|
|
19
|
+
// Helper to create a mock venv structure
|
|
20
|
+
async function createMockVenv(venvPath) {
|
|
21
|
+
await fs.mkdir(venvPath, { recursive: true });
|
|
22
|
+
await fs.writeFile(path.join(venvPath, "pyvenv.cfg"), "home = C:\\Python311\nversion = 3.11.5\n");
|
|
23
|
+
const binDir = os.platform() === "win32" ? "Scripts" : "bin";
|
|
24
|
+
const pyExe = os.platform() === "win32" ? "python.exe" : "python";
|
|
25
|
+
await fs.mkdir(path.join(venvPath, binDir), { recursive: true });
|
|
26
|
+
await fs.writeFile(path.join(venvPath, binDir, pyExe), "fake python");
|
|
27
|
+
return path.join(venvPath, binDir, pyExe);
|
|
28
|
+
}
|
|
29
|
+
// Helper to create mock doctor report
|
|
30
|
+
function makeReport(pythonPath, opts = {}) {
|
|
31
|
+
return {
|
|
32
|
+
pythonPath,
|
|
33
|
+
ranAt: new Date().toISOString(),
|
|
34
|
+
status: opts.status ?? "good",
|
|
35
|
+
score: opts.score ?? 100,
|
|
36
|
+
summary: "Test report",
|
|
37
|
+
facts: {
|
|
38
|
+
version: "3.11.5 (main)",
|
|
39
|
+
version_info: [3, 11, 5],
|
|
40
|
+
executable: pythonPath,
|
|
41
|
+
prefix: pythonPath.replace(/[/\\](Scripts|bin)[/\\]python(\.exe)?$/, ""),
|
|
42
|
+
base_prefix: opts.basePrefix ?? "C:\\Python311",
|
|
43
|
+
bits: 64,
|
|
44
|
+
machine: "AMD64",
|
|
45
|
+
os: "windows",
|
|
46
|
+
py_path: [],
|
|
47
|
+
enable_user_site: false,
|
|
48
|
+
user_site: "",
|
|
49
|
+
},
|
|
50
|
+
findings: opts.findings ?? [],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Helper to create run event
|
|
54
|
+
function makeRunEvent(overrides = {}) {
|
|
55
|
+
return {
|
|
56
|
+
version: "1.0",
|
|
57
|
+
runId: `run_${Math.random().toString(36).slice(2, 10)}`,
|
|
58
|
+
at: overrides.at ?? new Date().toISOString(),
|
|
59
|
+
cwd: tempDir,
|
|
60
|
+
task: overrides.task ?? {
|
|
61
|
+
name: overrides.taskName ?? "pytest",
|
|
62
|
+
command: "pytest tests/",
|
|
63
|
+
args: ["tests/"],
|
|
64
|
+
requirements: {
|
|
65
|
+
packages: ["pytest"],
|
|
66
|
+
tags: ["test"],
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
selected: overrides.selected ?? {
|
|
70
|
+
pythonPath: overrides.pythonPath ?? "C:\\repo\\.venv\\Scripts\\python.exe",
|
|
71
|
+
score: 95,
|
|
72
|
+
status: "good",
|
|
73
|
+
},
|
|
74
|
+
outcome: overrides.outcome ?? {
|
|
75
|
+
ok: overrides.ok ?? true,
|
|
76
|
+
exitCode: overrides.ok === false ? 1 : 0,
|
|
77
|
+
durationMs: 1500,
|
|
78
|
+
errorClass: overrides.ok === false ? (overrides.errorClass ?? "RUNTIME_ERROR") : undefined,
|
|
79
|
+
},
|
|
80
|
+
doctor: overrides.doctor,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
describe("scan and doctor workflow", () => {
|
|
84
|
+
it("scans for venvs and creates doctor reports", async () => {
|
|
85
|
+
// Step 1: Create venvs
|
|
86
|
+
const py1 = await createMockVenv(path.join(tempDir, "project1", ".venv"));
|
|
87
|
+
const py2 = await createMockVenv(path.join(tempDir, "project2", ".venv"));
|
|
88
|
+
// Step 2: Scan for venvs
|
|
89
|
+
const scanResult = await scanEnvPaths({
|
|
90
|
+
roots: [tempDir],
|
|
91
|
+
maxDepth: 3,
|
|
92
|
+
includeUserHomeCache: false,
|
|
93
|
+
});
|
|
94
|
+
// Should find our mock venvs
|
|
95
|
+
expect(scanResult.meta.foundVenvs).toBeGreaterThanOrEqual(2);
|
|
96
|
+
// Step 3: Create mock doctor reports (in real usage, would run doctorLite)
|
|
97
|
+
const reports = [
|
|
98
|
+
makeReport(py1, { status: "good", score: 100 }),
|
|
99
|
+
makeReport(py2, { status: "warn", score: 70 }),
|
|
100
|
+
];
|
|
101
|
+
// Step 4: Render graph
|
|
102
|
+
const renderResult = mapRender(reports, [], { format: "both" });
|
|
103
|
+
expect(renderResult.graph.summary.envCount).toBe(2);
|
|
104
|
+
expect(renderResult.graph.summary.healthy).toBe(1);
|
|
105
|
+
expect(renderResult.graph.summary.warning).toBe(1);
|
|
106
|
+
expect(renderResult.mermaid).toContain("graph TD");
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe("task clustering workflow", () => {
|
|
110
|
+
it("logs tasks, clusters them, and generates insights", async () => {
|
|
111
|
+
const logPath = path.join(tempDir, "runs.jsonl");
|
|
112
|
+
// Step 1: Log multiple task runs
|
|
113
|
+
const events = [
|
|
114
|
+
makeRunEvent({ taskName: "pytest", ok: true }),
|
|
115
|
+
makeRunEvent({ taskName: "pytest", ok: true }),
|
|
116
|
+
makeRunEvent({ taskName: "pytest", ok: false, errorClass: "IMPORT_ERROR" }),
|
|
117
|
+
makeRunEvent({ taskName: "lint", ok: true }),
|
|
118
|
+
makeRunEvent({ taskName: "lint", ok: true }),
|
|
119
|
+
makeRunEvent({ taskName: "build", ok: false, errorClass: "SSL_BROKEN" }),
|
|
120
|
+
];
|
|
121
|
+
for (const evt of events) {
|
|
122
|
+
await appendRunLog(logPath, evt);
|
|
123
|
+
}
|
|
124
|
+
// Step 2: Read run log
|
|
125
|
+
const runs = await readRunLog(logPath);
|
|
126
|
+
expect(runs).toHaveLength(6);
|
|
127
|
+
// Step 3: Cluster runs
|
|
128
|
+
const clusters = clusterRuns(runs);
|
|
129
|
+
expect(clusters.length).toBe(3); // pytest, lint, build
|
|
130
|
+
const pytestCluster = clusters.find((c) => c.sig.name === "pytest");
|
|
131
|
+
expect(pytestCluster?.runs).toBe(3);
|
|
132
|
+
expect(pytestCluster?.ok).toBe(2);
|
|
133
|
+
expect(pytestCluster?.fail).toBe(1);
|
|
134
|
+
// Step 4: Get summary
|
|
135
|
+
const summary = summarizeClusters(clusters);
|
|
136
|
+
expect(summary.totalTasks).toBe(3);
|
|
137
|
+
expect(summary.totalRuns).toBe(6);
|
|
138
|
+
expect(summary.totalOk).toBe(4);
|
|
139
|
+
expect(summary.totalFail).toBe(2);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
describe("full graph rendering workflow", () => {
|
|
143
|
+
it("combines doctor reports and task runs into unified graph", async () => {
|
|
144
|
+
const logPath = path.join(tempDir, "runs.jsonl");
|
|
145
|
+
// Step 1: Create mock envs and doctor reports
|
|
146
|
+
const py1 = "C:\\project1\\.venv\\Scripts\\python.exe";
|
|
147
|
+
const py2 = "C:\\project2\\.venv\\Scripts\\python.exe";
|
|
148
|
+
const reports = [
|
|
149
|
+
makeReport(py1, { status: "good", score: 95, basePrefix: "C:\\Python311" }),
|
|
150
|
+
makeReport(py2, { status: "bad", score: 30, basePrefix: "C:\\Python311", findings: [
|
|
151
|
+
{ code: "SSL_BROKEN", severity: "bad", penalty: 40, what: "ssl", why: "why", fix: [] },
|
|
152
|
+
] }),
|
|
153
|
+
];
|
|
154
|
+
// Step 2: Log task runs against these envs
|
|
155
|
+
const events = [
|
|
156
|
+
makeRunEvent({ taskName: "pytest", pythonPath: py1, ok: true }),
|
|
157
|
+
makeRunEvent({ taskName: "pytest", pythonPath: py1, ok: true }),
|
|
158
|
+
makeRunEvent({ taskName: "pytest", pythonPath: py2, ok: false, errorClass: "SSL_BROKEN" }),
|
|
159
|
+
makeRunEvent({ taskName: "pytest", pythonPath: py2, ok: false, errorClass: "SSL_BROKEN" }),
|
|
160
|
+
];
|
|
161
|
+
for (const evt of events) {
|
|
162
|
+
await appendRunLog(logPath, evt);
|
|
163
|
+
}
|
|
164
|
+
const runs = await readRunLog(logPath);
|
|
165
|
+
// Step 3: Render combined graph
|
|
166
|
+
const result = mapRender(reports, runs, {
|
|
167
|
+
format: "both",
|
|
168
|
+
taskMode: "clustered",
|
|
169
|
+
includeHotEdgeLabels: true,
|
|
170
|
+
});
|
|
171
|
+
// Verify graph structure
|
|
172
|
+
expect(result.graph.summary.envCount).toBe(2);
|
|
173
|
+
expect(result.graph.summary.taskCount).toBe(1); // 1 clustered pytest task
|
|
174
|
+
// Verify insights
|
|
175
|
+
expect(result.insights.length).toBeGreaterThan(0);
|
|
176
|
+
// Verify mermaid output
|
|
177
|
+
expect(result.mermaid).toContain("graph TD");
|
|
178
|
+
expect(result.mermaid).toContain("pytest");
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
describe("workflow with logging", () => {
|
|
182
|
+
it("tracks task execution lifecycle through logging", async () => {
|
|
183
|
+
const logPath = path.join(tempDir, "lifecycle.jsonl");
|
|
184
|
+
// Simulate a development session with multiple task runs
|
|
185
|
+
// Session 1: Initial development
|
|
186
|
+
const session1Events = [
|
|
187
|
+
makeRunEvent({ taskName: "lint", ok: true, at: "2024-01-01T10:00:00Z" }),
|
|
188
|
+
makeRunEvent({ taskName: "test", ok: true, at: "2024-01-01T10:01:00Z" }),
|
|
189
|
+
makeRunEvent({ taskName: "build", ok: true, at: "2024-01-01T10:02:00Z" }),
|
|
190
|
+
];
|
|
191
|
+
for (const evt of session1Events) {
|
|
192
|
+
await appendRunLog(logPath, evt);
|
|
193
|
+
}
|
|
194
|
+
// Session 2: Bug introduced
|
|
195
|
+
const session2Events = [
|
|
196
|
+
makeRunEvent({ taskName: "lint", ok: true, at: "2024-01-02T10:00:00Z" }),
|
|
197
|
+
makeRunEvent({ taskName: "test", ok: false, errorClass: "RUNTIME_ERROR", at: "2024-01-02T10:01:00Z" }),
|
|
198
|
+
makeRunEvent({ taskName: "build", ok: false, errorClass: "BUILD_FAIL", at: "2024-01-02T10:02:00Z" }),
|
|
199
|
+
];
|
|
200
|
+
for (const evt of session2Events) {
|
|
201
|
+
await appendRunLog(logPath, evt);
|
|
202
|
+
}
|
|
203
|
+
// Read all logs
|
|
204
|
+
const runs = await readRunLog(logPath);
|
|
205
|
+
expect(runs).toHaveLength(6);
|
|
206
|
+
// Summarize
|
|
207
|
+
const summary = summarizeRuns(runs);
|
|
208
|
+
expect(summary.total).toBe(6);
|
|
209
|
+
expect(summary.passed).toBe(4);
|
|
210
|
+
expect(summary.failed).toBe(2);
|
|
211
|
+
// Task-level summary
|
|
212
|
+
expect(summary.byTask.get("lint")).toEqual({ passed: 2, failed: 0 });
|
|
213
|
+
expect(summary.byTask.get("test")).toEqual({ passed: 1, failed: 1 });
|
|
214
|
+
expect(summary.byTask.get("build")).toEqual({ passed: 1, failed: 1 });
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
describe("CLI integration", () => {
|
|
218
|
+
it("produces all expected output files", async () => {
|
|
219
|
+
// This test verifies the expected output structure from CLI
|
|
220
|
+
// without actually running the CLI (which would require real Python envs)
|
|
221
|
+
const outDir = path.join(tempDir, "output");
|
|
222
|
+
await fs.mkdir(outDir, { recursive: true });
|
|
223
|
+
// Create mock outputs as CLI would
|
|
224
|
+
const reports = [makeReport("C:\\project\\.venv\\Scripts\\python.exe")];
|
|
225
|
+
const result = mapRender(reports, [], { format: "both" });
|
|
226
|
+
// Write outputs as CLI would
|
|
227
|
+
await fs.writeFile(path.join(outDir, "venv-map.json"), JSON.stringify(result.graph, null, 2));
|
|
228
|
+
await fs.writeFile(path.join(outDir, "venv-map.mmd"), result.mermaid ?? "");
|
|
229
|
+
await fs.writeFile(path.join(outDir, "reports.json"), JSON.stringify(reports, null, 2));
|
|
230
|
+
await fs.writeFile(path.join(outDir, "insights.json"), JSON.stringify(result.insights, null, 2));
|
|
231
|
+
// Verify all files exist
|
|
232
|
+
const files = await fs.readdir(outDir);
|
|
233
|
+
expect(files).toContain("venv-map.json");
|
|
234
|
+
expect(files).toContain("venv-map.mmd");
|
|
235
|
+
expect(files).toContain("reports.json");
|
|
236
|
+
expect(files).toContain("insights.json");
|
|
237
|
+
// Verify JSON is valid
|
|
238
|
+
const graphJson = JSON.parse(await fs.readFile(path.join(outDir, "venv-map.json"), "utf8"));
|
|
239
|
+
expect(graphJson.summary).toBeDefined();
|
|
240
|
+
expect(graphJson.nodes).toBeDefined();
|
|
241
|
+
expect(graphJson.edges).toBeDefined();
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
//# sourceMappingURL=integration.test.js.map
|