





















@@ -58,6 +58,24 @@ function mockCallArg<T>(
5858return call[argIndex] as T;
5959}
606061+type FeishuDriveTool = {
62+execute: (callId: string, input: Record<string, unknown>) => Promise<{ details?: unknown }>;
63+name?: string;
64+};
65+66+type FeishuDriveToolFactory = (context: {
67+agentAccountId?: string;
68+deliveryContext?: unknown;
69+}) => FeishuDriveTool;
70+71+function firstToolFactory(mock: { mock: { calls: unknown[][] } }): FeishuDriveToolFactory {
72+return mockCallArg<FeishuDriveToolFactory>(mock, 0, 0);
73+}
74+75+function firstLogMessage(mock: { mock: { calls: unknown[][] } }): string {
76+return String(mockCallArg<unknown>(mock, 0, 0));
77+}
78+6179type FeishuDriveRequest = {
6280data?: unknown;
6381method?: string;
@@ -140,8 +158,8 @@ describe("registerFeishuDriveTools", () => {
140158);
141159142160expect(registerTool).toHaveBeenCalledTimes(1);
143-const toolFactory = registerTool.mock.calls.at(0)?.[0];
144-const tool = toolFactory?.({ agentAccountId: undefined });
161+const toolFactory = firstToolFactory(registerTool);
162+const tool = toolFactory({ agentAccountId: undefined });
145163expect(tool?.name).toBe("feishu_drive");
146164147165requestMock.mockResolvedValueOnce({
@@ -358,8 +376,8 @@ describe("registerFeishuDriveTools", () => {
358376}),
359377);
360378361-const toolFactory = registerTool.mock.calls.at(0)?.[0];
362-const tool = toolFactory?.({ agentAccountId: undefined });
379+const toolFactory = firstToolFactory(registerTool);
380+const tool = toolFactory({ agentAccountId: undefined });
363381364382requestMock.mockResolvedValueOnce({
365383code: 0,
@@ -379,9 +397,7 @@ describe("registerFeishuDriveTools", () => {
379397file_type: "docx",
380398reply_elements: [{ type: "text", text: "defaulted file type" }],
381399});
382-expect(infoSpy.mock.calls.at(0)?.[0]).toContain(
383-"add_comment missing file_type; defaulting to docx",
384-);
400+expect(firstLogMessage(infoSpy)).toContain("add_comment missing file_type; defaulting to docx");
385401expect((result.details as { comment_id?: string; success?: boolean }).success).toBe(true);
386402expect((result.details as { comment_id?: string }).comment_id).toBe("c-default-docx");
387403});
@@ -405,8 +421,8 @@ describe("registerFeishuDriveTools", () => {
405421}),
406422);
407423408-const toolFactory = registerTool.mock.calls.at(0)?.[0];
409-const tool = toolFactory?.({ agentAccountId: undefined });
424+const toolFactory = firstToolFactory(registerTool);
425+const tool = toolFactory({ agentAccountId: undefined });
410426411427requestMock.mockResolvedValueOnce({
412428code: 0,
@@ -423,7 +439,7 @@ describe("registerFeishuDriveTools", () => {
423439expect(request.url).toBe(
424440"/open-apis/drive/v1/files/doc_1/comments?file_type=docx&user_id_type=open_id",
425441);
426-expect(infoSpy.mock.calls.at(0)?.[0]).toContain(
442+expect(firstLogMessage(infoSpy)).toContain(
427443"list_comments missing file_type; defaulting to docx",
428444);
429445});
@@ -447,8 +463,8 @@ describe("registerFeishuDriveTools", () => {
447463}),
448464);
449465450-const toolFactory = registerTool.mock.calls.at(0)?.[0];
451-const tool = toolFactory?.({ agentAccountId: undefined });
466+const toolFactory = firstToolFactory(registerTool);
467+const tool = toolFactory({ agentAccountId: undefined });
452468453469requestMock.mockResolvedValueOnce({
454470code: 0,
@@ -466,7 +482,7 @@ describe("registerFeishuDriveTools", () => {
466482expect(request.url).toBe(
467483"/open-apis/drive/v1/files/doc_1/comments/c1/replies?file_type=docx&user_id_type=open_id",
468484);
469-expect(infoSpy.mock.calls.at(0)?.[0]).toContain(
485+expect(firstLogMessage(infoSpy)).toContain(
470486"list_comment_replies missing file_type; defaulting to docx",
471487);
472488});
@@ -490,8 +506,8 @@ describe("registerFeishuDriveTools", () => {
490506}),
491507);
492508493-const toolFactory = registerTool.mock.calls.at(0)?.[0];
494-const tool = toolFactory?.({ agentAccountId: undefined });
509+const toolFactory = firstToolFactory(registerTool);
510+const tool = toolFactory({ agentAccountId: undefined });
495511496512requestMock
497513.mockResolvedValueOnce({
@@ -548,7 +564,7 @@ describe("registerFeishuDriveTools", () => {
548564],
549565},
550566});
551-expect(warnSpy.mock.calls.at(0)?.[0]).toContain("replyComment threw");
567+expect(firstLogMessage(warnSpy)).toContain("replyComment threw");
552568expect((replyCommentResult.details as { error?: string }).error).toBe(
553569"Request failed with status code 400",
554570);
@@ -572,8 +588,8 @@ describe("registerFeishuDriveTools", () => {
572588}),
573589);
574590575-const toolFactory = registerTool.mock.calls.at(0)?.[0];
576-const tool = toolFactory?.({
591+const toolFactory = firstToolFactory(registerTool);
592+const tool = toolFactory({
577593agentAccountId: undefined,
578594deliveryContext: {
579595channel: "feishu",
@@ -670,8 +686,8 @@ describe("registerFeishuDriveTools", () => {
670686}),
671687);
672688673-const toolFactory = registerTool.mock.calls.at(0)?.[0];
674-const tool = toolFactory?.({
689+const toolFactory = firstToolFactory(registerTool);
690+const tool = toolFactory({
675691agentAccountId: undefined,
676692deliveryContext: {
677693channel: "feishu",
@@ -747,8 +763,8 @@ describe("registerFeishuDriveTools", () => {
747763}),
748764);
749765750-const toolFactory = registerTool.mock.calls.at(0)?.[0];
751-const tool = toolFactory?.({
766+const toolFactory = firstToolFactory(registerTool);
767+const tool = toolFactory({
752768agentAccountId: undefined,
753769deliveryContext: {
754770channel: "feishu",
@@ -774,9 +790,7 @@ describe("registerFeishuDriveTools", () => {
774790file_type: "docx",
775791reply_elements: [{ type: "text", text: "default add comment" }],
776792});
777-expect(infoSpy.mock.calls.at(0)?.[0]).toContain(
778-"add_comment missing file_type; defaulting to docx",
779-);
793+expect(firstLogMessage(infoSpy)).toContain("add_comment missing file_type; defaulting to docx");
780794expect((result.details as { comment_id?: string; success?: boolean }).success).toBe(true);
781795expect((result.details as { comment_id?: string }).comment_id).toBe("c-add-docx");
782796});
@@ -800,8 +814,8 @@ describe("registerFeishuDriveTools", () => {
800814}),
801815);
802816803-const toolFactory = registerTool.mock.calls.at(0)?.[0];
804-const tool = toolFactory?.({ agentAccountId: undefined });
817+const toolFactory = firstToolFactory(registerTool);
818+const tool = toolFactory({ agentAccountId: undefined });
805819806820requestMock
807821.mockResolvedValueOnce({
@@ -844,7 +858,7 @@ describe("registerFeishuDriveTools", () => {
844858},
845859},
846860});
847-expect(infoSpy.mock.calls.at(0)?.[0]).toContain(
861+expect(firstLogMessage(infoSpy)).toContain(
848862"reply_comment missing file_type; defaulting to docx",
849863);
850864expect((result.details as { reply_id?: string; success?: boolean }).success).toBe(true);
@@ -870,8 +884,8 @@ describe("registerFeishuDriveTools", () => {
870884}),
871885);
872886873-const toolFactory = registerTool.mock.calls.at(0)?.[0];
874-const tool = toolFactory?.({ agentAccountId: undefined });
887+const toolFactory = firstToolFactory(registerTool);
888+const tool = toolFactory({ agentAccountId: undefined });
875889876890requestMock
877891.mockResolvedValueOnce({
@@ -906,7 +920,7 @@ describe("registerFeishuDriveTools", () => {
906920reply_elements: [{ type: "text", text: "whole comment follow-up" }],
907921},
908922});
909-expect(infoSpy.mock.calls.at(0)?.[0]).toContain("whole-comment compatibility path");
923+expect(firstLogMessage(infoSpy)).toContain("whole-comment compatibility path");
910924const details = result.details as {
911925comment_id?: string;
912926delivery_mode?: string;
@@ -936,8 +950,8 @@ describe("registerFeishuDriveTools", () => {
936950}),
937951);
938952939-const toolFactory = registerTool.mock.calls.at(0)?.[0];
940-const tool = toolFactory?.({ agentAccountId: undefined });
953+const toolFactory = firstToolFactory(registerTool);
954+const tool = toolFactory({ agentAccountId: undefined });
941955942956requestMock.mockRejectedValueOnce(new Error("preflight unavailable")).mockResolvedValueOnce({
943957code: 0,
@@ -974,7 +988,7 @@ describe("registerFeishuDriveTools", () => {
974988},
975989},
976990});
977-expect(warnSpy.mock.calls.at(0)?.[0]).toContain("comment metadata preflight failed");
991+expect(firstLogMessage(warnSpy)).toContain("comment metadata preflight failed");
978992const details = result.details as {
979993delivery_mode?: string;
980994reply_id?: string;
@@ -1004,8 +1018,8 @@ describe("registerFeishuDriveTools", () => {
10041018}),
10051019);
100610201007-const toolFactory = registerTool.mock.calls.at(0)?.[0];
1008-const tool = toolFactory?.({ agentAccountId: undefined });
1021+const toolFactory = firstToolFactory(registerTool);
1022+const tool = toolFactory({ agentAccountId: undefined });
1009102310101024requestMock
10111025.mockResolvedValueOnce({
@@ -1083,8 +1097,8 @@ describe("registerFeishuDriveTools", () => {
10831097}),
10841098);
108510991086-const toolFactory = registerTool.mock.calls.at(0)?.[0];
1087-const tool = toolFactory?.({ agentAccountId: undefined });
1100+const toolFactory = firstToolFactory(registerTool);
1101+const tool = toolFactory({ agentAccountId: undefined });
1088110210891103requestMock
10901104.mockResolvedValueOnce({
@@ -1131,7 +1145,7 @@ describe("registerFeishuDriveTools", () => {
11311145reply_elements: [{ type: "text", text: "compat follow-up" }],
11321146},
11331147});
1134-expect(infoSpy.mock.calls.at(0)?.[0]).toContain("reply-not-allowed compatibility path");
1148+expect(firstLogMessage(infoSpy)).toContain("reply-not-allowed compatibility path");
11351149const details = result.details as {
11361150comment_id?: string;
11371151delivery_mode?: string;
@@ -1160,8 +1174,8 @@ describe("registerFeishuDriveTools", () => {
11601174}),
11611175);
116211761163-const toolFactory = registerTool.mock.calls.at(0)?.[0];
1164-const tool = toolFactory?.({ agentAccountId: undefined });
1177+const toolFactory = firstToolFactory(registerTool);
1178+const tool = toolFactory({ agentAccountId: undefined });
1165117911661180requestMock.mockResolvedValueOnce({ code: 0, data: { has_more: false, items: [] } });
11671181await tool.execute("call-list", {
@@ -1207,8 +1221,8 @@ describe("registerFeishuDriveTools", () => {
12071221}),
12081222);
120912231210-const toolFactory = registerTool.mock.calls.at(0)?.[0];
1211-const tool = toolFactory?.({ agentAccountId: undefined });
1224+const toolFactory = firstToolFactory(registerTool);
1225+const tool = toolFactory({ agentAccountId: undefined });
12121226const result = await tool.execute("call-5", {
12131227action: "add_comment",
12141228file_token: "doc_1",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。