test(telegram): cover General topic typing fallback

This commit is contained in:
Ayaan Zaidi
2026-01-12 22:03:42 +05:30
parent ff292e67ce
commit adaa30c73a
3 changed files with 46 additions and 7 deletions

View File

@@ -12,6 +12,7 @@
### Fixes
- Auto-reply: inline `/status` now honors allowlists (authorized stripped + replied inline; unauthorized leaves text for the agent) to match command gating tests.
- Telegram: show typing indicator in General forum topics. (#779) — thanks @azade-c.
## 2026.1.11

View File

@@ -1676,6 +1676,49 @@ describe("createTelegramBot", () => {
});
});
it("falls back to General topic thread id for typing in forums", async () => {
onSpy.mockReset();
sendChatActionSpy.mockReset();
const replySpy = replyModule.__replySpy as unknown as ReturnType<
typeof vi.fn
>;
replySpy.mockReset();
loadConfig.mockReturnValue({
telegram: {
groupPolicy: "open",
groups: { "*": { requireMention: false } },
},
});
createTelegramBot({ token: "tok" });
const handler = getOnHandler("message") as (
ctx: Record<string, unknown>,
) => Promise<void>;
await handler({
message: {
chat: {
id: -1001234567890,
type: "supergroup",
title: "Forum Group",
is_forum: true,
},
from: { id: 12345, username: "testuser" },
text: "hello",
date: 1736380800,
message_id: 42,
},
me: { username: "clawdbot_bot" },
getFile: async () => ({ download: async () => new Uint8Array() }),
});
expect(replySpy).toHaveBeenCalledTimes(1);
expect(sendChatActionSpy).toHaveBeenCalledWith(-1001234567890, "typing", {
message_thread_id: 1,
});
});
it("applies topic skill filters and system prompts", async () => {
onSpy.mockReset();
const replySpy = replyModule.__replySpy as unknown as ReturnType<

View File

@@ -1,11 +1,4 @@
// @ts-nocheck
/**
* Telegram uses message_thread_id=1 internally for the General topic in forum supergroups.
* User-created topics have IDs based on message_id (typically millions+), so no collision risk.
* See: https://core.telegram.org/bots/api#sendchataction
*/
const TELEGRAM_GENERAL_TOPIC_ID = 1;
import { sequentialize } from "@grammyjs/runner";
import { apiThrottler } from "@grammyjs/transformer-throttler";
import type { ApiClientOptions, Message } from "grammy";
@@ -79,6 +72,8 @@ import {
} from "./pairing-store.js";
import { resolveTelegramVoiceSend } from "./voice.js";
const TELEGRAM_GENERAL_TOPIC_ID = 1;
const PARSE_ERR_RE =
/can't parse entities|parse entities|find end of the entity/i;