





















@@ -0,0 +1,127 @@
1+import { beforeEach, describe, expect, it, vi } from "vitest";
2+3+const diagnosticMocks = vi.hoisted(() => ({
4+logMessageProcessed: vi.fn(),
5+logMessageQueued: vi.fn(),
6+logSessionStateChange: vi.fn(),
7+}));
8+9+vi.mock("./diagnostic.js", () => ({
10+logMessageProcessed: diagnosticMocks.logMessageProcessed,
11+logMessageQueued: diagnosticMocks.logMessageQueued,
12+logSessionStateChange: diagnosticMocks.logSessionStateChange,
13+}));
14+15+import { createDiagnosticMessageLifecycle } from "./message-lifecycle.js";
16+17+describe("createDiagnosticMessageLifecycle", () => {
18+beforeEach(() => {
19+diagnosticMocks.logMessageProcessed.mockReset();
20+diagnosticMocks.logMessageQueued.mockReset();
21+diagnosticMocks.logSessionStateChange.mockReset();
22+});
23+24+it("emits queued, state, and processed events through one lifecycle", () => {
25+const lifecycle = createDiagnosticMessageLifecycle({
26+enabled: true,
27+channel: "cron",
28+source: "cron-isolated",
29+sessionId: "initial-session",
30+sessionKey: "cron:job",
31+trackSessionState: true,
32+});
33+34+lifecycle.markProcessing();
35+lifecycle.markIdle(undefined, { sessionId: "final-session" });
36+lifecycle.markProcessed("completed", {
37+sessionId: "final-session",
38+durationMs: 42,
39+});
40+41+expect(diagnosticMocks.logMessageQueued).toHaveBeenCalledWith({
42+sessionId: "initial-session",
43+sessionKey: "cron:job",
44+channel: "cron",
45+source: "cron-isolated",
46+});
47+expect(diagnosticMocks.logSessionStateChange.mock.calls).toEqual([
48+[
49+{
50+sessionId: "initial-session",
51+sessionKey: "cron:job",
52+state: "processing",
53+reason: undefined,
54+},
55+],
56+[
57+{
58+sessionId: "final-session",
59+sessionKey: "cron:job",
60+state: "idle",
61+reason: undefined,
62+},
63+],
64+]);
65+expect(diagnosticMocks.logMessageProcessed).toHaveBeenCalledWith({
66+channel: "cron",
67+chatId: undefined,
68+messageId: undefined,
69+sessionId: "final-session",
70+sessionKey: "cron:job",
71+durationMs: 42,
72+outcome: "completed",
73+reason: undefined,
74+error: undefined,
75+});
76+});
77+78+it("keeps processed events independent of session-state tracking", () => {
79+const lifecycle = createDiagnosticMessageLifecycle({
80+enabled: true,
81+channel: "whatsapp",
82+source: "dispatch",
83+chatId: "chat-1",
84+messageId: "msg-1",
85+trackSessionState: false,
86+});
87+88+lifecycle.markProcessing();
89+lifecycle.markIdle("message_completed");
90+lifecycle.markProcessed("skipped", {
91+durationMs: 7,
92+reason: "duplicate",
93+});
94+95+expect(diagnosticMocks.logMessageQueued).not.toHaveBeenCalled();
96+expect(diagnosticMocks.logSessionStateChange).not.toHaveBeenCalled();
97+expect(diagnosticMocks.logMessageProcessed).toHaveBeenCalledWith({
98+channel: "whatsapp",
99+chatId: "chat-1",
100+messageId: "msg-1",
101+sessionId: undefined,
102+sessionKey: undefined,
103+durationMs: 7,
104+outcome: "skipped",
105+reason: "duplicate",
106+error: undefined,
107+});
108+});
109+110+it("emits nothing when disabled", () => {
111+const lifecycle = createDiagnosticMessageLifecycle({
112+enabled: false,
113+channel: "slack",
114+source: "dispatch",
115+sessionKey: "agent:main",
116+trackSessionState: true,
117+});
118+119+lifecycle.markProcessing();
120+lifecycle.markIdle("message_completed");
121+lifecycle.markProcessed("completed", { durationMs: 1 });
122+123+expect(diagnosticMocks.logMessageQueued).not.toHaveBeenCalled();
124+expect(diagnosticMocks.logSessionStateChange).not.toHaveBeenCalled();
125+expect(diagnosticMocks.logMessageProcessed).not.toHaveBeenCalled();
126+});
127+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。