openclaw/src/discord/monitor/thread-bindings.discord-api.test.ts

86 lines
2.2 KiB
TypeScript

import { ChannelType } from "discord-api-types/v10";
import { beforeEach, describe, expect, it, vi } from "vitest";
const hoisted = vi.hoisted(() => {
const restGet = vi.fn();
const createDiscordRestClient = vi.fn(() => ({
rest: {
get: restGet,
},
}));
return {
restGet,
createDiscordRestClient,
};
});
vi.mock("../client.js", () => ({
createDiscordRestClient: hoisted.createDiscordRestClient,
}));
const { resolveChannelIdForBinding } = await import("./thread-bindings.discord-api.js");
describe("resolveChannelIdForBinding", () => {
beforeEach(() => {
hoisted.restGet.mockClear();
hoisted.createDiscordRestClient.mockClear();
});
it("returns explicit channelId without resolving route", async () => {
const resolved = await resolveChannelIdForBinding({
accountId: "default",
threadId: "thread-1",
channelId: "channel-explicit",
});
expect(resolved).toBe("channel-explicit");
expect(hoisted.createDiscordRestClient).not.toHaveBeenCalled();
expect(hoisted.restGet).not.toHaveBeenCalled();
});
it("returns parent channel for thread channels", async () => {
hoisted.restGet.mockResolvedValueOnce({
id: "thread-1",
type: ChannelType.PublicThread,
parent_id: "channel-parent",
});
const resolved = await resolveChannelIdForBinding({
accountId: "default",
threadId: "thread-1",
});
expect(resolved).toBe("channel-parent");
});
it("keeps non-thread channel id even when parent_id exists", async () => {
hoisted.restGet.mockResolvedValueOnce({
id: "channel-text",
type: ChannelType.GuildText,
parent_id: "category-1",
});
const resolved = await resolveChannelIdForBinding({
accountId: "default",
threadId: "channel-text",
});
expect(resolved).toBe("channel-text");
});
it("keeps forum channel id instead of parent category", async () => {
hoisted.restGet.mockResolvedValueOnce({
id: "forum-1",
type: ChannelType.GuildForum,
parent_id: "category-1",
});
const resolved = await resolveChannelIdForBinding({
accountId: "default",
threadId: "forum-1",
});
expect(resolved).toBe("forum-1");
});
});