




















@@ -0,0 +1,127 @@
1+import { beforeEach, describe, expect, it, vi } from "vitest";
2+3+const transcribeFirstAudioMock = vi.hoisted(() => vi.fn());
4+5+vi.mock("./preflight-audio.runtime.js", () => ({
6+transcribeFirstAudio: transcribeFirstAudioMock,
7+}));
8+9+import { resolveDiscordPreflightAudioMentionContext } from "./preflight-audio.js";
10+11+const cfg = {} as import("openclaw/plugin-sdk/config-runtime").OpenClawConfig;
12+13+describe("resolveDiscordPreflightAudioMentionContext", () => {
14+beforeEach(() => {
15+transcribeFirstAudioMock.mockReset();
16+});
17+18+it("preflights direct-message audio without requiring a mention", async () => {
19+transcribeFirstAudioMock.mockResolvedValue("hello from dm");
20+21+const result = await resolveDiscordPreflightAudioMentionContext({
22+message: {
23+attachments: [
24+{
25+url: "https://cdn.discordapp.com/attachments/voice.ogg",
26+content_type: "audio/ogg",
27+filename: "voice.ogg",
28+},
29+],
30+},
31+isDirectMessage: true,
32+shouldRequireMention: false,
33+mentionRegexes: [],
34+ cfg,
35+});
36+37+expect(transcribeFirstAudioMock).toHaveBeenCalledWith(
38+expect.objectContaining({
39+ctx: expect.objectContaining({
40+MediaUrls: ["https://cdn.discordapp.com/attachments/voice.ogg"],
41+MediaTypes: ["audio/ogg"],
42+}),
43+}),
44+);
45+expect(result).toEqual({
46+hasAudioAttachment: true,
47+hasTypedText: false,
48+transcript: "hello from dm",
49+});
50+});
51+52+it("preflights audio by filename when Discord omits content type", async () => {
53+transcribeFirstAudioMock.mockResolvedValue("filename transcript");
54+55+await resolveDiscordPreflightAudioMentionContext({
56+message: {
57+attachments: [
58+{
59+url: "https://cdn.discordapp.com/attachments/voice.opus",
60+filename: "voice.opus",
61+},
62+],
63+},
64+isDirectMessage: true,
65+shouldRequireMention: false,
66+mentionRegexes: [],
67+ cfg,
68+});
69+70+expect(transcribeFirstAudioMock).toHaveBeenCalledWith(
71+expect.objectContaining({
72+ctx: expect.objectContaining({
73+MediaUrls: ["https://cdn.discordapp.com/attachments/voice.opus"],
74+MediaTypes: ["audio/opus"],
75+}),
76+}),
77+);
78+});
79+80+it("does not preflight typed direct-message audio", async () => {
81+const result = await resolveDiscordPreflightAudioMentionContext({
82+message: {
83+content: "typed caption",
84+attachments: [
85+{
86+url: "https://cdn.discordapp.com/attachments/voice.ogg",
87+content_type: "audio/ogg",
88+filename: "voice.ogg",
89+},
90+],
91+},
92+isDirectMessage: true,
93+shouldRequireMention: false,
94+mentionRegexes: [],
95+ cfg,
96+});
97+98+expect(transcribeFirstAudioMock).not.toHaveBeenCalled();
99+expect(result).toEqual({
100+hasAudioAttachment: true,
101+hasTypedText: true,
102+});
103+});
104+105+it("ignores URL-less audio attachments", async () => {
106+const result = await resolveDiscordPreflightAudioMentionContext({
107+message: {
108+attachments: [
109+{
110+content_type: "audio/ogg",
111+filename: "voice.ogg",
112+},
113+],
114+},
115+isDirectMessage: true,
116+shouldRequireMention: false,
117+mentionRegexes: [],
118+ cfg,
119+});
120+121+expect(transcribeFirstAudioMock).not.toHaveBeenCalled();
122+expect(result).toEqual({
123+hasAudioAttachment: false,
124+hasTypedText: false,
125+});
126+});
127+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。