Files
TJWaterAgent/tests/skills/store.test.ts
T

68 lines
1.9 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it } from "bun:test";
import { mkdir, mkdtemp, readFile, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { SkillStore } from "../../src/skills/store.js";
describe("SkillStore", () => {
let originalCwd: string;
let tempDir: string;
let alternateCwd: string;
let skillsRoot: string;
let backupRoot: string;
let store: SkillStore;
beforeEach(async () => {
originalCwd = process.cwd();
tempDir = await mkdtemp(join(tmpdir(), "tjwater-skills-"));
alternateCwd = join(tempDir, "runtime-cwd");
skillsRoot = join(tempDir, "project", ".opencode", "skills");
backupRoot = join(tempDir, "backup", "skills");
store = new SkillStore(skillsRoot, backupRoot);
});
afterEach(async () => {
process.chdir(originalCwd);
await rm(tempDir, { force: true, recursive: true });
});
it("writes scripts under the configured skills root regardless of process cwd", async () => {
await mkdir(alternateCwd, { recursive: true });
process.chdir(alternateCwd);
const result = await store.writeScript(
"workflow/hydraulic-bottleneck-analysis",
"scripts/analyze.py",
"print('ok')\n",
);
expect(result).toEqual({
changed: true,
detail: "script written",
target: join(
skillsRoot,
"workflow",
"hydraulic-bottleneck-analysis",
"scripts",
"analyze.py",
),
});
await expect(readFile(result.target, "utf8")).resolves.toBe("print('ok')\n");
});
it("rejects script paths outside scripts/*.py", async () => {
const result = await store.writeScript(
"workflow/hydraulic-bottleneck-analysis",
"analyze.ts",
"console.log('ok')\n",
);
expect(result).toEqual({
changed: false,
detail: "invalid script file_path",
target: "",
});
});
});