openclaw / src /plugins /runtime /runtime-agent.session-patch.test.ts
SaylorTwift's picture
SaylorTwift HF Staff
Add files using upload-large-folder tool
4c76b0d verified
Raw
History Blame Contribute Delete
1.78 kB
import { describe, expect, it } from "vitest";
import { createDeferred } from "../../../test/helpers/promise.js";
import { withOpenClawTestState } from "../../test-utils/openclaw-test-state.js";
import { createRuntimeAgent } from "./runtime-agent.js";
describe("plugin runtime session patches", () => {
it("rejects a patch whose owner closes during asynchronous preparation", async () => {
await withOpenClawTestState({ label: "plugin-runtime-patch-owner" }, async () => {
const runtime = createRuntimeAgent();
const scope = { agentId: "main", sessionKey: "agent:main:reef:group:room" };
await runtime.session.upsertSessionEntry({
...scope,
entry: { sessionId: "original", updatedAt: 100, displayName: "Original title" },
});
const original = runtime.session.getSessionEntry(scope);
const preparing = createDeferred();
const releasePreparation = createDeferred();
let ownerActive = true;
const patch = runtime.session.patchSessionEntry({
...scope,
preserveActivity: true,
assertCommitAllowed: () => {
if (!ownerActive) {
throw new Error("Session patch owner closed");
}
},
update: async () => {
preparing.resolve();
await releasePreparation.promise;
return { displayName: "Stale title" };
},
});
try {
await preparing.promise;
ownerActive = false;
releasePreparation.resolve();
await expect(patch).rejects.toThrow("Session patch owner closed");
expect(runtime.session.getSessionEntry(scope)).toEqual(original);
} finally {
releasePreparation.resolve();
await patch.catch(() => undefined);
}
});
});
});