




























@@ -21,7 +21,10 @@ import type { TaskRecord } from "./task-registry.types.js";
21212222const ORIGINAL_STATE_DIR = process.env.OPENCLAW_STATE_DIR;
232324-function requireFirstUpsertParams(upsertTaskWithDeliveryState: ReturnType<typeof vi.fn>): unknown {
24+function requireFirstUpsertParams(upsertTaskWithDeliveryState: ReturnType<typeof vi.fn>): {
25+task?: { taskId?: string };
26+deliveryState?: { lastNotifiedEventAt?: number };
27+} {
2528const params = upsertTaskWithDeliveryState.mock.calls[0]?.[0];
2629if (!params) {
2730throw new Error("expected task upsert params");
@@ -73,10 +76,9 @@ describe("task-registry store runtime", () => {
7376},
7477});
757876-expect(findTaskByRunId("run-restored")).toMatchObject({
77-taskId: "task-restored",
78-task: "Restored task",
79-});
79+const restored = findTaskByRunId("run-restored");
80+expect(restored?.taskId).toBe("task-restored");
81+expect(restored?.task).toBe("Restored task");
8082expect(loadSnapshot).toHaveBeenCalledTimes(1);
81838284createTaskRecord({
@@ -115,11 +117,10 @@ describe("task-registry store runtime", () => {
115117},
116118});
117119118-expect(findTaskByRunId("run-restored")).toMatchObject({
119-runId: "run-restored",
120-taskId: "task-restored",
121-task: "Restored task",
122-});
120+const restored = findTaskByRunId("run-restored");
121+expect(restored?.runId).toBe("run-restored");
122+expect(restored?.taskId).toBe("task-restored");
123+expect(restored?.task).toBe("Restored task");
123124const created = createTaskRecord({
124125runtime: "acp",
125126ownerKey: "agent:main:main",
@@ -133,18 +134,26 @@ describe("task-registry store runtime", () => {
133134expect(deleteTaskRecordById(created.taskId)).toBe(true);
134135135136expect(events.map((event) => event.kind)).toEqual(["restored", "upserted", "deleted"]);
136-expect(events[0]).toMatchObject({
137-kind: "restored",
138-tasks: [expect.objectContaining({ taskId: "task-restored" })],
139-});
140-expect(events[1]).toMatchObject({
141-kind: "upserted",
142-task: expect.objectContaining({ taskId: created.taskId }),
143-});
144-expect(events[2]).toMatchObject({
145-kind: "deleted",
146-taskId: created.taskId,
147-});
137+const restoredEvent = events[0];
138+expect(restoredEvent?.kind).toBe("restored");
139+if (restoredEvent?.kind !== "restored") {
140+throw new Error("Expected restored observer event");
141+}
142+expect(restoredEvent.tasks.map((task) => task.taskId)).toEqual(["task-restored"]);
143+144+const upsertedEvent = events[1];
145+expect(upsertedEvent?.kind).toBe("upserted");
146+if (upsertedEvent?.kind !== "upserted") {
147+throw new Error("Expected upserted observer event");
148+}
149+expect(upsertedEvent.task.taskId).toBe(created.taskId);
150+151+const deletedEvent = events[2];
152+expect(deletedEvent?.kind).toBe("deleted");
153+if (deletedEvent?.kind !== "deleted") {
154+throw new Error("Expected deleted observer event");
155+}
156+expect(deletedEvent.taskId).toBe(created.taskId);
148157});
149158150159it("uses atomic task-plus-delivery store methods when available", async () => {
@@ -182,11 +191,7 @@ describe("task-registry store runtime", () => {
182191expect(deleteTaskRecordById(created.taskId)).toBe(true);
183192184193expect(upsertTaskWithDeliveryState).toHaveBeenCalled();
185-expect(requireFirstUpsertParams(upsertTaskWithDeliveryState)).toMatchObject({
186-task: expect.objectContaining({
187-taskId: created.taskId,
188-}),
189-});
194+expect(requireFirstUpsertParams(upsertTaskWithDeliveryState).task?.taskId).toBe(created.taskId);
190195expect(
191196upsertTaskWithDeliveryState.mock.calls.some((call) => {
192197const params = call[0] as { deliveryState?: { lastNotifiedEventAt?: number } };
@@ -211,11 +216,10 @@ describe("task-registry store runtime", () => {
211216212217resetTaskRegistryForTests({ persist: false });
213218214-expect(findTaskByRunId("run-sqlite")).toMatchObject({
215-taskId: created.taskId,
216-sourceId: "job-123",
217-task: "Run nightly cron",
218-});
219+const restored = findTaskByRunId("run-sqlite");
220+expect(restored?.taskId).toBe(created.taskId);
221+expect(restored?.sourceId).toBe("job-123");
222+expect(restored?.task).toBe("Run nightly cron");
219223});
220224221225it("persists parentFlowId with task rows", () => {
@@ -238,10 +242,9 @@ describe("task-registry store runtime", () => {
238242239243resetTaskRegistryForTests({ persist: false });
240244241-expect(findTaskByRunId("run-flow-linked")).toMatchObject({
242-taskId: created.taskId,
243-parentFlowId: flow.flowId,
244-});
245+const restored = findTaskByRunId("run-flow-linked");
246+expect(restored?.taskId).toBe(created.taskId);
247+expect(restored?.parentFlowId).toBe(flow.flowId);
245248});
246249247250it("preserves requesterSessionKey when it differs from ownerKey across sqlite restore", () => {
@@ -260,12 +263,11 @@ describe("task-registry store runtime", () => {
260263261264resetTaskRegistryForTests({ persist: false });
262265263-expect(findTaskByRunId("run-requester-session-restore")).toMatchObject({
264-taskId: created.taskId,
265-requesterSessionKey: "agent:main:workspace:channel:C1234567890",
266-ownerKey: "agent:main:main",
267-childSessionKey: "agent:main:workspace:channel:C1234567890",
268-});
266+const restored = findTaskByRunId("run-requester-session-restore");
267+expect(restored?.taskId).toBe(created.taskId);
268+expect(restored?.requesterSessionKey).toBe("agent:main:workspace:channel:C1234567890");
269+expect(restored?.ownerKey).toBe("agent:main:main");
270+expect(restored?.childSessionKey).toBe("agent:main:workspace:channel:C1234567890");
269271});
270272271273it("preserves taskKind across sqlite restore", () => {
@@ -284,11 +286,10 @@ describe("task-registry store runtime", () => {
284286285287resetTaskRegistryForTests({ persist: false });
286288287-expect(findTaskByRunId("run-task-kind-restore")).toMatchObject({
288-taskId: created.taskId,
289-taskKind: "video_generation",
290-runId: "run-task-kind-restore",
291-});
289+const restored = findTaskByRunId("run-task-kind-restore");
290+expect(restored?.taskId).toBe(created.taskId);
291+expect(restored?.taskKind).toBe("video_generation");
292+expect(restored?.runId).toBe("run-task-kind-restore");
292293});
293294294295it("hardens the sqlite task store directory and file modes", async () => {
@@ -392,13 +393,12 @@ describe("task-registry store runtime", () => {
392393393394resetTaskRegistryForTests({ persist: false });
394395395-expect(findTaskByRunId("legacy-cron-run")).toMatchObject({
396-taskId: "legacy-cron-task",
397-ownerKey: "system:cron:nightly-digest",
398-scopeKind: "system",
399-deliveryStatus: "not_applicable",
400-notifyPolicy: "silent",
401-});
396+const restored = findTaskByRunId("legacy-cron-run");
397+expect(restored?.taskId).toBe("legacy-cron-task");
398+expect(restored?.ownerKey).toBe("system:cron:nightly-digest");
399+expect(restored?.scopeKind).toBe("system");
400+expect(restored?.deliveryStatus).toBe("not_applicable");
401+expect(restored?.notifyPolicy).toBe("silent");
402402},
403403);
404404});
@@ -473,23 +473,19 @@ describe("task-registry store runtime", () => {
473473474474resetTaskRegistryForTests({ persist: false });
475475476-expect(
477-markTaskLostById({
478-taskId: "legacy-session-task",
479-endedAt: 200,
480-lastEventAt: 200,
481-error: "session missing",
482-}),
483-).toMatchObject({
484-taskId: "legacy-session-task",
485-status: "lost",
486-error: "session missing",
487-});
488-expect(findTaskByRunId("legacy-session-run")).toMatchObject({
476+const lost = markTaskLostById({
489477taskId: "legacy-session-task",
490-status: "lost",
478+endedAt: 200,
479+lastEventAt: 200,
491480error: "session missing",
492481});
482+expect(lost?.taskId).toBe("legacy-session-task");
483+expect(lost?.status).toBe("lost");
484+expect(lost?.error).toBe("session missing");
485+const restored = findTaskByRunId("legacy-session-run");
486+expect(restored?.taskId).toBe("legacy-session-task");
487+expect(restored?.status).toBe("lost");
488+expect(restored?.error).toBe("session missing");
493489},
494490);
495491});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。