test: align latest main runtime harnesses

This commit is contained in:
Peter Steinberger
2026-04-03 15:03:58 +01:00
parent 5bafa6edcf
commit 0324055d09
6 changed files with 75 additions and 26 deletions

View File

@@ -1,4 +1,4 @@
import type { OpenClawPluginCommandDefinition, PluginRuntime } from "openclaw/plugin-sdk/core";
import type { OpenClawPluginCommandDefinition } from "openclaw/plugin-sdk/core";
import { describe, expect, it, vi } from "vitest";
import type { PluginRuntime } from "./api.js";
import register from "./index.js";

View File

@@ -1,6 +1,11 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { getTaskFlowById, resetTaskFlowRegistryForTests } from "../../tasks/task-flow-registry.js";
import { getTaskById, resetTaskRegistryForTests } from "../../tasks/task-registry.js";
import {
getTaskById,
resetTaskRegistryDeliveryRuntimeForTests,
resetTaskRegistryForTests,
setTaskRegistryDeliveryRuntimeForTests,
} from "../../tasks/task-registry.js";
import { createRuntimeTaskFlow } from "./runtime-taskflow.js";
const hoisted = vi.hoisted(() => {
@@ -14,10 +19,6 @@ const hoisted = vi.hoisted(() => {
};
});
vi.mock("../../tasks/task-registry-delivery-runtime.js", () => ({
sendMessage: hoisted.sendMessageMock,
}));
vi.mock("../../acp/control-plane/manager.js", () => ({
getAcpSessionManager: () => ({
cancelSession: hoisted.cancelSessionMock,
@@ -29,12 +30,19 @@ vi.mock("../../agents/subagent-control.js", () => ({
}));
afterEach(() => {
resetTaskRegistryDeliveryRuntimeForTests();
resetTaskRegistryForTests();
resetTaskFlowRegistryForTests({ persist: false });
vi.clearAllMocks();
});
describe("runtime TaskFlow", () => {
beforeEach(() => {
setTaskRegistryDeliveryRuntimeForTests({
sendMessage: hoisted.sendMessageMock,
});
});
it("binds managed TaskFlow operations to a session key", () => {
const runtime = createRuntimeTaskFlow();
const taskFlow = runtime.bindSession({

View File

@@ -1,6 +1,10 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { resetTaskFlowRegistryForTests } from "../../tasks/task-flow-registry.js";
import { resetTaskRegistryForTests } from "../../tasks/task-registry.js";
import {
resetTaskRegistryDeliveryRuntimeForTests,
resetTaskRegistryForTests,
setTaskRegistryDeliveryRuntimeForTests,
} from "../../tasks/task-registry.js";
import { createRuntimeTaskFlow } from "./runtime-taskflow.js";
import { createRuntimeTaskFlows, createRuntimeTaskRuns } from "./runtime-tasks.js";
@@ -15,10 +19,6 @@ const hoisted = vi.hoisted(() => {
};
});
vi.mock("../../tasks/task-registry-delivery-runtime.js", () => ({
sendMessage: hoisted.sendMessageMock,
}));
vi.mock("../../acp/control-plane/manager.js", () => ({
getAcpSessionManager: () => ({
cancelSession: hoisted.cancelSessionMock,
@@ -30,12 +30,19 @@ vi.mock("../../agents/subagent-control.js", () => ({
}));
afterEach(() => {
resetTaskRegistryDeliveryRuntimeForTests();
resetTaskRegistryForTests();
resetTaskFlowRegistryForTests({ persist: false });
vi.clearAllMocks();
});
describe("runtime tasks", () => {
beforeEach(() => {
setTaskRegistryDeliveryRuntimeForTests({
sendMessage: hoisted.sendMessageMock,
});
});
it("exposes canonical task and TaskFlow DTOs without leaking raw registry fields", () => {
const legacyTaskFlow = createRuntimeTaskFlow().bindSession({
sessionKey: "agent:main:main",

View File

@@ -25,6 +25,7 @@ import {
resetTaskFlowRegistryForTests,
} from "./task-flow-registry.js";
import {
setTaskRegistryDeliveryRuntimeForTests,
getTaskById,
findLatestTaskForFlowId,
findTaskByRunId,
@@ -44,10 +45,6 @@ const hoisted = vi.hoisted(() => {
};
});
vi.mock("./task-registry-delivery-runtime.js", () => ({
sendMessage: hoisted.sendMessageMock,
}));
vi.mock("../acp/control-plane/manager.js", () => ({
getAcpSessionManager: () => ({
cancelSession: hoisted.cancelSessionMock,
@@ -60,6 +57,9 @@ vi.mock("../agents/subagent-control.js", () => ({
async function withTaskExecutorStateDir(run: (stateDir: string) => Promise<void>): Promise<void> {
await withStateDirEnv("openclaw-task-executor-", async ({ stateDir }) => {
setTaskRegistryDeliveryRuntimeForTests({
sendMessage: hoisted.sendMessageMock,
});
resetSystemEventsForTest();
resetHeartbeatWakeStateForTests();
resetAgentEventsForTest();

View File

@@ -1,4 +1,4 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { startAcpSpawnParentStreamRelay } from "../agents/acp-spawn-parent-stream.js";
import {
emitAgentEvent,
@@ -29,8 +29,10 @@ import {
markTaskRunningByRunId,
markTaskTerminalById,
recordTaskProgressByRunId,
resetTaskRegistryDeliveryRuntimeForTests,
resetTaskRegistryForTests,
resolveTaskForLookupToken,
setTaskRegistryDeliveryRuntimeForTests,
setTaskProgressById,
setTaskTimingById,
updateTaskNotifyPolicyById,
@@ -58,10 +60,6 @@ const hoisted = vi.hoisted(() => {
};
});
vi.mock("./task-registry-delivery-runtime.js", () => ({
sendMessage: hoisted.sendMessageMock,
}));
vi.mock("../acp/control-plane/manager.js", () => ({
getAcpSessionManager: () => ({
cancelSession: hoisted.cancelSessionMock,
@@ -74,9 +72,6 @@ vi.mock("../agents/subagent-control.js", () => ({
async function loadFreshTaskRegistryModulesForControlTest() {
vi.resetModules();
vi.doMock("./task-registry-delivery-runtime.js", () => ({
sendMessage: hoisted.sendMessageMock,
}));
vi.doMock("../acp/control-plane/manager.js", () => ({
getAcpSessionManager: () => ({
cancelSession: hoisted.cancelSessionMock,
@@ -85,7 +80,11 @@ async function loadFreshTaskRegistryModulesForControlTest() {
vi.doMock("../agents/subagent-control.js", () => ({
killSubagentRunAdmin: (params: unknown) => hoisted.killSubagentRunAdminMock(params),
}));
return await import("./task-registry.js");
const registry = await import("./task-registry.js");
registry.setTaskRegistryDeliveryRuntimeForTests({
sendMessage: hoisted.sendMessageMock,
});
return registry;
}
async function loadFreshTaskRegistryMaintenanceModuleForTest(params: {
@@ -211,6 +210,12 @@ function configureInMemoryTaskStoresForLinkValidationTests() {
}
describe("task-registry", () => {
beforeEach(() => {
setTaskRegistryDeliveryRuntimeForTests({
sendMessage: hoisted.sendMessageMock,
});
});
afterEach(() => {
vi.useRealTimers();
if (ORIGINAL_STATE_DIR === undefined) {
@@ -221,6 +226,7 @@ describe("task-registry", () => {
resetSystemEventsForTest();
resetHeartbeatWakeStateForTests();
resetAgentRunContextForTest();
resetTaskRegistryDeliveryRuntimeForTests();
resetTaskRegistryForTests({ persist: false });
resetTaskFlowRegistryForTests({ persist: false });
hoisted.sendMessageMock.mockReset();

View File

@@ -57,6 +57,16 @@ const tasksWithPendingDelivery = new Set<string>();
let listenerStarted = false;
let listenerStop: (() => void) | null = null;
let restoreAttempted = false;
type TaskRegistryDeliveryRuntime = Pick<
typeof import("./task-registry-delivery-runtime.js"),
"sendMessage"
>;
const TASK_REGISTRY_DELIVERY_RUNTIME_OVERRIDE_KEY = Symbol.for(
"openclaw.taskRegistry.deliveryRuntimeOverride",
);
type TaskRegistryGlobalWithDeliveryOverride = typeof globalThis & {
[TASK_REGISTRY_DELIVERY_RUNTIME_OVERRIDE_KEY]?: TaskRegistryDeliveryRuntime | null;
};
let deliveryRuntimePromise: Promise<typeof import("./task-registry-delivery-runtime.js")> | null =
null;
let controlRuntimePromise: Promise<typeof import("./task-registry-control.runtime.js")> | null =
@@ -361,6 +371,12 @@ function appendTaskEvent(event: {
}
function loadTaskRegistryDeliveryRuntime() {
const deliveryRuntimeOverride = (globalThis as TaskRegistryGlobalWithDeliveryOverride)[
TASK_REGISTRY_DELIVERY_RUNTIME_OVERRIDE_KEY
];
if (deliveryRuntimeOverride) {
return Promise.resolve(deliveryRuntimeOverride);
}
deliveryRuntimePromise ??= import("./task-registry-delivery-runtime.js");
return deliveryRuntimePromise;
}
@@ -1934,6 +1950,8 @@ export function resetTaskRegistryForTests(opts?: { persist?: boolean }) {
listenerStop = null;
}
listenerStarted = false;
deliveryRuntimePromise = null;
controlRuntimePromise = null;
if (opts?.persist !== false) {
persistTaskRegistry();
}
@@ -1943,5 +1961,15 @@ export function resetTaskRegistryForTests(opts?: { persist?: boolean }) {
}
export function resetTaskRegistryDeliveryRuntimeForTests() {
(globalThis as TaskRegistryGlobalWithDeliveryOverride)[
TASK_REGISTRY_DELIVERY_RUNTIME_OVERRIDE_KEY
] = null;
deliveryRuntimePromise = null;
}
export function setTaskRegistryDeliveryRuntimeForTests(runtime: TaskRegistryDeliveryRuntime): void {
(globalThis as TaskRegistryGlobalWithDeliveryOverride)[
TASK_REGISTRY_DELIVERY_RUNTIME_OVERRIDE_KEY
] = runtime;
deliveryRuntimePromise = null;
}