Files
openclaw/src/gateway/server-startup-session-migration.test.ts
Peter Steinberger 694ca50e97 Revert "refactor: move runtime state to SQLite"
This reverts commit f91de52f0d.
2026-05-13 13:33:38 +01:00

89 lines
2.7 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import { runStartupSessionMigration } from "./server-startup-session-migration.js";
function makeLog() {
return {
info: vi.fn(),
warn: vi.fn(),
};
}
function makeCfg() {
return { agents: { defaults: {} }, session: {} } as Parameters<
typeof runStartupSessionMigration
>[0]["cfg"];
}
function firstLogMessage(log: ReturnType<typeof vi.fn>, label: string): string {
const [message] = log.mock.calls[0] ?? [];
if (typeof message !== "string") {
throw new Error(`expected ${label} message`);
}
return message;
}
describe("runStartupSessionMigration", () => {
it("logs changes when orphaned keys are canonicalized", async () => {
const log = makeLog();
const migrate = vi.fn().mockResolvedValue({
changes: ["Canonicalized 2 orphaned session key(s) in /tmp/store.json"],
warnings: [],
});
await runStartupSessionMigration({
cfg: makeCfg(),
log,
deps: { migrateOrphanedSessionKeys: migrate },
});
expect(migrate).toHaveBeenCalledOnce();
expect(log.info).toHaveBeenCalledOnce();
expect(firstLogMessage(log.info, "startup migration info")).toContain(
"canonicalized orphaned session keys",
);
expect(log.warn).not.toHaveBeenCalled();
});
it("logs warnings from migration", async () => {
const log = makeLog();
const migrate = vi.fn().mockResolvedValue({
changes: [],
warnings: ["Could not read /bad/path: ENOENT"],
});
await runStartupSessionMigration({
cfg: makeCfg(),
log,
deps: { migrateOrphanedSessionKeys: migrate },
});
expect(log.info).not.toHaveBeenCalled();
expect(log.warn).toHaveBeenCalledOnce();
expect(firstLogMessage(log.warn, "startup migration warning")).toContain(
"session key migration warnings",
);
});
it("silently continues when no changes needed", async () => {
const log = makeLog();
const migrate = vi.fn().mockResolvedValue({ changes: [], warnings: [] });
await runStartupSessionMigration({
cfg: makeCfg(),
log,
deps: { migrateOrphanedSessionKeys: migrate },
});
expect(log.info).not.toHaveBeenCalled();
expect(log.warn).not.toHaveBeenCalled();
});
it("catches and logs migration errors without throwing", async () => {
const log = makeLog();
const migrate = vi.fn().mockRejectedValue(new Error("disk full"));
await runStartupSessionMigration({
cfg: makeCfg(),
log,
deps: { migrateOrphanedSessionKeys: migrate },
});
expect(log.warn).toHaveBeenCalledOnce();
const warning = firstLogMessage(log.warn, "startup migration failure warning");
expect(warning).toContain("migration failed during startup");
expect(warning).toContain("disk full");
});
});