mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-06 23:22:53 +00:00
89 lines
2.7 KiB
TypeScript
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");
|
|
});
|
|
});
|