test: isolate skills suite env and trim scan overhead

This commit is contained in:
Peter Steinberger
2026-02-22 15:35:47 +00:00
parent 6cdeb62a01
commit 3046fa31e8

View File

@@ -1,7 +1,8 @@
import fs from "node:fs/promises"; import fs from "node:fs/promises";
import os from "node:os"; import os from "node:os";
import path from "node:path"; import path from "node:path";
import { afterEach, describe, expect, it } from "vitest"; import { afterAll, beforeAll, describe, expect, it } from "vitest";
import { createTempHomeEnv, type TempHomeEnv } from "../test-utils/temp-home.js";
import { writeSkill } from "./skills.e2e-test-helpers.js"; import { writeSkill } from "./skills.e2e-test-helpers.js";
import { import {
applySkillEnvOverrides, applySkillEnvOverrides,
@@ -13,6 +14,12 @@ import {
} from "./skills.js"; } from "./skills.js";
const tempDirs: string[] = []; const tempDirs: string[] = [];
let tempHome: TempHomeEnv | null = null;
const resolveTestSkillDirs = (workspaceDir: string) => ({
managedSkillsDir: path.join(workspaceDir, ".managed"),
bundledSkillsDir: path.join(workspaceDir, ".bundled"),
});
const makeWorkspace = async () => { const makeWorkspace = async () => {
const workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-")); const workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-"));
@@ -44,7 +51,19 @@ const withClearedEnv = <T>(
} }
}; };
afterEach(async () => { beforeAll(async () => {
tempHome = await createTempHomeEnv("openclaw-skills-home-");
await fs.mkdir(path.join(tempHome.home, ".openclaw", "agents", "main", "sessions"), {
recursive: true,
});
});
afterAll(async () => {
if (tempHome) {
await tempHome.restore();
tempHome = null;
}
await Promise.all( await Promise.all(
tempDirs.splice(0, tempDirs.length).map((dir) => fs.rm(dir, { recursive: true, force: true })), tempDirs.splice(0, tempDirs.length).map((dir) => fs.rm(dir, { recursive: true, force: true })),
); );
@@ -76,8 +95,7 @@ describe("buildWorkspaceSkillCommandSpecs", () => {
}); });
const commands = buildWorkspaceSkillCommandSpecs(workspaceDir, { const commands = buildWorkspaceSkillCommandSpecs(workspaceDir, {
managedSkillsDir: path.join(workspaceDir, ".managed"), ...resolveTestSkillDirs(workspaceDir),
bundledSkillsDir: path.join(workspaceDir, ".bundled"),
reservedNames: new Set(["help"]), reservedNames: new Set(["help"]),
}); });
@@ -101,10 +119,10 @@ describe("buildWorkspaceSkillCommandSpecs", () => {
description: "Short description", description: "Short description",
}); });
const commands = buildWorkspaceSkillCommandSpecs(workspaceDir, { const commands = buildWorkspaceSkillCommandSpecs(
managedSkillsDir: path.join(workspaceDir, ".managed"), workspaceDir,
bundledSkillsDir: path.join(workspaceDir, ".bundled"), resolveTestSkillDirs(workspaceDir),
}); );
const longCmd = commands.find((entry) => entry.skillName === "long-desc"); const longCmd = commands.find((entry) => entry.skillName === "long-desc");
const shortCmd = commands.find((entry) => entry.skillName === "short-desc"); const shortCmd = commands.find((entry) => entry.skillName === "short-desc");
@@ -123,7 +141,10 @@ describe("buildWorkspaceSkillCommandSpecs", () => {
frontmatterExtra: "command-dispatch: tool\ncommand-tool: sessions_send", frontmatterExtra: "command-dispatch: tool\ncommand-tool: sessions_send",
}); });
const commands = buildWorkspaceSkillCommandSpecs(workspaceDir); const commands = buildWorkspaceSkillCommandSpecs(
workspaceDir,
resolveTestSkillDirs(workspaceDir),
);
const cmd = commands.find((entry) => entry.skillName === "tool-dispatch"); const cmd = commands.find((entry) => entry.skillName === "tool-dispatch");
expect(cmd?.dispatch).toEqual({ kind: "tool", toolName: "sessions_send", argMode: "raw" }); expect(cmd?.dispatch).toEqual({ kind: "tool", toolName: "sessions_send", argMode: "raw" });
}); });
@@ -133,10 +154,7 @@ describe("buildWorkspaceSkillsPrompt", () => {
it("returns empty prompt when skills dirs are missing", async () => { it("returns empty prompt when skills dirs are missing", async () => {
const workspaceDir = await makeWorkspace(); const workspaceDir = await makeWorkspace();
const prompt = buildWorkspaceSkillsPrompt(workspaceDir, { const prompt = buildWorkspaceSkillsPrompt(workspaceDir, resolveTestSkillDirs(workspaceDir));
managedSkillsDir: path.join(workspaceDir, ".managed"),
bundledSkillsDir: path.join(workspaceDir, ".bundled"),
});
expect(prompt).toBe(""); expect(prompt).toBe("");
}); });
@@ -216,9 +234,7 @@ describe("buildWorkspaceSkillsPrompt", () => {
body: "# Demo Skill\n", body: "# Demo Skill\n",
}); });
const prompt = buildWorkspaceSkillsPrompt(workspaceDir, { const prompt = buildWorkspaceSkillsPrompt(workspaceDir, resolveTestSkillDirs(workspaceDir));
managedSkillsDir: path.join(workspaceDir, ".managed"),
});
expect(prompt).toContain("demo-skill"); expect(prompt).toContain("demo-skill");
expect(prompt).toContain("Does demo things"); expect(prompt).toContain("Does demo things");
expect(prompt).toContain(path.join(skillDir, "SKILL.md")); expect(prompt).toContain(path.join(skillDir, "SKILL.md"));
@@ -236,9 +252,7 @@ describe("applySkillEnvOverrides", () => {
metadata: '{"openclaw":{"requires":{"env":["ENV_KEY"]},"primaryEnv":"ENV_KEY"}}', metadata: '{"openclaw":{"requires":{"env":["ENV_KEY"]},"primaryEnv":"ENV_KEY"}}',
}); });
const entries = loadWorkspaceSkillEntries(workspaceDir, { const entries = loadWorkspaceSkillEntries(workspaceDir, resolveTestSkillDirs(workspaceDir));
managedSkillsDir: path.join(workspaceDir, ".managed"),
});
withClearedEnv(["ENV_KEY"], () => { withClearedEnv(["ENV_KEY"], () => {
const restore = applySkillEnvOverrides({ const restore = applySkillEnvOverrides({
@@ -266,7 +280,7 @@ describe("applySkillEnvOverrides", () => {
}); });
const snapshot = buildWorkspaceSkillSnapshot(workspaceDir, { const snapshot = buildWorkspaceSkillSnapshot(workspaceDir, {
managedSkillsDir: path.join(workspaceDir, ".managed"), ...resolveTestSkillDirs(workspaceDir),
config: { skills: { entries: { "env-skill": { apiKey: "snap-key" } } } }, config: { skills: { entries: { "env-skill": { apiKey: "snap-key" } } } },
}); });
@@ -296,9 +310,7 @@ describe("applySkillEnvOverrides", () => {
'{"openclaw":{"requires":{"env":["OPENAI_API_KEY","NODE_OPTIONS"]},"primaryEnv":"OPENAI_API_KEY"}}', '{"openclaw":{"requires":{"env":["OPENAI_API_KEY","NODE_OPTIONS"]},"primaryEnv":"OPENAI_API_KEY"}}',
}); });
const entries = loadWorkspaceSkillEntries(workspaceDir, { const entries = loadWorkspaceSkillEntries(workspaceDir, resolveTestSkillDirs(workspaceDir));
managedSkillsDir: path.join(workspaceDir, ".managed"),
});
withClearedEnv(["OPENAI_API_KEY", "NODE_OPTIONS"], () => { withClearedEnv(["OPENAI_API_KEY", "NODE_OPTIONS"], () => {
const restore = applySkillEnvOverrides({ const restore = applySkillEnvOverrides({
@@ -338,9 +350,7 @@ describe("applySkillEnvOverrides", () => {
metadata: '{"openclaw":{"requires":{"env":["BASH_ENV","SHELL"]}}}', metadata: '{"openclaw":{"requires":{"env":["BASH_ENV","SHELL"]}}}',
}); });
const entries = loadWorkspaceSkillEntries(workspaceDir, { const entries = loadWorkspaceSkillEntries(workspaceDir, resolveTestSkillDirs(workspaceDir));
managedSkillsDir: path.join(workspaceDir, ".managed"),
});
withClearedEnv(["BASH_ENV", "SHELL"], () => { withClearedEnv(["BASH_ENV", "SHELL"], () => {
const restore = applySkillEnvOverrides({ const restore = applySkillEnvOverrides({
@@ -392,7 +402,7 @@ describe("applySkillEnvOverrides", () => {
}, },
}; };
const snapshot = buildWorkspaceSkillSnapshot(workspaceDir, { const snapshot = buildWorkspaceSkillSnapshot(workspaceDir, {
managedSkillsDir: path.join(workspaceDir, ".managed"), ...resolveTestSkillDirs(workspaceDir),
config, config,
}); });