




























@@ -21,25 +21,16 @@ describe("message lifecycle primitives", () => {
2121};
22222323const preview = createLiveMessageState({ receipt });
24-expect(preview).toEqual(
25-expect.objectContaining({
26-phase: "previewing",
27-canFinalizeInPlace: true,
28-}),
29-);
24+expect(preview.phase).toBe("previewing");
25+expect(preview.canFinalizeInPlace).toBe(true);
302631-expect(markLiveMessageFinalized(preview, receipt)).toEqual(
32-expect.objectContaining({
33-phase: "finalized",
34-canFinalizeInPlace: false,
35-}),
36-);
37-expect(markLiveMessageCancelled(preview)).toEqual(
38-expect.objectContaining({
39-phase: "cancelled",
40-canFinalizeInPlace: false,
41-}),
42-);
27+const finalized = markLiveMessageFinalized(preview, receipt);
28+expect(finalized.phase).toBe("finalized");
29+expect(finalized.canFinalizeInPlace).toBe(false);
30+31+const cancelled = markLiveMessageCancelled(preview);
32+expect(cancelled.phase).toBe("cancelled");
33+expect(cancelled.canFinalizeInPlace).toBe(false);
4334});
44354536it("tracks live preview rendered batch updates", () => {
@@ -58,12 +49,9 @@ describe("message lifecycle primitives", () => {
5849},
5950};
605161-expect(markLiveMessagePreviewUpdated(preview, rendered)).toEqual(
62-expect.objectContaining({
63-phase: "previewing",
64-lastRendered: rendered,
65-}),
66-);
52+const updated = markLiveMessagePreviewUpdated(preview, rendered);
53+expect(updated.phase).toBe("previewing");
54+expect(updated.lastRendered).toBe(rendered);
6755});
68566957it("finalizes live previews in place with preview receipts", async () => {
@@ -89,21 +77,23 @@ describe("message lifecycle primitives", () => {
8977expect(result.kind).toBe("preview-finalized");
9078expect(editFinal).toHaveBeenCalledWith("preview-1", { text: "done" });
9179expect(deliverNormally).not.toHaveBeenCalled();
92-expect(result.liveState).toEqual(
93-expect.objectContaining({
94-phase: "finalized",
95-canFinalizeInPlace: false,
96-receipt: expect.objectContaining({
97-primaryPlatformMessageId: "preview-1",
98-platformMessageIds: ["preview-1"],
99-}),
100-}),
101-);
102-expect(onPreviewFinalized).toHaveBeenCalledWith(
103-"preview-1",
104-expect.objectContaining({ primaryPlatformMessageId: "preview-1" }),
105-result.liveState,
106-);
80+const liveState = result.liveState;
81+if (!liveState) {
82+throw new Error("expected finalized live state");
83+}
84+expect(liveState.phase).toBe("finalized");
85+expect(liveState.canFinalizeInPlace).toBe(false);
86+expect(liveState.receipt?.primaryPlatformMessageId).toBe("preview-1");
87+expect(liveState.receipt?.platformMessageIds).toEqual(["preview-1"]);
88+expect(onPreviewFinalized).toHaveBeenCalledTimes(1);
89+const [previewId, receiptArg, stateArg] = onPreviewFinalized.mock.calls[0] as unknown as [
90+string,
91+{ primaryPlatformMessageId?: string },
92+unknown,
93+];
94+expect(previewId).toBe("preview-1");
95+expect(receiptArg.primaryPlatformMessageId).toBe("preview-1");
96+expect(stateArg).toBe(liveState);
10797});
1089810999it("treats live preview fallback delivery as terminal state", async () => {
@@ -129,12 +119,12 @@ describe("message lifecycle primitives", () => {
129119expect(discardPending).toHaveBeenCalledTimes(1);
130120expect(deliverNormally).toHaveBeenCalledWith({ text: "with media" });
131121expect(clear).toHaveBeenCalledTimes(1);
132-expect(result.liveState).toEqual(
133- expect.objectContaining({
134- phase: "cancelled",
135- canFinalizeInPlace: false,
136- }),
137-);
122+const liveState = result.liveState;
123+if (!liveState) {
124+throw new Error("expected fallback live state");
125+}
126+expect(liveState.phase).toBe("cancelled");
127+expect(liveState.canFinalizeInPlace).toBe(false);
138128});
139129140130it("delivers through finalizable live preview adapters", async () => {
@@ -222,14 +212,14 @@ describe("message lifecycle primitives", () => {
222212expect(result.kind).toBe("preview-retained");
223213expect(result.liveState?.phase).toBe("previewing");
224214expect(deliverNormally).not.toHaveBeenCalled();
225-expect(handlePreviewEditError).toHaveBeenCalledWith(
226- expect.objectContaining({
227- error: editError,
228- id: "preview-maybe-final",
229- edit: { text: "done" },
230- payload: { text: "done" },
231- }),
232-);
215+expect(handlePreviewEditError).toHaveBeenCalledTimes(1);
216+const [editErrorContext] = handlePreviewEditError.mock.calls[0] as unknown as [
217+{ error: unknown; id?: string; edit?: unknown; payload?: unknown },
218+];
219+expect(editErrorContext.error).toBe(editError);
220+expect(editErrorContext.id).toBe("preview-maybe-final");
221+expect(editErrorContext.edit).toEqual({ text: "done" });
222+expect(editErrorContext.payload).toEqual({ text: "done" });
233223});
234224235225it("does not fallback-send after a successful preview edit when finalization hooks fail", async () => {
@@ -268,16 +258,12 @@ describe("message lifecycle primitives", () => {
268258receivedAt: 123,
269259});
270260271-expect(ctx).toEqual(
272-expect.objectContaining({
273-id: "rx-1",
274-channel: "telegram",
275-message: { text: "hello" },
276-ackPolicy: "after_receive_record",
277-ackState: "pending",
278-receivedAt: 123,
279-}),
280-);
261+expect(ctx.id).toBe("rx-1");
262+expect(ctx.channel).toBe("telegram");
263+expect(ctx.message).toEqual({ text: "hello" });
264+expect(ctx.ackPolicy).toBe("after_receive_record");
265+expect(ctx.ackState).toBe("pending");
266+expect(ctx.receivedAt).toBe(123);
281267});
282268283269it("acks and nacks receive contexts through explicit hooks", async () => {
@@ -335,24 +321,19 @@ describe("message lifecycle primitives", () => {
335321});
336322337323it("creates durable message state records with normalized errors", () => {
338-expect(
339-createDurableMessageStateRecord({
340-intent: {
341-id: "intent-1",
342-channel: "telegram",
343-to: "12345",
344-durability: "required",
345-},
346-state: "failed",
347-error: new Error("network"),
348-updatedAt: 123,
349-}),
350-).toEqual(
351-expect.objectContaining({
352-state: "failed",
353-errorMessage: "network",
354-updatedAt: 123,
355-}),
356-);
324+const record = createDurableMessageStateRecord({
325+intent: {
326+id: "intent-1",
327+channel: "telegram",
328+to: "12345",
329+durability: "required",
330+},
331+state: "failed",
332+error: new Error("network"),
333+updatedAt: 123,
334+});
335+expect(record.state).toBe("failed");
336+expect(record.errorMessage).toBe("network");
337+expect(record.updatedAt).toBe(123);
357338});
358339});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。