test(agents): dedupe skill helper fixtures and cover empty-body rendering
This commit is contained in:
@@ -6,6 +6,16 @@ import { writeSkill } from "./skills.e2e-test-helpers.js";
|
||||
|
||||
const tempDirs: string[] = [];
|
||||
|
||||
async function withTempSkillDir(
|
||||
name: string,
|
||||
run: (params: { root: string; skillDir: string }) => Promise<void>,
|
||||
) {
|
||||
const root = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-skill-helper-"));
|
||||
tempDirs.push(root);
|
||||
const skillDir = path.join(root, name);
|
||||
await run({ root, skillDir });
|
||||
}
|
||||
|
||||
afterEach(async () => {
|
||||
await Promise.all(
|
||||
tempDirs.splice(0, tempDirs.length).map((dir) => fs.rm(dir, { recursive: true, force: true })),
|
||||
@@ -14,39 +24,53 @@ afterEach(async () => {
|
||||
|
||||
describe("writeSkill", () => {
|
||||
it("writes SKILL.md with required fields", async () => {
|
||||
const root = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-skill-helper-"));
|
||||
tempDirs.push(root);
|
||||
const skillDir = path.join(root, "demo-skill");
|
||||
await withTempSkillDir("demo-skill", async ({ skillDir }) => {
|
||||
await writeSkill({
|
||||
dir: skillDir,
|
||||
name: "demo-skill",
|
||||
description: "Demo",
|
||||
});
|
||||
|
||||
await writeSkill({
|
||||
dir: skillDir,
|
||||
name: "demo-skill",
|
||||
description: "Demo",
|
||||
const content = await fs.readFile(path.join(skillDir, "SKILL.md"), "utf-8");
|
||||
expect(content).toContain("name: demo-skill");
|
||||
expect(content).toContain("description: Demo");
|
||||
expect(content).toContain("# demo-skill");
|
||||
});
|
||||
|
||||
const content = await fs.readFile(path.join(skillDir, "SKILL.md"), "utf-8");
|
||||
expect(content).toContain("name: demo-skill");
|
||||
expect(content).toContain("description: Demo");
|
||||
expect(content).toContain("# demo-skill");
|
||||
});
|
||||
|
||||
it("includes optional metadata, body, and frontmatterExtra", async () => {
|
||||
const root = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-skill-helper-"));
|
||||
tempDirs.push(root);
|
||||
const skillDir = path.join(root, "custom-skill");
|
||||
await withTempSkillDir("custom-skill", async ({ skillDir }) => {
|
||||
await writeSkill({
|
||||
dir: skillDir,
|
||||
name: "custom-skill",
|
||||
description: "Custom",
|
||||
metadata: '{"openclaw":{"always":true}}',
|
||||
frontmatterExtra: "user-invocable: false",
|
||||
body: "# Custom Body\n",
|
||||
});
|
||||
|
||||
await writeSkill({
|
||||
dir: skillDir,
|
||||
name: "custom-skill",
|
||||
description: "Custom",
|
||||
metadata: '{"openclaw":{"always":true}}',
|
||||
frontmatterExtra: "user-invocable: false",
|
||||
body: "# Custom Body\n",
|
||||
const content = await fs.readFile(path.join(skillDir, "SKILL.md"), "utf-8");
|
||||
expect(content).toContain('metadata: {"openclaw":{"always":true}}');
|
||||
expect(content).toContain("user-invocable: false");
|
||||
expect(content).toContain("# Custom Body");
|
||||
});
|
||||
});
|
||||
|
||||
const content = await fs.readFile(path.join(skillDir, "SKILL.md"), "utf-8");
|
||||
expect(content).toContain('metadata: {"openclaw":{"always":true}}');
|
||||
expect(content).toContain("user-invocable: false");
|
||||
expect(content).toContain("# Custom Body");
|
||||
it("keeps empty body and trims blank frontmatter extra entries", async () => {
|
||||
await withTempSkillDir("empty-body-skill", async ({ skillDir }) => {
|
||||
await writeSkill({
|
||||
dir: skillDir,
|
||||
name: "empty-body-skill",
|
||||
description: "Empty body",
|
||||
frontmatterExtra: " ",
|
||||
body: "",
|
||||
});
|
||||
|
||||
const content = await fs.readFile(path.join(skillDir, "SKILL.md"), "utf-8");
|
||||
expect(content).toContain("name: empty-body-skill");
|
||||
expect(content).toContain("description: Empty body");
|
||||
expect(content).not.toContain("# empty-body-skill");
|
||||
expect(content).not.toContain("user-invocable:");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user