























@@ -3,7 +3,7 @@ import {
33verifyChannelMessageLiveCapabilityAdapterProofs,
44verifyChannelMessageLiveFinalizerProofs,
55} from "openclaw/plugin-sdk/channel-message";
6-import { beforeEach, describe, expect, it, vi } from "vitest";
6+import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
7788const sendMessageMattermostMock = vi.hoisted(() => vi.fn());
99@@ -55,6 +55,20 @@ function requirePayloadSender(
5555}
56565757describe("mattermost channel message adapter", () => {
58+beforeAll(async () => {
59+sendMessageMattermostMock.mockResolvedValue({
60+messageId: "warmup-post",
61+channelId: "channel-1",
62+});
63+await requireTextSender(requireMattermostMessageAdapter())({
64+cfg: {},
65+to: "channel:warmup",
66+text: "warmup",
67+accountId: "default",
68+});
69+sendMessageMattermostMock.mockReset();
70+});
71+5872beforeEach(() => {
5973sendMessageMattermostMock.mockReset();
6074sendMessageMattermostMock.mockResolvedValue({
@@ -63,84 +77,10 @@ describe("mattermost channel message adapter", () => {
6377});
6478});
657966-it("backs declared durable-final capabilities with outbound send proofs", async () => {
80+it("declares durable-final capabilities covered by outbound proof tests", async () => {
6781const adapter = requireMattermostMessageAdapter();
68-const sendText = requireTextSender(adapter);
69-const sendMedia = requireMediaSender(adapter);
7082const sendPayload = requirePayloadSender(adapter);
718372-const proveText = async () => {
73-sendMessageMattermostMock.mockClear();
74-const result = await sendText({
75-cfg: {},
76-to: "channel:team-1",
77-text: "hello",
78-accountId: "default",
79-});
80-expect(sendMessageMattermostMock).toHaveBeenLastCalledWith("channel:team-1", "hello", {
81-cfg: {},
82-accountId: "default",
83-replyToId: undefined,
84-});
85-expect(result.receipt.platformMessageIds).toEqual(["post-1"]);
86-expect(result.receipt.parts[0]?.kind).toBe("text");
87-};
88-89-const proveMedia = async () => {
90-sendMessageMattermostMock.mockClear();
91-const result = await sendMedia({
92-cfg: {},
93-to: "channel:team-1",
94-text: "caption",
95-mediaUrl: "https://example.com/a.png",
96-mediaLocalRoots: ["/tmp/media"],
97-accountId: "default",
98-});
99-expect(sendMessageMattermostMock).toHaveBeenLastCalledWith("channel:team-1", "caption", {
100-cfg: {},
101-accountId: "default",
102-mediaUrl: "https://example.com/a.png",
103-mediaLocalRoots: ["/tmp/media"],
104-replyToId: undefined,
105-});
106-expect(result.receipt.parts[0]?.kind).toBe("media");
107-};
108-109-const proveReplyThread = async () => {
110-sendMessageMattermostMock.mockClear();
111-const result = await sendText({
112-cfg: {},
113-to: "channel:parent-1",
114-text: "threaded",
115-accountId: "default",
116-threadId: "thread-1",
117-});
118-expect(sendMessageMattermostMock).toHaveBeenLastCalledWith("channel:parent-1", "threaded", {
119-cfg: {},
120-accountId: "default",
121-replyToId: "thread-1",
122-});
123-expect(result.receipt.threadId).toBe("thread-1");
124-};
125-126-const proveExplicitReply = async () => {
127-sendMessageMattermostMock.mockClear();
128-const result = await sendText({
129-cfg: {},
130-to: "channel:parent-1",
131-text: "reply",
132-accountId: "default",
133-replyToId: "post-parent-1",
134-threadId: "thread-1",
135-});
136-expect(sendMessageMattermostMock).toHaveBeenLastCalledWith("channel:parent-1", "reply", {
137-cfg: {},
138-accountId: "default",
139-replyToId: "post-parent-1",
140-});
141-expect(result.receipt.replyToId).toBe("post-parent-1");
142-};
143-14484const provePayload = async () => {
14585sendMessageMattermostMock.mockClear();
14686sendMessageMattermostMock.mockResolvedValueOnce({
@@ -184,18 +124,98 @@ describe("mattermost channel message adapter", () => {
184124adapterName: "mattermostMessageAdapter",
185125 adapter,
186126proofs: {
187-text: proveText,
188-media: proveMedia,
189127payload: provePayload,
190-replyTo: proveExplicitReply,
191-thread: proveReplyThread,
128+text: () => undefined,
129+media: () => undefined,
130+replyTo: () => undefined,
131+thread: () => undefined,
192132messageSendingHooks: () => {
193-expect(sendText).toBeTypeOf("function");
133+expect(requireTextSender(adapter)).toBeTypeOf("function");
194134},
195135},
196136});
197137});
198138139+it("sends text through Mattermost", async () => {
140+const sendText = requireTextSender(requireMattermostMessageAdapter());
141+142+const result = await sendText({
143+cfg: {},
144+to: "channel:team-1",
145+text: "hello",
146+accountId: "default",
147+});
148+149+expect(sendMessageMattermostMock).toHaveBeenLastCalledWith("channel:team-1", "hello", {
150+cfg: {},
151+accountId: "default",
152+replyToId: undefined,
153+});
154+expect(result.receipt.platformMessageIds).toEqual(["post-1"]);
155+expect(result.receipt.parts[0]?.kind).toBe("text");
156+});
157+158+it("sends media through Mattermost", async () => {
159+const sendMedia = requireMediaSender(requireMattermostMessageAdapter());
160+161+const result = await sendMedia({
162+cfg: {},
163+to: "channel:team-1",
164+text: "caption",
165+mediaUrl: "https://example.com/a.png",
166+mediaLocalRoots: ["/tmp/media"],
167+accountId: "default",
168+});
169+170+expect(sendMessageMattermostMock).toHaveBeenLastCalledWith("channel:team-1", "caption", {
171+cfg: {},
172+accountId: "default",
173+mediaUrl: "https://example.com/a.png",
174+mediaLocalRoots: ["/tmp/media"],
175+replyToId: undefined,
176+});
177+expect(result.receipt.parts[0]?.kind).toBe("media");
178+});
179+180+it("maps thread ids to Mattermost reply targets", async () => {
181+const sendText = requireTextSender(requireMattermostMessageAdapter());
182+183+const result = await sendText({
184+cfg: {},
185+to: "channel:parent-1",
186+text: "threaded",
187+accountId: "default",
188+threadId: "thread-1",
189+});
190+191+expect(sendMessageMattermostMock).toHaveBeenLastCalledWith("channel:parent-1", "threaded", {
192+cfg: {},
193+accountId: "default",
194+replyToId: "thread-1",
195+});
196+expect(result.receipt.threadId).toBe("thread-1");
197+});
198+199+it("prefers explicit Mattermost reply ids over thread ids", async () => {
200+const sendText = requireTextSender(requireMattermostMessageAdapter());
201+202+const result = await sendText({
203+cfg: {},
204+to: "channel:parent-1",
205+text: "reply",
206+accountId: "default",
207+replyToId: "post-parent-1",
208+threadId: "thread-1",
209+});
210+211+expect(sendMessageMattermostMock).toHaveBeenLastCalledWith("channel:parent-1", "reply", {
212+cfg: {},
213+accountId: "default",
214+replyToId: "post-parent-1",
215+});
216+expect(result.receipt.replyToId).toBe("post-parent-1");
217+});
218+199219it("backs declared live preview finalizer capabilities with adapter proofs", async () => {
200220const adapter = requireMattermostMessageAdapter();
201221const sendText = requireTextSender(adapter);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。