openclaw/src/plugin-sdk/reply-payload.test.ts

59 lines
2.3 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { isNumericTargetId, sendPayloadWithChunkedTextAndMedia } from "./reply-payload.js";
describe("sendPayloadWithChunkedTextAndMedia", () => {
it("returns empty result when payload has no text and no media", async () => {
const result = await sendPayloadWithChunkedTextAndMedia({
ctx: { payload: {} },
sendText: async () => ({ channel: "test", messageId: "text" }),
sendMedia: async () => ({ channel: "test", messageId: "media" }),
emptyResult: { channel: "test", messageId: "" },
});
expect(result).toEqual({ channel: "test", messageId: "" });
});
it("sends first media with text and remaining media without text", async () => {
const calls: Array<{ text: string; mediaUrl: string }> = [];
const result = await sendPayloadWithChunkedTextAndMedia({
ctx: {
payload: { text: "hello", mediaUrls: ["https://a", "https://b"] },
},
sendText: async () => ({ channel: "test", messageId: "text" }),
sendMedia: async (ctx) => {
calls.push({ text: ctx.text, mediaUrl: ctx.mediaUrl });
return { channel: "test", messageId: ctx.mediaUrl };
},
emptyResult: { channel: "test", messageId: "" },
});
expect(calls).toEqual([
{ text: "hello", mediaUrl: "https://a" },
{ text: "", mediaUrl: "https://b" },
]);
expect(result).toEqual({ channel: "test", messageId: "https://b" });
});
it("chunks text and sends each chunk", async () => {
const chunks: string[] = [];
const result = await sendPayloadWithChunkedTextAndMedia({
ctx: { payload: { text: "alpha beta gamma" } },
textChunkLimit: 5,
chunker: () => ["alpha", "beta", "gamma"],
sendText: async (ctx) => {
chunks.push(ctx.text);
return { channel: "test", messageId: ctx.text };
},
sendMedia: async () => ({ channel: "test", messageId: "media" }),
emptyResult: { channel: "test", messageId: "" },
});
expect(chunks).toEqual(["alpha", "beta", "gamma"]);
expect(result).toEqual({ channel: "test", messageId: "gamma" });
});
it("detects numeric target IDs", () => {
expect(isNumericTargetId("12345")).toBe(true);
expect(isNumericTargetId(" 987 ")).toBe(true);
expect(isNumericTargetId("ab12")).toBe(false);
expect(isNumericTargetId("")).toBe(false);
});
});