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

94 lines
2.7 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) => {
vi.mocked(runEmbeddedPiAgent).mockReset();
return await fn(home);
},
{
env: {
CLAWDBOT_BUNDLED_SKILLS_DIR: (home) =>
path.join(home, "bundled-skills"),
},
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);
});
});
});