mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-06 06:32:54 +00:00
97 lines
3.2 KiB
TypeScript
97 lines
3.2 KiB
TypeScript
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
|
import {
|
|
buildNativeResetContext,
|
|
createGetReplyContinueDirectivesResult,
|
|
createGetReplySessionState,
|
|
registerGetReplyRuntimeOverrides,
|
|
} from "./get-reply.test-fixtures.js";
|
|
import { loadGetReplyModuleForTest } from "./get-reply.test-loader.js";
|
|
import "./get-reply.test-runtime-mocks.js";
|
|
|
|
const mocks = vi.hoisted(() => ({
|
|
resolveReplyDirectives: vi.fn(),
|
|
handleInlineActions: vi.fn(),
|
|
emitResetCommandHooks: vi.fn(),
|
|
initSessionState: vi.fn(),
|
|
}));
|
|
vi.mock("./commands-core.js", () => ({
|
|
emitResetCommandHooks: (...args: unknown[]) => mocks.emitResetCommandHooks(...args),
|
|
}));
|
|
vi.mock("./commands-core.runtime.js", () => ({
|
|
emitResetCommandHooks: (...args: unknown[]) => mocks.emitResetCommandHooks(...args),
|
|
}));
|
|
registerGetReplyRuntimeOverrides(mocks);
|
|
|
|
let getReplyFromConfig: typeof import("./get-reply.js").getReplyFromConfig;
|
|
|
|
async function loadGetReplyRuntimeForTest() {
|
|
({ getReplyFromConfig } = await loadGetReplyModuleForTest({ cacheKey: import.meta.url }));
|
|
}
|
|
|
|
function createContinueDirectivesResult(resetHookTriggered: boolean) {
|
|
return createGetReplyContinueDirectivesResult({
|
|
body: "/new",
|
|
abortKey: "telegram:slash:123",
|
|
from: "telegram:123",
|
|
to: "slash:123",
|
|
senderId: "123",
|
|
commandSource: "/new",
|
|
senderIsOwner: true,
|
|
resetHookTriggered,
|
|
});
|
|
}
|
|
|
|
describe("getReplyFromConfig reset-hook fallback", () => {
|
|
beforeAll(async () => {
|
|
await loadGetReplyRuntimeForTest();
|
|
});
|
|
|
|
beforeEach(() => {
|
|
vi.stubEnv("OPENCLAW_ALLOW_SLOW_REPLY_TESTS", "1");
|
|
mocks.resolveReplyDirectives.mockReset();
|
|
mocks.handleInlineActions.mockReset();
|
|
mocks.emitResetCommandHooks.mockReset();
|
|
mocks.initSessionState.mockReset();
|
|
|
|
mocks.initSessionState.mockResolvedValue(
|
|
createGetReplySessionState({
|
|
sessionCtx: buildNativeResetContext(),
|
|
sessionKey: "agent:main:telegram:direct:123",
|
|
isNewSession: true,
|
|
resetTriggered: true,
|
|
sessionScope: "per-sender",
|
|
triggerBodyNormalized: "/new",
|
|
bodyStripped: "",
|
|
}),
|
|
);
|
|
|
|
mocks.resolveReplyDirectives.mockResolvedValue(createContinueDirectivesResult(false));
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.unstubAllEnvs();
|
|
});
|
|
|
|
it("emits reset hooks when inline actions return early without marking resetHookTriggered", async () => {
|
|
mocks.handleInlineActions.mockResolvedValue({ kind: "reply", reply: undefined });
|
|
|
|
await getReplyFromConfig(buildNativeResetContext(), undefined, {});
|
|
|
|
expect(mocks.emitResetCommandHooks).toHaveBeenCalledTimes(1);
|
|
const [[hookParams]] = mocks.emitResetCommandHooks.mock.calls as unknown as Array<
|
|
[{ action?: string; sessionKey?: string }]
|
|
>;
|
|
expect(hookParams.action).toBe("new");
|
|
expect(hookParams.sessionKey).toBe("agent:main:telegram:direct:123");
|
|
});
|
|
|
|
it("does not emit fallback hooks when resetHookTriggered is already set", async () => {
|
|
mocks.handleInlineActions.mockResolvedValue({ kind: "reply", reply: undefined });
|
|
mocks.resolveReplyDirectives.mockResolvedValue(createContinueDirectivesResult(true));
|
|
|
|
await getReplyFromConfig(buildNativeResetContext(), undefined, {});
|
|
|
|
expect(mocks.emitResetCommandHooks).not.toHaveBeenCalled();
|
|
});
|
|
});
|