Files
openclaw/extensions/msteams/src/sdk.test.ts
2026-03-23 23:07:40 -07:00

80 lines
2.1 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from "vitest";
import { createMSTeamsAdapter, type MSTeamsTeamsSdk } from "./sdk.js";
import type { MSTeamsCredentials } from "./token.js";
const originalFetch = globalThis.fetch;
afterEach(() => {
globalThis.fetch = originalFetch;
vi.restoreAllMocks();
});
function createSdkStub(): MSTeamsTeamsSdk {
class AppStub {
async getBotToken() {
return {
toString() {
return "bot-token";
},
};
}
}
class ClientStub {
constructor(_serviceUrl: string, _options: unknown) {}
conversations = {
activities: (_conversationId: string) => ({
create: async (_activity: unknown) => ({ id: "created" }),
}),
};
}
return {
App: AppStub as unknown as MSTeamsTeamsSdk["App"],
Client: ClientStub as unknown as MSTeamsTeamsSdk["Client"],
};
}
describe("createMSTeamsAdapter", () => {
it("provides deleteActivity in proactive continueConversation contexts", async () => {
const fetchMock = vi.fn(async () => new Response(null, { status: 204 }));
globalThis.fetch = fetchMock as unknown as typeof fetch;
const creds = {
appId: "app-id",
appPassword: "secret",
tenantId: "tenant-id",
} satisfies MSTeamsCredentials;
const sdk = createSdkStub();
const app = new sdk.App({
clientId: creds.appId,
clientSecret: creds.appPassword,
tenantId: creds.tenantId,
});
const adapter = createMSTeamsAdapter(app, sdk);
await adapter.continueConversation(
creds.appId,
{
serviceUrl: "https://service.example.com/",
conversation: { id: "19:conversation@thread.tacv2" },
channelId: "msteams",
},
async (ctx) => {
await ctx.deleteActivity("activity-123");
},
);
expect(fetchMock).toHaveBeenCalledWith(
"https://service.example.com/v3/conversations/19%3Aconversation%40thread.tacv2/activities/activity-123",
expect.objectContaining({
method: "DELETE",
headers: expect.objectContaining({
Authorization: "Bearer bot-token",
}),
}),
);
});
});