Files
openclaw/src/tasks/task-flow-owner-access.test.ts
2026-04-11 07:17:31 +01:00

100 lines
2.7 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it } from "vitest";
import {
findLatestTaskFlowForOwner,
getTaskFlowByIdForOwner,
listTaskFlowsForOwner,
resolveTaskFlowForLookupTokenForOwner,
} from "./task-flow-owner-access.js";
import { createManagedTaskFlow, resetTaskFlowRegistryForTests } from "./task-flow-registry.js";
import { configureTaskFlowRegistryRuntime } from "./task-flow-registry.store.js";
beforeEach(() => {
resetTaskFlowRegistryForTests({ persist: false });
configureTaskFlowRegistryRuntime({
store: {
loadSnapshot: () => ({ flows: new Map() }),
saveSnapshot: () => {},
upsertFlow: () => {},
deleteFlow: () => {},
},
});
});
afterEach(() => {
resetTaskFlowRegistryForTests({ persist: false });
});
describe("task flow owner access", () => {
it("returns owner-scoped flows for direct and owner-key lookups", () => {
const older = createManagedTaskFlow({
ownerKey: "agent:main:main",
controllerId: "tests/owner-access",
goal: "Older flow",
createdAt: 100,
updatedAt: 100,
});
const latest = createManagedTaskFlow({
ownerKey: "agent:main:main",
controllerId: "tests/owner-access",
goal: "Latest flow",
createdAt: 200,
updatedAt: 200,
});
expect(
getTaskFlowByIdForOwner({
flowId: older.flowId,
callerOwnerKey: "agent:main:main",
})?.flowId,
).toBe(older.flowId);
expect(
findLatestTaskFlowForOwner({
callerOwnerKey: "agent:main:main",
})?.flowId,
).toBe(latest.flowId);
expect(
resolveTaskFlowForLookupTokenForOwner({
token: "agent:main:main",
callerOwnerKey: "agent:main:main",
})?.flowId,
).toBe(latest.flowId);
expect(
listTaskFlowsForOwner({
callerOwnerKey: "agent:main:main",
}).map((flow) => flow.flowId),
).toEqual([latest.flowId, older.flowId]);
});
it("denies cross-owner flow reads", () => {
const flow = createManagedTaskFlow({
ownerKey: "agent:main:main",
controllerId: "tests/owner-access",
goal: "Hidden flow",
});
expect(
getTaskFlowByIdForOwner({
flowId: flow.flowId,
callerOwnerKey: "agent:main:other",
}),
).toBeUndefined();
expect(
resolveTaskFlowForLookupTokenForOwner({
token: flow.flowId,
callerOwnerKey: "agent:main:other",
}),
).toBeUndefined();
expect(
resolveTaskFlowForLookupTokenForOwner({
token: "agent:main:main",
callerOwnerKey: "agent:main:other",
}),
).toBeUndefined();
expect(
listTaskFlowsForOwner({
callerOwnerKey: "agent:main:other",
}),
).toEqual([]);
});
});