





















@@ -1347,136 +1347,6 @@ describe("createTelegramBot", () => {
13471347expect(replySpy).toHaveBeenCalledTimes(2);
13481348});
134913491350-it("retries native command updates after a bubbled handler failure", async () => {
1351-loadConfig.mockReturnValue({
1352-commands: { native: true },
1353-channels: {
1354-telegram: {
1355-dmPolicy: "open",
1356-allowFrom: ["*"],
1357-},
1358-},
1359-});
1360-1361-createTelegramBot({ token: "tok" });
1362-const verboseHandler = commandSpy.mock.calls.find((call) => call[0] === "verbose")?.[1] as
1363-| ((ctx: Record<string, unknown>) => Promise<void>)
1364-| undefined;
1365-if (!verboseHandler) {
1366-throw new Error("verbose command handler missing");
1367-}
1368-1369-const middlewares = middlewareUseSpy.mock.calls
1370-.map((call) => call[0])
1371-.filter(
1372-(fn): fn is (ctx: Record<string, unknown>, next: () => Promise<void>) => Promise<void> =>
1373-typeof fn === "function",
1374-);
1375-const runMiddlewareChain = async (ctx: Record<string, unknown>) => {
1376-let idx = -1;
1377-const dispatch = async (i: number): Promise<void> => {
1378-if (i <= idx) {
1379-throw new Error("middleware dispatch called multiple times");
1380-}
1381-idx = i;
1382-const fn = middlewares[i];
1383-if (!fn) {
1384-await verboseHandler(ctx);
1385-return;
1386-}
1387-await fn(ctx, async () => dispatch(i + 1));
1388-};
1389-await dispatch(0);
1390-};
1391-1392-const ctx = {
1393-update: { update_id: 333 },
1394-message: {
1395-chat: { id: 12345, type: "private" },
1396-from: { id: 12345, username: "testuser" },
1397-text: "/verbose on",
1398-date: 1736380800,
1399-message_id: 42,
1400-},
1401-match: "on",
1402-};
1403-1404-const loadConfigCallsBeforeRetry = loadConfig.mock.calls.length;
1405-loadConfig.mockImplementationOnce(() => {
1406-throw new Error("cfg boom");
1407-});
1408-await expect(runMiddlewareChain(ctx)).rejects.toThrow("cfg boom");
1409-const loadConfigCallsAfterFailure = loadConfig.mock.calls.length;
1410-await runMiddlewareChain(ctx);
1411-1412-expect(loadConfigCallsAfterFailure).toBe(loadConfigCallsBeforeRetry + 1);
1413-expect(loadConfig.mock.calls.length).toBeGreaterThan(loadConfigCallsAfterFailure);
1414-});
1415-1416-it("retries group migration updates after a bubbled handler failure", async () => {
1417-const writeConfigFileSpy = mockTelegramConfigWrites();
1418-loadConfig.mockReturnValue({
1419-channels: {
1420-telegram: {
1421-groups: {
1422-"-1001": {
1423-enabled: true,
1424-},
1425-},
1426-},
1427-},
1428-});
1429-1430-createTelegramBot({ token: "tok" });
1431-const migrationHandler = getOnHandler("message:migrate_to_chat_id");
1432-const middlewares = middlewareUseSpy.mock.calls
1433-.map((call) => call[0])
1434-.filter(
1435-(fn): fn is (ctx: Record<string, unknown>, next: () => Promise<void>) => Promise<void> =>
1436-typeof fn === "function",
1437-);
1438-const runMiddlewareChain = async (ctx: Record<string, unknown>) => {
1439-let idx = -1;
1440-const dispatch = async (i: number): Promise<void> => {
1441-if (i <= idx) {
1442-throw new Error("middleware dispatch called multiple times");
1443-}
1444-idx = i;
1445-const fn = middlewares[i];
1446-if (!fn) {
1447-await migrationHandler(ctx);
1448-return;
1449-}
1450-await fn(ctx, async () => dispatch(i + 1));
1451-};
1452-await dispatch(0);
1453-};
1454-1455-const ctx = {
1456-update: { update_id: 444 },
1457-message: {
1458-chat: { id: -1001, type: "supergroup", title: "Old Group" },
1459-migrate_to_chat_id: -1002,
1460-},
1461-};
1462-1463-const loadConfigCallsBeforeRetry = loadConfig.mock.calls.length;
1464-loadConfig.mockImplementationOnce(() => {
1465-throw new Error("cfg boom");
1466-});
1467-try {
1468-await expect(runMiddlewareChain(ctx)).rejects.toThrow("cfg boom");
1469-const loadConfigCallsAfterFailure = loadConfig.mock.calls.length;
1470-await runMiddlewareChain(ctx);
1471-1472-expect(loadConfigCallsAfterFailure).toBe(loadConfigCallsBeforeRetry + 1);
1473-expect(loadConfig.mock.calls.length).toBeGreaterThan(loadConfigCallsAfterFailure);
1474-expect(writeConfigFileSpy).toHaveBeenCalledTimes(1);
1475-} finally {
1476-writeConfigFileSpy.mockRestore();
1477-}
1478-});
1479-14801350const groupPolicyCases: Array<{
14811351name: string;
14821352config: Record<string, unknown>;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。