Files
openclaw/src/auto-reply/reply/get-reply.config-override.test.ts
2026-03-26 16:48:34 +00:00

122 lines
3.6 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
import type { OpenClawConfig } from "../../config/config.js";
import type { MsgContext } from "../templating.js";
import "./get-reply.test-runtime-mocks.js";
const mocks = vi.hoisted(() => ({
resolveReplyDirectives: vi.fn(),
initSessionState: vi.fn(),
}));
vi.mock("./directive-handling.defaults.js", () => ({
resolveDefaultModel: vi.fn(() => ({
defaultProvider: "openai",
defaultModel: "gpt-4o-mini",
aliasIndex: new Map(),
})),
}));
vi.mock("./get-reply-directives.js", () => ({
resolveReplyDirectives: (...args: unknown[]) => mocks.resolveReplyDirectives(...args),
}));
vi.mock("./get-reply-inline-actions.js", () => ({
handleInlineActions: vi.fn(async () => ({ kind: "reply", reply: { text: "ok" } })),
}));
vi.mock("./session.js", () => ({
initSessionState: (...args: unknown[]) => mocks.initSessionState(...args),
}));
let getReplyFromConfig: typeof import("./get-reply.js").getReplyFromConfig;
let loadConfigMock: typeof import("../../config/config.js").loadConfig;
async function loadFreshGetReplyModuleForTest() {
vi.resetModules();
({ getReplyFromConfig } = await import("./get-reply.js"));
({ loadConfig: loadConfigMock } = await import("../../config/config.js"));
}
function buildCtx(overrides: Partial<MsgContext> = {}): MsgContext {
return {
Provider: "telegram",
Surface: "telegram",
ChatType: "direct",
Body: "hello",
BodyForAgent: "hello",
RawBody: "hello",
CommandBody: "hello",
SessionKey: "agent:main:telegram:123",
From: "telegram:user:42",
To: "telegram:123",
Timestamp: 1710000000000,
...overrides,
};
}
describe("getReplyFromConfig configOverride", () => {
beforeEach(async () => {
await loadFreshGetReplyModuleForTest();
mocks.resolveReplyDirectives.mockReset();
mocks.initSessionState.mockReset();
vi.mocked(loadConfigMock).mockReset();
vi.mocked(loadConfigMock).mockReturnValue({});
mocks.resolveReplyDirectives.mockResolvedValue({ kind: "reply", reply: { text: "ok" } });
mocks.initSessionState.mockResolvedValue({
sessionCtx: {},
sessionEntry: {},
previousSessionEntry: {},
sessionStore: {},
sessionKey: "agent:main:telegram:123",
sessionId: "session-1",
isNewSession: false,
resetTriggered: false,
systemSent: false,
abortedLastRun: false,
storePath: "/tmp/sessions.json",
sessionScope: "per-chat",
groupResolution: undefined,
isGroup: false,
triggerBodyNormalized: "",
bodyStripped: "",
});
});
it("merges configOverride over fresh loadConfig()", async () => {
vi.mocked(loadConfigMock).mockReturnValue({
channels: {
telegram: {
botToken: "resolved-telegram-token",
},
},
agents: {
defaults: {
userTimezone: "UTC",
},
},
} satisfies OpenClawConfig);
await getReplyFromConfig(buildCtx(), undefined, {
agents: {
defaults: {
userTimezone: "America/New_York",
},
},
} as OpenClawConfig);
expect(mocks.resolveReplyDirectives).toHaveBeenCalledWith(
expect.objectContaining({
cfg: expect.objectContaining({
channels: expect.objectContaining({
telegram: expect.objectContaining({
botToken: "resolved-telegram-token",
}),
}),
agents: expect.objectContaining({
defaults: expect.objectContaining({
userTimezone: "America/New_York",
}),
}),
}),
}),
);
});
});