




















@@ -16,6 +16,7 @@ import {
16161717const deliverOutboundPayloads = vi.hoisted(() => vi.fn());
1818const resolveOutboundDurableFinalDeliverySupport = vi.hoisted(() => vi.fn());
19+const sendDurableMessageBatch = vi.hoisted(() => vi.fn());
19202021vi.mock("../../infra/outbound/deliver.js", async (importOriginal) => {
2122const actual = await importOriginal<typeof import("../../infra/outbound/deliver.js")>();
@@ -26,6 +27,14 @@ vi.mock("../../infra/outbound/deliver.js", async (importOriginal) => {
2627};
2728});
282930+vi.mock("../message/send.js", async (importOriginal) => {
31+const actual = await importOriginal<typeof import("../message/send.js")>();
32+return {
33+ ...actual,
34+ sendDurableMessageBatch,
35+};
36+});
37+2938const cfg = {} as OpenClawConfig;
30393140function createCtx(overrides: Partial<FinalizedMsgContext> = {}): FinalizedMsgContext {
@@ -62,14 +71,26 @@ function createDispatch(
6271}) as DispatchReplyWithBufferedBlockDispatcher;
6372}
647374+function createDurableSendResult(messageIds: string[]) {
75+return {
76+status: "sent",
77+results: messageIds.map((messageId) => ({ messageId })),
78+receipt: {
79+platformMessageIds: messageIds,
80+parts: [],
81+sentAt: 1,
82+},
83+};
84+}
85+6586describe("channel turn kernel", () => {
6687beforeEach(() => {
6788vi.clearAllMocks();
6889resolveOutboundDurableFinalDeliverySupport.mockResolvedValue({ ok: true });
6990});
70917192it("routes assembled final replies through durable outbound delivery", async () => {
72-deliverOutboundPayloads.mockResolvedValueOnce([{ messageId: "tg-1" }]);
93+sendDurableMessageBatch.mockResolvedValueOnce(createDurableSendResult(["tg-1"]));
7394const deliver = vi.fn();
7495const recordInboundSession = createRecordInboundSession();
7596const dispatchReplyWithBufferedBlockDispatcher = createDispatch();
@@ -96,13 +117,13 @@ describe("channel turn kernel", () => {
9611797118expect(result.dispatched).toBe(true);
98119expect(deliver).not.toHaveBeenCalled();
99-expect(deliverOutboundPayloads).toHaveBeenCalledWith(
120+expect(sendDurableMessageBatch).toHaveBeenCalledWith(
100121expect.objectContaining({
101122channel: "telegram",
102123to: "123",
103124accountId: "acct",
104125payloads: [expect.objectContaining({ text: "reply" })],
105-queuePolicy: "best_effort",
126+durability: "best_effort",
106127replyToMode: "first",
107128threadId: 777,
108129session: expect.objectContaining({
@@ -127,7 +148,7 @@ describe("channel turn kernel", () => {
127148});
128149129150it("returns durable delivery result to the buffered dispatcher", async () => {
130-deliverOutboundPayloads.mockResolvedValueOnce([{ messageId: "tg-1" }, { messageId: "tg-2" }]);
151+sendDurableMessageBatch.mockResolvedValueOnce(createDurableSendResult(["tg-1", "tg-2"]));
131152let deliveredResult: unknown;
132153const dispatchReplyWithBufferedBlockDispatcher = vi.fn(
133154async (params: Parameters<DispatchReplyWithBufferedBlockDispatcher>[0]) => {
@@ -167,7 +188,7 @@ describe("channel turn kernel", () => {
167188});
168189169190it("prepares payloads before durable enqueue and observes handled delivery", async () => {
170-deliverOutboundPayloads.mockResolvedValueOnce([{ messageId: "tlon-1" }]);
191+sendDurableMessageBatch.mockResolvedValueOnce(createDurableSendResult(["tlon-1"]));
171192const onDelivered = vi.fn();
172193const dispatchReplyWithBufferedBlockDispatcher = createDispatch();
173194@@ -195,7 +216,7 @@ describe("channel turn kernel", () => {
195216},
196217});
197218198-expect(deliverOutboundPayloads).toHaveBeenCalledWith(
219+expect(sendDurableMessageBatch).toHaveBeenCalledWith(
199220expect.objectContaining({
200221payloads: [expect.objectContaining({ text: "reply\n\n_[Generated by test]_" })],
201222}),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。