Files
openclaw/src/web/auto-reply/heartbeat-runner.timestamp.test.ts
Tak Hoffman d2c2f4185b Heartbeat: inject cron-style current time into prompts (#13733)
* Heartbeat: inject cron-style current time into prompts

* Tests: fix type for web heartbeat timestamp test

* Infra: inline heartbeat current-time injection
2026-02-10 18:58:45 -06:00

46 lines
1.5 KiB
TypeScript

import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { describe, expect, it, vi } from "vitest";
import type { OpenClawConfig } from "../../config/config.js";
import { runWebHeartbeatOnce } from "./heartbeat-runner.js";
describe("runWebHeartbeatOnce (timestamp)", () => {
it("injects a cron-style Current time line into the heartbeat prompt", async () => {
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-web-hb-"));
const storePath = path.join(tmpDir, "sessions.json");
try {
await fs.writeFile(storePath, JSON.stringify({}, null, 2));
const replyResolver = vi.fn().mockResolvedValue([{ text: "HEARTBEAT_OK" }]);
const cfg = {
agents: {
defaults: {
heartbeat: { prompt: "Ops check", every: "5m" },
userTimezone: "America/Chicago",
timeFormat: "24",
},
},
session: { store: storePath },
channels: { whatsapp: { allowFrom: ["*"] } },
} as unknown as OpenClawConfig;
await runWebHeartbeatOnce({
cfg,
to: "+1555",
dryRun: true,
replyResolver,
sender: vi.fn(),
});
expect(replyResolver).toHaveBeenCalledTimes(1);
const ctx = replyResolver.mock.calls[0]?.[0];
expect(ctx?.Body).toMatch(/Ops check/);
expect(ctx?.Body).toMatch(/Current time: /);
expect(ctx?.Body).toMatch(/\(.+\)/);
} finally {
await fs.rm(tmpDir, { recursive: true, force: true });
}
});
});