| import fs from "node:fs/promises"; |
| import os from "node:os"; |
| import path from "node:path"; |
|
|
| import { beforeEach, describe, expect, it, vi } from "vitest"; |
|
|
| const agentCommand = vi.fn(); |
|
|
| vi.mock("../commands/agent.js", () => ({ agentCommand })); |
|
|
| const { runBootOnce } = await import("./boot.js"); |
| const { resolveMainSessionKey } = await import("../config/sessions/main-session.js"); |
|
|
| describe("runBootOnce", () => { |
| beforeEach(() => { |
| vi.clearAllMocks(); |
| }); |
|
|
| const makeDeps = () => ({ |
| sendMessageWhatsApp: vi.fn(), |
| sendMessageTelegram: vi.fn(), |
| sendMessageDiscord: vi.fn(), |
| sendMessageSlack: vi.fn(), |
| sendMessageSignal: vi.fn(), |
| sendMessageIMessage: vi.fn(), |
| }); |
|
|
| it("skips when BOOT.md is missing", async () => { |
| const workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-boot-")); |
| await expect(runBootOnce({ cfg: {}, deps: makeDeps(), workspaceDir })).resolves.toEqual({ |
| status: "skipped", |
| reason: "missing", |
| }); |
| expect(agentCommand).not.toHaveBeenCalled(); |
| await fs.rm(workspaceDir, { recursive: true, force: true }); |
| }); |
|
|
| it("skips when BOOT.md is empty", async () => { |
| const workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-boot-")); |
| await fs.writeFile(path.join(workspaceDir, "BOOT.md"), " \n", "utf-8"); |
| await expect(runBootOnce({ cfg: {}, deps: makeDeps(), workspaceDir })).resolves.toEqual({ |
| status: "skipped", |
| reason: "empty", |
| }); |
| expect(agentCommand).not.toHaveBeenCalled(); |
| await fs.rm(workspaceDir, { recursive: true, force: true }); |
| }); |
|
|
| it("runs agent command when BOOT.md exists", async () => { |
| const workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-boot-")); |
| const content = "Say hello when you wake up."; |
| await fs.writeFile(path.join(workspaceDir, "BOOT.md"), content, "utf-8"); |
|
|
| agentCommand.mockResolvedValue(undefined); |
| await expect(runBootOnce({ cfg: {}, deps: makeDeps(), workspaceDir })).resolves.toEqual({ |
| status: "ran", |
| }); |
|
|
| expect(agentCommand).toHaveBeenCalledTimes(1); |
| const call = agentCommand.mock.calls[0]?.[0]; |
| expect(call).toEqual( |
| expect.objectContaining({ |
| deliver: false, |
| sessionKey: resolveMainSessionKey({}), |
| }), |
| ); |
| expect(call?.message).toContain("BOOT.md:"); |
| expect(call?.message).toContain(content); |
| expect(call?.message).toContain("NO_REPLY"); |
|
|
| await fs.rm(workspaceDir, { recursive: true, force: true }); |
| }); |
| }); |
|
|