test(feishu): add regression for audio download resource type=file (openclaw#16311) thanks @Yaxuan42
Verified: - pnpm build - pnpm check - pnpm vitest run --config vitest.extensions.config.ts extensions/feishu/src/bot.test.ts extensions/feishu/src/media.test.ts Co-authored-by: Yaxuan42 <184813557+Yaxuan42@users.noreply.github.com> Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import type { ClawdbotConfig, PluginRuntime, RuntimeEnv } from "openclaw/plugin-sdk";
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import type { FeishuMessageEvent } from "./bot.js";
|
||||
import { buildFeishuAgentBody, handleFeishuMessage } from "./bot.js";
|
||||
import { buildFeishuAgentBody, handleFeishuMessage, toMessageResourceType } from "./bot.js";
|
||||
import { setFeishuRuntime } from "./runtime.js";
|
||||
|
||||
const {
|
||||
@@ -993,3 +993,19 @@ describe("handleFeishuMessage command authorization", () => {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("toMessageResourceType", () => {
|
||||
it("maps image to image", () => {
|
||||
expect(toMessageResourceType("image")).toBe("image");
|
||||
});
|
||||
|
||||
it("maps audio to file", () => {
|
||||
expect(toMessageResourceType("audio")).toBe("file");
|
||||
});
|
||||
|
||||
it("maps video/file/sticker to file", () => {
|
||||
expect(toMessageResourceType("video")).toBe("file");
|
||||
expect(toMessageResourceType("file")).toBe("file");
|
||||
expect(toMessageResourceType("sticker")).toBe("file");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -460,6 +460,14 @@ function parsePostContent(content: string): {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Map Feishu message type to messageResource.get resource type.
|
||||
* Feishu messageResource API supports only: image | file.
|
||||
*/
|
||||
export function toMessageResourceType(messageType: string): "image" | "file" {
|
||||
return messageType === "image" ? "image" : "file";
|
||||
}
|
||||
|
||||
/**
|
||||
* Infer placeholder text based on message type.
|
||||
*/
|
||||
@@ -570,7 +578,7 @@ async function resolveFeishuMediaList(params: {
|
||||
return [];
|
||||
}
|
||||
|
||||
const resourceType = messageType === "image" ? "image" : "file";
|
||||
const resourceType = toMessageResourceType(messageType);
|
||||
const result = await downloadMessageResourceFeishu({
|
||||
cfg,
|
||||
messageId,
|
||||
|
||||
@@ -335,3 +335,62 @@ describe("sendMediaFeishu msg_type routing", () => {
|
||||
expect(messageResourceGetMock).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe("downloadMessageResourceFeishu", () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
|
||||
resolveFeishuAccountMock.mockReturnValue({
|
||||
configured: true,
|
||||
accountId: "main",
|
||||
config: {},
|
||||
appId: "app_id",
|
||||
appSecret: "app_secret",
|
||||
domain: "feishu",
|
||||
});
|
||||
|
||||
createFeishuClientMock.mockReturnValue({
|
||||
im: {
|
||||
messageResource: {
|
||||
get: messageResourceGetMock,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
messageResourceGetMock.mockResolvedValue(Buffer.from("fake-audio-data"));
|
||||
});
|
||||
|
||||
// Regression: Feishu API only supports type=image|file for messageResource.get.
|
||||
// Audio/video resources must use type=file, not type=audio (#8746).
|
||||
it("forwards provided type=file for non-image resources", async () => {
|
||||
const result = await downloadMessageResourceFeishu({
|
||||
cfg: {} as any,
|
||||
messageId: "om_audio_msg",
|
||||
fileKey: "file_key_audio",
|
||||
type: "file",
|
||||
});
|
||||
|
||||
expect(messageResourceGetMock).toHaveBeenCalledWith({
|
||||
path: { message_id: "om_audio_msg", file_key: "file_key_audio" },
|
||||
params: { type: "file" },
|
||||
});
|
||||
expect(result.buffer).toBeInstanceOf(Buffer);
|
||||
});
|
||||
|
||||
it("image uses type=image", async () => {
|
||||
messageResourceGetMock.mockResolvedValue(Buffer.from("fake-image-data"));
|
||||
|
||||
const result = await downloadMessageResourceFeishu({
|
||||
cfg: {} as any,
|
||||
messageId: "om_img_msg",
|
||||
fileKey: "img_key_1",
|
||||
type: "image",
|
||||
});
|
||||
|
||||
expect(messageResourceGetMock).toHaveBeenCalledWith({
|
||||
path: { message_id: "om_img_msg", file_key: "img_key_1" },
|
||||
params: { type: "image" },
|
||||
});
|
||||
expect(result.buffer).toBeInstanceOf(Buffer);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user