From c8d473c8e8a759bd5f8b15c14344c0e35139fa52 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 22 Feb 2026 09:29:34 +0000 Subject: [PATCH] test(heartbeat): use shared sandbox in sender target suite --- ...ner.sender-prefers-delivery-target.test.ts | 90 +++++++++---------- 1 file changed, 40 insertions(+), 50 deletions(-) diff --git a/src/infra/heartbeat-runner.sender-prefers-delivery-target.test.ts b/src/infra/heartbeat-runner.sender-prefers-delivery-target.test.ts index 625d11e01..71a190c84 100644 --- a/src/infra/heartbeat-runner.sender-prefers-delivery-target.test.ts +++ b/src/infra/heartbeat-runner.sender-prefers-delivery-target.test.ts @@ -1,13 +1,8 @@ -import fs from "node:fs/promises"; -import os from "node:os"; -import path from "node:path"; import { describe, expect, it, vi } from "vitest"; -import * as replyModule from "../auto-reply/reply.js"; import type { OpenClawConfig } from "../config/config.js"; -import { resolveMainSessionKey } from "../config/sessions.js"; import { runHeartbeatOnce } from "./heartbeat-runner.js"; import { installHeartbeatRunnerTestRuntime } from "./heartbeat-runner.test-harness.js"; -import { seedSessionStore } from "./heartbeat-runner.test-utils.js"; +import { seedMainSessionStore, withTempHeartbeatSandbox } from "./heartbeat-runner.test-utils.js"; // Avoid pulling optional runtime deps during isolated runs. vi.mock("jiti", () => ({ createJiti: () => () => ({}) })); @@ -16,56 +11,51 @@ installHeartbeatRunnerTestRuntime({ includeSlack: true }); describe("runHeartbeatOnce", () => { it("uses the delivery target as sender when lastTo differs", async () => { - const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-hb-")); - await fs.writeFile(path.join(tmpDir, "HEARTBEAT.md"), "- Check status\n", "utf-8"); - const storePath = path.join(tmpDir, "sessions.json"); - const replySpy = vi.spyOn(replyModule, "getReplyFromConfig"); - try { - const cfg: OpenClawConfig = { - agents: { - defaults: { - workspace: tmpDir, - heartbeat: { - every: "5m", - target: "slack", - to: "C0A9P2N8QHY", + await withTempHeartbeatSandbox( + async ({ tmpDir, storePath, replySpy }) => { + const cfg: OpenClawConfig = { + agents: { + defaults: { + workspace: tmpDir, + heartbeat: { + every: "5m", + target: "slack", + to: "C0A9P2N8QHY", + }, }, }, - }, - session: { store: storePath }, - }; - const sessionKey = resolveMainSessionKey(cfg); + session: { store: storePath }, + }; - await seedSessionStore(storePath, sessionKey, { - lastChannel: "telegram", - lastProvider: "telegram", - lastTo: "1644620762", - }); + await seedMainSessionStore(storePath, cfg, { + lastChannel: "telegram", + lastProvider: "telegram", + lastTo: "1644620762", + }); - replySpy.mockImplementation(async (ctx) => { - expect(ctx.To).toBe("C0A9P2N8QHY"); - expect(ctx.From).toBe("C0A9P2N8QHY"); - return { text: "ok" }; - }); + replySpy.mockImplementation(async (ctx: { To?: string; From?: string }) => { + expect(ctx.To).toBe("C0A9P2N8QHY"); + expect(ctx.From).toBe("C0A9P2N8QHY"); + return { text: "ok" }; + }); - const sendSlack = vi.fn().mockResolvedValue({ - messageId: "m1", - channelId: "C0A9P2N8QHY", - }); + const sendSlack = vi.fn().mockResolvedValue({ + messageId: "m1", + channelId: "C0A9P2N8QHY", + }); - await runHeartbeatOnce({ - cfg, - deps: { - sendSlack, - getQueueSize: () => 0, - nowMs: () => 0, - }, - }); + await runHeartbeatOnce({ + cfg, + deps: { + sendSlack, + getQueueSize: () => 0, + nowMs: () => 0, + }, + }); - expect(sendSlack).toHaveBeenCalled(); - } finally { - replySpy.mockRestore(); - await fs.rm(tmpDir, { recursive: true, force: true }); - } + expect(sendSlack).toHaveBeenCalled(); + }, + { prefix: "openclaw-hb-" }, + ); }); });