mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-19 11:48:38 +00:00
refactor(gateway): dedupe maintenance timer test setup
This commit is contained in:
@@ -11,6 +11,41 @@ vi.mock("../media/store.js", async (importOriginal) => {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const MEDIA_CLEANUP_TTL_MS = 24 * 60 * 60_000;
|
||||||
|
|
||||||
|
function createMaintenanceTimerDeps() {
|
||||||
|
return {
|
||||||
|
broadcast: () => {},
|
||||||
|
nodeSendToAllSubscribed: () => {},
|
||||||
|
getPresenceVersion: () => 1,
|
||||||
|
getHealthVersion: () => 1,
|
||||||
|
refreshGatewayHealthSnapshot: async () => ({ ok: true }) as HealthSummary,
|
||||||
|
logHealth: { error: () => {} },
|
||||||
|
dedupe: new Map(),
|
||||||
|
chatAbortControllers: new Map(),
|
||||||
|
chatRunState: { abortedRuns: new Map() },
|
||||||
|
chatRunBuffers: new Map(),
|
||||||
|
chatDeltaSentAt: new Map(),
|
||||||
|
removeChatRun: () => undefined,
|
||||||
|
agentRunSeq: new Map(),
|
||||||
|
nodeSendToSession: () => {},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function stopMaintenanceTimers(timers: {
|
||||||
|
tickInterval: NodeJS.Timeout;
|
||||||
|
healthInterval: NodeJS.Timeout;
|
||||||
|
dedupeCleanup: NodeJS.Timeout;
|
||||||
|
mediaCleanup: NodeJS.Timeout | null;
|
||||||
|
}) {
|
||||||
|
clearInterval(timers.tickInterval);
|
||||||
|
clearInterval(timers.healthInterval);
|
||||||
|
clearInterval(timers.dedupeCleanup);
|
||||||
|
if (timers.mediaCleanup) {
|
||||||
|
clearInterval(timers.mediaCleanup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
describe("startGatewayMaintenanceTimers", () => {
|
describe("startGatewayMaintenanceTimers", () => {
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
vi.useRealTimers();
|
vi.useRealTimers();
|
||||||
@@ -22,28 +57,13 @@ describe("startGatewayMaintenanceTimers", () => {
|
|||||||
const { startGatewayMaintenanceTimers } = await import("./server-maintenance.js");
|
const { startGatewayMaintenanceTimers } = await import("./server-maintenance.js");
|
||||||
|
|
||||||
const timers = startGatewayMaintenanceTimers({
|
const timers = startGatewayMaintenanceTimers({
|
||||||
broadcast: () => {},
|
...createMaintenanceTimerDeps(),
|
||||||
nodeSendToAllSubscribed: () => {},
|
|
||||||
getPresenceVersion: () => 1,
|
|
||||||
getHealthVersion: () => 1,
|
|
||||||
refreshGatewayHealthSnapshot: async () => ({ ok: true }) as HealthSummary,
|
|
||||||
logHealth: { error: () => {} },
|
|
||||||
dedupe: new Map(),
|
|
||||||
chatAbortControllers: new Map(),
|
|
||||||
chatRunState: { abortedRuns: new Map() },
|
|
||||||
chatRunBuffers: new Map(),
|
|
||||||
chatDeltaSentAt: new Map(),
|
|
||||||
removeChatRun: () => undefined,
|
|
||||||
agentRunSeq: new Map(),
|
|
||||||
nodeSendToSession: () => {},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(cleanOldMediaMock).not.toHaveBeenCalled();
|
expect(cleanOldMediaMock).not.toHaveBeenCalled();
|
||||||
expect(timers.mediaCleanup).toBeNull();
|
expect(timers.mediaCleanup).toBeNull();
|
||||||
|
|
||||||
clearInterval(timers.tickInterval);
|
stopMaintenanceTimers(timers);
|
||||||
clearInterval(timers.healthInterval);
|
|
||||||
clearInterval(timers.dedupeCleanup);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("runs startup media cleanup and repeats it hourly", async () => {
|
it("runs startup media cleanup and repeats it hourly", async () => {
|
||||||
@@ -51,41 +71,23 @@ describe("startGatewayMaintenanceTimers", () => {
|
|||||||
const { startGatewayMaintenanceTimers } = await import("./server-maintenance.js");
|
const { startGatewayMaintenanceTimers } = await import("./server-maintenance.js");
|
||||||
|
|
||||||
const timers = startGatewayMaintenanceTimers({
|
const timers = startGatewayMaintenanceTimers({
|
||||||
broadcast: () => {},
|
...createMaintenanceTimerDeps(),
|
||||||
nodeSendToAllSubscribed: () => {},
|
mediaCleanupTtlMs: MEDIA_CLEANUP_TTL_MS,
|
||||||
getPresenceVersion: () => 1,
|
|
||||||
getHealthVersion: () => 1,
|
|
||||||
refreshGatewayHealthSnapshot: async () => ({ ok: true }) as HealthSummary,
|
|
||||||
logHealth: { error: () => {} },
|
|
||||||
dedupe: new Map(),
|
|
||||||
chatAbortControllers: new Map(),
|
|
||||||
chatRunState: { abortedRuns: new Map() },
|
|
||||||
chatRunBuffers: new Map(),
|
|
||||||
chatDeltaSentAt: new Map(),
|
|
||||||
removeChatRun: () => undefined,
|
|
||||||
agentRunSeq: new Map(),
|
|
||||||
nodeSendToSession: () => {},
|
|
||||||
mediaCleanupTtlMs: 24 * 60 * 60_000,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(cleanOldMediaMock).toHaveBeenCalledWith(24 * 60 * 60_000, {
|
expect(cleanOldMediaMock).toHaveBeenCalledWith(MEDIA_CLEANUP_TTL_MS, {
|
||||||
recursive: true,
|
recursive: true,
|
||||||
pruneEmptyDirs: true,
|
pruneEmptyDirs: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
cleanOldMediaMock.mockClear();
|
cleanOldMediaMock.mockClear();
|
||||||
await vi.advanceTimersByTimeAsync(60 * 60_000);
|
await vi.advanceTimersByTimeAsync(60 * 60_000);
|
||||||
expect(cleanOldMediaMock).toHaveBeenCalledWith(24 * 60 * 60_000, {
|
expect(cleanOldMediaMock).toHaveBeenCalledWith(MEDIA_CLEANUP_TTL_MS, {
|
||||||
recursive: true,
|
recursive: true,
|
||||||
pruneEmptyDirs: true,
|
pruneEmptyDirs: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
clearInterval(timers.tickInterval);
|
stopMaintenanceTimers(timers);
|
||||||
clearInterval(timers.healthInterval);
|
|
||||||
clearInterval(timers.dedupeCleanup);
|
|
||||||
if (timers.mediaCleanup) {
|
|
||||||
clearInterval(timers.mediaCleanup);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("skips overlapping media cleanup runs", async () => {
|
it("skips overlapping media cleanup runs", async () => {
|
||||||
@@ -102,21 +104,8 @@ describe("startGatewayMaintenanceTimers", () => {
|
|||||||
const { startGatewayMaintenanceTimers } = await import("./server-maintenance.js");
|
const { startGatewayMaintenanceTimers } = await import("./server-maintenance.js");
|
||||||
|
|
||||||
const timers = startGatewayMaintenanceTimers({
|
const timers = startGatewayMaintenanceTimers({
|
||||||
broadcast: () => {},
|
...createMaintenanceTimerDeps(),
|
||||||
nodeSendToAllSubscribed: () => {},
|
mediaCleanupTtlMs: MEDIA_CLEANUP_TTL_MS,
|
||||||
getPresenceVersion: () => 1,
|
|
||||||
getHealthVersion: () => 1,
|
|
||||||
refreshGatewayHealthSnapshot: async () => ({ ok: true }) as HealthSummary,
|
|
||||||
logHealth: { error: () => {} },
|
|
||||||
dedupe: new Map(),
|
|
||||||
chatAbortControllers: new Map(),
|
|
||||||
chatRunState: { abortedRuns: new Map() },
|
|
||||||
chatRunBuffers: new Map(),
|
|
||||||
chatDeltaSentAt: new Map(),
|
|
||||||
removeChatRun: () => undefined,
|
|
||||||
agentRunSeq: new Map(),
|
|
||||||
nodeSendToSession: () => {},
|
|
||||||
mediaCleanupTtlMs: 24 * 60 * 60_000,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(cleanOldMediaMock).toHaveBeenCalledTimes(1);
|
expect(cleanOldMediaMock).toHaveBeenCalledTimes(1);
|
||||||
@@ -132,11 +121,6 @@ describe("startGatewayMaintenanceTimers", () => {
|
|||||||
await vi.advanceTimersByTimeAsync(60 * 60_000);
|
await vi.advanceTimersByTimeAsync(60 * 60_000);
|
||||||
expect(cleanOldMediaMock).toHaveBeenCalledTimes(2);
|
expect(cleanOldMediaMock).toHaveBeenCalledTimes(2);
|
||||||
|
|
||||||
clearInterval(timers.tickInterval);
|
stopMaintenanceTimers(timers);
|
||||||
clearInterval(timers.healthInterval);
|
|
||||||
clearInterval(timers.dedupeCleanup);
|
|
||||||
if (timers.mediaCleanup) {
|
|
||||||
clearInterval(timers.mediaCleanup);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user