Files
openclaw/extensions/discord/src/draft-stream.test.ts
2026-03-22 23:04:04 +00:00

82 lines
2.4 KiB
TypeScript

import { Routes } from "discord-api-types/v10";
import { describe, expect, it, vi } from "vitest";
import { createDiscordDraftStream } from "./draft-stream.js";
describe("createDiscordDraftStream", () => {
it("holds the first preview until minInitialChars is reached", async () => {
const rest = {
post: vi.fn(async () => ({ id: "m1" })),
patch: vi.fn(async () => undefined),
delete: vi.fn(async () => undefined),
};
const stream = createDiscordDraftStream({
rest: rest as never,
channelId: "c1",
throttleMs: 250,
minInitialChars: 5,
});
stream.update("hey");
await stream.flush();
expect(rest.post).not.toHaveBeenCalled();
expect(stream.messageId()).toBeUndefined();
});
it("sends a reply preview, then edits the same message on later flushes", async () => {
const rest = {
post: vi.fn(async () => ({ id: "m1" })),
patch: vi.fn(async () => undefined),
delete: vi.fn(async () => undefined),
};
const stream = createDiscordDraftStream({
rest: rest as never,
channelId: "c1",
throttleMs: 250,
replyToMessageId: () => " parent-1 ",
});
stream.update("first draft");
await stream.flush();
stream.update("second draft");
await stream.flush();
expect(rest.post).toHaveBeenCalledWith(Routes.channelMessages("c1"), {
body: {
content: "first draft",
message_reference: {
message_id: "parent-1",
fail_if_not_exists: false,
},
},
});
expect(rest.patch).toHaveBeenCalledWith(Routes.channelMessage("c1", "m1"), {
body: { content: "second draft" },
});
expect(stream.messageId()).toBe("m1");
});
it("stops previewing and warns once text exceeds the configured limit", async () => {
const rest = {
post: vi.fn(async () => ({ id: "m1" })),
patch: vi.fn(async () => undefined),
delete: vi.fn(async () => undefined),
};
const warn = vi.fn();
const stream = createDiscordDraftStream({
rest: rest as never,
channelId: "c1",
maxChars: 5,
throttleMs: 250,
warn,
});
stream.update("123456");
await stream.flush();
expect(rest.post).not.toHaveBeenCalled();
expect(warn).toHaveBeenCalledWith(expect.stringContaining("discord stream preview stopped"));
expect(stream.messageId()).toBeUndefined();
});
});