Files
clawdbot/src/auto-reply/reply.media-note.test.ts
2026-01-09 16:41:05 +01:00

101 lines
3.0 KiB
TypeScript

import path from "node:path";
import { describe, expect, it, vi } from "vitest";
import { withTempHome as withTempHomeBase } from "../../test/helpers/temp-home.js";
import { runEmbeddedPiAgent } from "../agents/pi-embedded.js";
import { getReplyFromConfig } from "./reply.js";
vi.mock("../agents/pi-embedded.js", () => ({
abortEmbeddedPiRun: vi.fn().mockReturnValue(false),
runEmbeddedPiAgent: vi.fn(),
queueEmbeddedPiMessage: vi.fn().mockReturnValue(false),
resolveEmbeddedSessionLane: (key: string) =>
`session:${key.trim() || "main"}`,
isEmbeddedPiRunActive: vi.fn().mockReturnValue(false),
isEmbeddedPiRunStreaming: vi.fn().mockReturnValue(false),
}));
function makeResult(text: string) {
return {
payloads: [{ text }],
meta: {
durationMs: 5,
agentMeta: { sessionId: "s", provider: "p", model: "m" },
},
};
}
async function withTempHome<T>(fn: (home: string) => Promise<T>): Promise<T> {
return withTempHomeBase(
async (home) => {
const previousBundledSkills = process.env.CLAWDBOT_BUNDLED_SKILLS_DIR;
process.env.CLAWDBOT_BUNDLED_SKILLS_DIR = path.join(
home,
"bundled-skills",
);
try {
vi.mocked(runEmbeddedPiAgent).mockReset();
return await fn(home);
} finally {
if (previousBundledSkills === undefined) {
delete process.env.CLAWDBOT_BUNDLED_SKILLS_DIR;
} else {
process.env.CLAWDBOT_BUNDLED_SKILLS_DIR = previousBundledSkills;
}
}
},
{ prefix: "clawdbot-media-note-" },
);
}
function makeCfg(home: string) {
return {
agents: {
defaults: {
model: "anthropic/claude-opus-4-5",
workspace: path.join(home, "clawd"),
},
},
whatsapp: { allowFrom: ["*"] },
session: { store: path.join(home, "sessions.json") },
};
}
describe("getReplyFromConfig media note plumbing", () => {
it("includes all MediaPaths in the agent prompt", async () => {
await withTempHome(async (home) => {
let seenPrompt: string | undefined;
vi.mocked(runEmbeddedPiAgent).mockImplementation(async (params) => {
seenPrompt = params.prompt;
return makeResult("ok");
});
const cfg = makeCfg(home);
const res = await getReplyFromConfig(
{
Body: "hello",
From: "+1001",
To: "+2000",
MediaPaths: ["/tmp/a.png", "/tmp/b.png"],
MediaUrls: ["/tmp/a.png", "/tmp/b.png"],
},
{},
cfg,
);
const text = Array.isArray(res) ? res[0]?.text : res?.text;
expect(text).toBe("ok");
expect(seenPrompt).toBeTruthy();
expect(seenPrompt).toContain("[media attached: 2 files]");
const idxA = seenPrompt?.indexOf("[media attached 1/2: /tmp/a.png");
const idxB = seenPrompt?.indexOf("[media attached 2/2: /tmp/b.png");
expect(typeof idxA).toBe("number");
expect(typeof idxB).toBe("number");
expect((idxA ?? -1) >= 0).toBe(true);
expect((idxB ?? -1) >= 0).toBe(true);
expect((idxA ?? 0) < (idxB ?? 0)).toBe(true);
});
});
});