




















@@ -263,23 +263,32 @@ describe("handleFeishuCommentEvent", () => {
263263typeof vi.fn
264264>;
265265266-expect(finalizeInboundContext).toHaveBeenCalledWith(
267-expect.objectContaining({
268-From: "feishu:ou_sender",
269-To: "comment:docx:doc_token_1:comment_1",
270-Surface: "feishu-comment",
271-OriginatingChannel: "feishu",
272-OriginatingTo: "comment:docx:doc_token_1:comment_1",
273-MessageSid: "drive-comment:evt_1",
274-MessageThreadId: "reply_1",
275-}),
276-);
266+expect(finalizeInboundContext).toHaveBeenCalledTimes(1);
267+const finalizedContext = finalizeInboundContext.mock.calls[0]?.[0] as
268+| Record<string, unknown>
269+| undefined;
270+expect({
271+from: finalizedContext?.From,
272+to: finalizedContext?.To,
273+surface: finalizedContext?.Surface,
274+originatingChannel: finalizedContext?.OriginatingChannel,
275+originatingTo: finalizedContext?.OriginatingTo,
276+messageSid: finalizedContext?.MessageSid,
277+messageThreadId: finalizedContext?.MessageThreadId,
278+}).toEqual({
279+from: "feishu:ou_sender",
280+to: "comment:docx:doc_token_1:comment_1",
281+surface: "feishu-comment",
282+originatingChannel: "feishu",
283+originatingTo: "comment:docx:doc_token_1:comment_1",
284+messageSid: "drive-comment:evt_1",
285+messageThreadId: "reply_1",
286+});
277287expect(recordInboundSession).toHaveBeenCalledTimes(1);
278-expect(recordInboundSession).toHaveBeenCalledWith(
279-expect.objectContaining({
280-sessionKey: "agent:main:feishu:direct:comment-doc:docx:doc_token_1",
281-}),
282-);
288+const recordArgs = recordInboundSession.mock.calls[0]?.[0] as
289+| { sessionKey?: string }
290+| undefined;
291+expect(recordArgs?.sessionKey).toBe("agent:main:feishu:direct:comment-doc:docx:doc_token_1");
283292expect(dispatchReplyFromConfig).toHaveBeenCalledTimes(1);
284293});
285294@@ -342,12 +351,12 @@ describe("handleFeishuCommentEvent", () => {
342351} as never,
343352});
344353345-expect(maybeCreateDynamicAgentMock).toHaveBeenCalledWith(
346- expect.objectContaining({
347- senderOpenId: "ou_sender",
348- configWritesAllowed: false,
349- }),
350-);
354+expect(maybeCreateDynamicAgentMock).toHaveBeenCalledTimes(1);
355+const dynamicAgentArgs = maybeCreateDynamicAgentMock.mock.calls[0]?.[0] as
356+| { configWritesAllowed?: boolean; senderOpenId?: string }
357+| undefined;
358+expect(dynamicAgentArgs?.senderOpenId).toBe("ou_sender");
359+expect(dynamicAgentArgs?.configWritesAllowed).toBe(false);
351360const dispatchReplyFromConfig = runtime.channel.reply.dispatchReplyFromConfig as ReturnType<
352361typeof vi.fn
353362>;
@@ -377,15 +386,30 @@ describe("handleFeishuCommentEvent", () => {
377386} as never,
378387});
379388380-expect(deliverCommentThreadTextMock).toHaveBeenCalledWith(
381-expect.anything(),
382-expect.objectContaining({
383-file_token: "doc_token_1",
384-file_type: "docx",
385-comment_id: "comment_1",
386-is_whole_comment: false,
387-}),
388-);
389+expect(deliverCommentThreadTextMock).toHaveBeenCalledTimes(1);
390+const [pairingClient, pairingReply] = deliverCommentThreadTextMock.mock.calls[0] ?? [];
391+expect(pairingClient).toBe(createFeishuClientMock.mock.results[0]?.value);
392+expect(pairingReply).toEqual({
393+file_token: "doc_token_1",
394+file_type: "docx",
395+comment_id: "comment_1",
396+content: [
397+"OpenClaw: access not configured.",
398+"",
399+"Your Feishu user id: ou_sender",
400+"Pairing code:",
401+"```",
402+"TESTCODE",
403+"```",
404+"",
405+"Ask the bot owner to approve with:",
406+"openclaw pairing approve feishu TESTCODE",
407+"```",
408+"openclaw pairing approve feishu TESTCODE",
409+"```",
410+].join("\n"),
411+is_whole_comment: false,
412+});
389413const dispatchReplyFromConfig = runtime.channel.reply.dispatchReplyFromConfig as ReturnType<
390414typeof vi.fn
391415>;
@@ -424,15 +448,21 @@ describe("handleFeishuCommentEvent", () => {
424448} as never,
425449});
426450427-expect(createFeishuCommentReplyDispatcherMock).toHaveBeenCalledWith(
428-expect.objectContaining({
429-commentId: "comment_whole",
430-fileToken: "doc_token_1",
431-fileType: "docx",
432-replyId: "reply_whole",
433-isWholeComment: true,
434-}),
435-);
451+expect(createFeishuCommentReplyDispatcherMock).toHaveBeenCalledTimes(1);
452+const dispatcherArgs = createFeishuCommentReplyDispatcherMock.mock.calls[0]?.[0] as
453+| {
454+commentId?: string;
455+fileToken?: string;
456+fileType?: string;
457+isWholeComment?: boolean;
458+replyId?: string;
459+}
460+| undefined;
461+expect(dispatcherArgs?.commentId).toBe("comment_whole");
462+expect(dispatcherArgs?.fileToken).toBe("doc_token_1");
463+expect(dispatcherArgs?.fileType).toBe("docx");
464+expect(dispatcherArgs?.replyId).toBe("reply_whole");
465+expect(dispatcherArgs?.isWholeComment).toBe(true);
436466});
437467438468it("always finalizes comment typing cleanup even when dispatch fails", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。