Files
Moltbot/src/web/auto-reply.typing-controller-idle.test.ts
2026-02-18 17:01:22 +00:00

73 lines
2.0 KiB
TypeScript

import "./test-helpers.js";
import { describe, expect, it, vi } from "vitest";
import type { OpenClawConfig } from "../config/config.js";
import { monitorWebChannel } from "./auto-reply.js";
import {
createMockWebListener,
installWebAutoReplyTestHomeHooks,
installWebAutoReplyUnitTestHooks,
resetLoadConfigMock,
setLoadConfigMock,
} from "./auto-reply.test-harness.js";
installWebAutoReplyTestHomeHooks();
describe("typing controller idle", () => {
installWebAutoReplyUnitTestHooks();
it("marks dispatch idle after replies flush", async () => {
const markDispatchIdle = vi.fn();
const typingMock = {
onReplyStart: vi.fn(async () => {}),
startTypingLoop: vi.fn(async () => {}),
startTypingOnText: vi.fn(async () => {}),
refreshTypingTtl: vi.fn(),
isActive: vi.fn(() => false),
markRunComplete: vi.fn(),
markDispatchIdle,
cleanup: vi.fn(),
};
const reply = vi.fn().mockResolvedValue(undefined);
const sendComposing = vi.fn().mockResolvedValue(undefined);
const sendMedia = vi.fn().mockResolvedValue(undefined);
const replyResolver = vi.fn().mockImplementation(async (_ctx, opts) => {
opts?.onTypingController?.(typingMock);
return { text: "final reply" };
});
const mockConfig: OpenClawConfig = {
channels: { whatsapp: { allowFrom: ["*"] } },
};
setLoadConfigMock(mockConfig);
await monitorWebChannel(
false,
async ({ onMessage }) => {
await onMessage({
id: "m1",
from: "+1000",
conversationId: "+1000",
to: "+2000",
body: "hello",
timestamp: Date.now(),
chatType: "direct",
chatId: "direct:+1000",
accountId: "default",
sendComposing,
reply,
sendMedia,
});
return createMockWebListener();
},
false,
replyResolver,
);
resetLoadConfigMock();
expect(markDispatchIdle).toHaveBeenCalled();
});
});