




















@@ -181,6 +181,26 @@ function mockSharePointPdfUpload(params: {
181181});
182182}
183183184+type MockWithCalls = {
185+mock: { calls: unknown[][] };
186+};
187+188+function firstObjectArg(mock: MockWithCalls): Record<string, unknown> {
189+const value = mock.mock.calls[0]?.[0];
190+if (value === undefined || value === null || typeof value !== "object" || Array.isArray(value)) {
191+throw new Error("expected first mock call to receive an object argument");
192+}
193+return value as Record<string, unknown>;
194+}
195+196+function continueConversationRef(mock: MockWithCalls): Record<string, unknown> {
197+const ref = mock.mock.calls[0]?.[1];
198+if (ref === undefined || ref === null || typeof ref !== "object" || Array.isArray(ref)) {
199+throw new Error("expected continueConversation ref object");
200+}
201+return ref as Record<string, unknown>;
202+}
203+184204describe("sendMessageMSTeams", () => {
185205beforeEach(() => {
186206mockState.loadOutboundMediaFromUrl.mockReset();
@@ -244,21 +264,16 @@ describe("sendMessageMSTeams", () => {
244264},
245265);
246266247-expect(mockState.sendMSTeamsMessages).toHaveBeenCalledWith(
248-expect.objectContaining({
249-messages: [
250-expect.objectContaining({
251-text: "hello",
252-mediaUrl: `data:image/png;base64,${mediaBuffer.toString("base64")}`,
253-}),
254-],
255-}),
256-);
257-expect(result.receipt).toMatchObject({
258-primaryPlatformMessageId: "message-1",
259-platformMessageIds: ["message-1"],
260-parts: [expect.objectContaining({ platformMessageId: "message-1", kind: "media" })],
261-});
267+const sendPayload = firstObjectArg(mockState.sendMSTeamsMessages);
268+const messages = sendPayload.messages as Array<Record<string, unknown>>;
269+expect(messages).toHaveLength(1);
270+expect(messages[0]?.text).toBe("hello");
271+expect(messages[0]?.mediaUrl).toBe(`data:image/png;base64,${mediaBuffer.toString("base64")}`);
272+expect(result.receipt?.primaryPlatformMessageId).toBe("message-1");
273+expect(result.receipt?.platformMessageIds).toEqual(["message-1"]);
274+expect(result.receipt?.parts).toHaveLength(1);
275+expect(result.receipt?.parts[0]?.platformMessageId).toBe("message-1");
276+expect(result.receipt?.parts[0]?.kind).toBe("media");
262277});
263278264279it("sends with provided cfg even when Teams runtime text helpers are unavailable", async () => {
@@ -277,15 +292,13 @@ describe("sendMessageMSTeams", () => {
277292text: "hello",
278293});
279294280-expect(result).toMatchObject({
281-messageId: "message-1",
282-conversationId: "19:conversation@thread.tacv2",
283-receipt: {
284-primaryPlatformMessageId: "message-1",
285-platformMessageIds: ["message-1"],
286-parts: [expect.objectContaining({ platformMessageId: "message-1", kind: "text" })],
287-},
288-});
295+expect(result.messageId).toBe("message-1");
296+expect(result.conversationId).toBe("19:conversation@thread.tacv2");
297+expect(result.receipt?.primaryPlatformMessageId).toBe("message-1");
298+expect(result.receipt?.platformMessageIds).toEqual(["message-1"]);
299+expect(result.receipt?.parts).toHaveLength(1);
300+expect(result.receipt?.parts[0]?.platformMessageId).toBe("message-1");
301+expect(result.receipt?.parts[0]?.kind).toBe("text");
289302290303expect(mockState.resolveMarkdownTableMode).toHaveBeenCalledWith({
291304cfg: {},
@@ -317,9 +330,7 @@ describe("sendMessageMSTeams", () => {
317330text: "threaded reply",
318331});
319332320-expect(mockState.sendMSTeamsMessages).toHaveBeenCalledWith(
321-expect.objectContaining({ replyStyle: "thread" }),
322-);
333+expect(firstObjectArg(mockState.sendMSTeamsMessages).replyStyle).toBe("thread");
323334});
324335325336it("keeps top-level proactive replyStyle when resolved for a channel", async () => {
@@ -345,9 +356,7 @@ describe("sendMessageMSTeams", () => {
345356text: "top-level reply",
346357});
347358348-expect(mockState.sendMSTeamsMessages).toHaveBeenCalledWith(
349-expect.objectContaining({ replyStyle: "top-level" }),
350-);
359+expect(firstObjectArg(mockState.sendMSTeamsMessages).replyStyle).toBe("top-level");
351360});
352361353362it("uses graphChatId instead of conversationId when uploading to SharePoint", async () => {
@@ -378,12 +387,9 @@ describe("sendMessageMSTeams", () => {
378387});
379388380389// The Graph-native chatId must be passed to SharePoint upload, not the Bot Framework ID
381-expect(mockState.uploadAndShareSharePoint).toHaveBeenCalledWith(
382-expect.objectContaining({
383-chatId: graphChatId,
384-siteId: "site-123",
385-}),
386-);
390+const uploadPayload = firstObjectArg(mockState.uploadAndShareSharePoint);
391+expect(uploadPayload.chatId).toBe(graphChatId);
392+expect(uploadPayload.siteId).toBe("site-123");
387393});
388394389395it("falls back to conversationId when graphChatId is not available", async () => {
@@ -411,12 +417,9 @@ describe("sendMessageMSTeams", () => {
411417});
412418413419// Falls back to conversationId when graphChatId is null
414-expect(mockState.uploadAndShareSharePoint).toHaveBeenCalledWith(
415-expect.objectContaining({
416-chatId: botFrameworkConversationId,
417-siteId: "site-456",
418-}),
419-);
420+const uploadPayload = firstObjectArg(mockState.uploadAndShareSharePoint);
421+expect(uploadPayload.chatId).toBe(botFrameworkConversationId);
422+expect(uploadPayload.siteId).toBe("site-456");
420423});
421424});
422425@@ -477,9 +480,7 @@ describe("editMessageMSTeams", () => {
477480expect(mockContinueConversation).toHaveBeenCalledTimes(1);
478481const continueConversationCall = mockContinueConversation.mock.calls[0];
479482expect(continueConversationCall?.[0]).toBe("app-id");
480-expect(continueConversationCall?.[1]).toEqual(
481-expect.objectContaining({ activityId: undefined }),
482-);
483+expect(continueConversationRef(mockContinueConversation).activityId).toBeUndefined();
483484expect(typeof continueConversationCall?.[2]).toBe("function");
484485expect(mockUpdateActivity).toHaveBeenCalledWith({
485486type: "message",
@@ -530,9 +531,7 @@ describe("deleteMessageMSTeams", () => {
530531expect(mockContinueConversation).toHaveBeenCalledTimes(1);
531532const continueConversationCall = mockContinueConversation.mock.calls[0];
532533expect(continueConversationCall?.[0]).toBe("app-id");
533-expect(continueConversationCall?.[1]).toEqual(
534-expect.objectContaining({ activityId: undefined }),
535-);
534+expect(continueConversationRef(mockContinueConversation).activityId).toBeUndefined();
536535expect(typeof continueConversationCall?.[2]).toBe("function");
537536expect(mockDeleteActivity).toHaveBeenCalledWith("activity-456");
538537});
@@ -572,8 +571,6 @@ describe("deleteMessageMSTeams", () => {
572571// appId should be forwarded correctly
573572expect(mockContinueConversation.mock.calls[0]?.[0]).toBe("my-app-id");
574573// activityId on the proactive ref should be cleared (undefined) — proactive pattern
575-expect(mockContinueConversation.mock.calls[0]?.[1]).toMatchObject({
576-activityId: undefined,
577-});
574+expect(continueConversationRef(mockContinueConversation).activityId).toBeUndefined();
578575});
579576});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。