mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 18:20:44 +00:00
test: dedupe skills fixture setup
This commit is contained in:
@@ -4,7 +4,7 @@ import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
|
|||||||
import { withPathResolutionEnv } from "../test-utils/env.js";
|
import { withPathResolutionEnv } from "../test-utils/env.js";
|
||||||
import { createFixtureSuite } from "../test-utils/fixture-suite.js";
|
import { createFixtureSuite } from "../test-utils/fixture-suite.js";
|
||||||
import { createTempHomeEnv, type TempHomeEnv } from "../test-utils/temp-home.js";
|
import { createTempHomeEnv, type TempHomeEnv } from "../test-utils/temp-home.js";
|
||||||
import { writeSkill } from "./skills.e2e-test-helpers.js";
|
import { writeSkill, writeWorkspaceSkills } from "./skills.e2e-test-helpers.js";
|
||||||
import {
|
import {
|
||||||
restoreMockSkillsHomeEnv,
|
restoreMockSkillsHomeEnv,
|
||||||
setMockSkillsHomeEnv,
|
setMockSkillsHomeEnv,
|
||||||
@@ -199,21 +199,11 @@ describe("buildWorkspaceSkillSnapshot", () => {
|
|||||||
|
|
||||||
it("uses agents.list[].skills as a full replacement for inherited defaults", async () => {
|
it("uses agents.list[].skills as a full replacement for inherited defaults", async () => {
|
||||||
const workspaceDir = await fixtureSuite.createCaseDir("workspace");
|
const workspaceDir = await fixtureSuite.createCaseDir("workspace");
|
||||||
await writeSkill({
|
await writeWorkspaceSkills(workspaceDir, [
|
||||||
dir: path.join(workspaceDir, "skills", "github"),
|
{ name: "github", description: "GitHub" },
|
||||||
name: "github",
|
{ name: "weather", description: "Weather" },
|
||||||
description: "GitHub",
|
{ name: "docs-search", description: "Docs" },
|
||||||
});
|
]);
|
||||||
await writeSkill({
|
|
||||||
dir: path.join(workspaceDir, "skills", "weather"),
|
|
||||||
name: "weather",
|
|
||||||
description: "Weather",
|
|
||||||
});
|
|
||||||
await writeSkill({
|
|
||||||
dir: path.join(workspaceDir, "skills", "docs-search"),
|
|
||||||
name: "docs-search",
|
|
||||||
description: "Docs",
|
|
||||||
});
|
|
||||||
|
|
||||||
const snapshot = buildSnapshot(workspaceDir, {
|
const snapshot = buildSnapshot(workspaceDir, {
|
||||||
agentId: "writer",
|
agentId: "writer",
|
||||||
|
|||||||
@@ -28,3 +28,21 @@ ${body ?? `# ${name}\n`}
|
|||||||
"utf-8",
|
"utf-8",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function writeWorkspaceSkills(
|
||||||
|
workspaceDir: string,
|
||||||
|
skills: ReadonlyArray<{
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
metadata?: string;
|
||||||
|
body?: string;
|
||||||
|
frontmatterExtra?: string;
|
||||||
|
}>,
|
||||||
|
) {
|
||||||
|
for (const skill of skills) {
|
||||||
|
await writeSkill({
|
||||||
|
dir: path.join(workspaceDir, "skills", skill.name),
|
||||||
|
...skill,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from "vitest
|
|||||||
import { resetLogger, setLoggerOverride } from "../logging/logger.js";
|
import { resetLogger, setLoggerOverride } from "../logging/logger.js";
|
||||||
import { loggingState } from "../logging/state.js";
|
import { loggingState } from "../logging/state.js";
|
||||||
import { withPathResolutionEnv } from "../test-utils/env.js";
|
import { withPathResolutionEnv } from "../test-utils/env.js";
|
||||||
import { writeSkill } from "./skills.e2e-test-helpers.js";
|
import { writeSkill, writeWorkspaceSkills } from "./skills.e2e-test-helpers.js";
|
||||||
import {
|
import {
|
||||||
restoreMockSkillsHomeEnv,
|
restoreMockSkillsHomeEnv,
|
||||||
setMockSkillsHomeEnv,
|
setMockSkillsHomeEnv,
|
||||||
@@ -30,6 +30,18 @@ function withWorkspaceHome<T>(workspaceDir: string, cb: () => T): T {
|
|||||||
return withPathResolutionEnv(workspaceDir, { PATH: "" }, () => cb());
|
return withPathResolutionEnv(workspaceDir, { PATH: "" }, () => cb());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function captureWarningLogger() {
|
||||||
|
setLoggerOverride({ level: "silent", consoleLevel: "warn" });
|
||||||
|
const warn = vi.fn();
|
||||||
|
loggingState.rawConsole = {
|
||||||
|
log: vi.fn(),
|
||||||
|
info: vi.fn(),
|
||||||
|
warn,
|
||||||
|
error: vi.fn(),
|
||||||
|
};
|
||||||
|
return warn;
|
||||||
|
}
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-skills-workspace-"));
|
tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-skills-workspace-"));
|
||||||
fakeHome = path.join(tempRoot, "home");
|
fakeHome = path.join(tempRoot, "home");
|
||||||
@@ -141,21 +153,11 @@ describe("loadWorkspaceSkillEntries", () => {
|
|||||||
|
|
||||||
it("applies agent skill filters and replacement semantics", async () => {
|
it("applies agent skill filters and replacement semantics", async () => {
|
||||||
const workspaceDir = await createTempWorkspaceDir();
|
const workspaceDir = await createTempWorkspaceDir();
|
||||||
await writeSkill({
|
await writeWorkspaceSkills(workspaceDir, [
|
||||||
dir: path.join(workspaceDir, "skills", "github"),
|
{ name: "github", description: "GitHub" },
|
||||||
name: "github",
|
{ name: "weather", description: "Weather" },
|
||||||
description: "GitHub",
|
{ name: "docs-search", description: "Docs" },
|
||||||
});
|
]);
|
||||||
await writeSkill({
|
|
||||||
dir: path.join(workspaceDir, "skills", "weather"),
|
|
||||||
name: "weather",
|
|
||||||
description: "Weather",
|
|
||||||
});
|
|
||||||
await writeSkill({
|
|
||||||
dir: path.join(workspaceDir, "skills", "docs-search"),
|
|
||||||
name: "docs-search",
|
|
||||||
description: "Docs",
|
|
||||||
});
|
|
||||||
|
|
||||||
const defaultEntries = loadWorkspaceSkillEntries(workspaceDir, {
|
const defaultEntries = loadWorkspaceSkillEntries(workspaceDir, {
|
||||||
config: {
|
config: {
|
||||||
@@ -238,14 +240,7 @@ describe("loadWorkspaceSkillEntries", () => {
|
|||||||
await fs.mkdir(path.join(workspaceDir, "skills"), { recursive: true });
|
await fs.mkdir(path.join(workspaceDir, "skills"), { recursive: true });
|
||||||
const requestedPath = path.join(workspaceDir, "skills", "escaped-skill");
|
const requestedPath = path.join(workspaceDir, "skills", "escaped-skill");
|
||||||
await fs.symlink(escapedSkillDir, requestedPath, "dir");
|
await fs.symlink(escapedSkillDir, requestedPath, "dir");
|
||||||
setLoggerOverride({ level: "silent", consoleLevel: "warn" });
|
const warn = captureWarningLogger();
|
||||||
const warn = vi.fn();
|
|
||||||
loggingState.rawConsole = {
|
|
||||||
log: vi.fn(),
|
|
||||||
info: vi.fn(),
|
|
||||||
warn,
|
|
||||||
error: vi.fn(),
|
|
||||||
};
|
|
||||||
|
|
||||||
const entries = loadWorkspaceSkillEntries(workspaceDir, {
|
const entries = loadWorkspaceSkillEntries(workspaceDir, {
|
||||||
managedSkillsDir: path.join(workspaceDir, ".managed"),
|
managedSkillsDir: path.join(workspaceDir, ".managed"),
|
||||||
@@ -279,14 +274,7 @@ describe("loadWorkspaceSkillEntries", () => {
|
|||||||
await fs.mkdir(bundledDir, { recursive: true });
|
await fs.mkdir(bundledDir, { recursive: true });
|
||||||
const requestedPath = path.join(bundledDir, "escaped-bundled-skill");
|
const requestedPath = path.join(bundledDir, "escaped-bundled-skill");
|
||||||
await fs.symlink(escapedSkillDir, requestedPath, "dir");
|
await fs.symlink(escapedSkillDir, requestedPath, "dir");
|
||||||
setLoggerOverride({ level: "silent", consoleLevel: "warn" });
|
const warn = captureWarningLogger();
|
||||||
const warn = vi.fn();
|
|
||||||
loggingState.rawConsole = {
|
|
||||||
log: vi.fn(),
|
|
||||||
info: vi.fn(),
|
|
||||||
warn,
|
|
||||||
error: vi.fn(),
|
|
||||||
};
|
|
||||||
|
|
||||||
const entries = loadWorkspaceSkillEntries(workspaceDir, {
|
const entries = loadWorkspaceSkillEntries(workspaceDir, {
|
||||||
managedSkillsDir: path.join(workspaceDir, ".managed"),
|
managedSkillsDir: path.join(workspaceDir, ".managed"),
|
||||||
@@ -320,14 +308,7 @@ describe("loadWorkspaceSkillEntries", () => {
|
|||||||
await fs.mkdir(bundledDir, { recursive: true });
|
await fs.mkdir(bundledDir, { recursive: true });
|
||||||
const requestedPath = path.join(bundledDir, "escaped-bundled-skill");
|
const requestedPath = path.join(bundledDir, "escaped-bundled-skill");
|
||||||
await fs.symlink(escapedSkillDir, requestedPath, "dir");
|
await fs.symlink(escapedSkillDir, requestedPath, "dir");
|
||||||
setLoggerOverride({ level: "silent", consoleLevel: "warn" });
|
const warn = captureWarningLogger();
|
||||||
const warn = vi.fn();
|
|
||||||
loggingState.rawConsole = {
|
|
||||||
log: vi.fn(),
|
|
||||||
info: vi.fn(),
|
|
||||||
warn,
|
|
||||||
error: vi.fn(),
|
|
||||||
};
|
|
||||||
|
|
||||||
loadWorkspaceSkillEntries(workspaceDir, {
|
loadWorkspaceSkillEntries(workspaceDir, {
|
||||||
managedSkillsDir: path.join(workspaceDir, ".managed"),
|
managedSkillsDir: path.join(workspaceDir, ".managed"),
|
||||||
|
|||||||
Reference in New Issue
Block a user