






















@@ -0,0 +1,57 @@
1+/* @vitest-environment jsdom */
2+3+import { beforeEach, describe, expect, it, vi } from "vitest";
4+5+const { realtimeTalkCtor, startMock, stopMock } = vi.hoisted(() => ({
6+realtimeTalkCtor: vi.fn(),
7+startMock: vi.fn(),
8+stopMock: vi.fn(),
9+}));
10+11+vi.mock("./chat/realtime-talk.ts", () => ({
12+RealtimeTalkSession: realtimeTalkCtor,
13+}));
14+15+describe("OpenClawApp Talk controls", () => {
16+beforeEach(() => {
17+realtimeTalkCtor.mockReset();
18+startMock.mockReset();
19+stopMock.mockReset();
20+realtimeTalkCtor.mockImplementation(
21+function MockRealtimeTalkSession(this: { start: typeof startMock; stop: typeof stopMock }) {
22+this.start = startMock;
23+this.stop = stopMock;
24+},
25+);
26+startMock.mockResolvedValue(undefined);
27+});
28+29+it("retries Talk immediately when the previous session is already in error state", async () => {
30+const { OpenClawApp } = await import("./app.ts");
31+const app = new OpenClawApp() as unknown as {
32+client: unknown;
33+connected: boolean;
34+realtimeTalkActive: boolean;
35+realtimeTalkStatus: string;
36+realtimeTalkSession: { stop(): void } | null;
37+sessionKey: string;
38+toggleRealtimeTalk(): Promise<void>;
39+};
40+const staleStop = vi.fn();
41+app.client = { request: vi.fn() } as never;
42+app.connected = true;
43+app.sessionKey = "main";
44+app.realtimeTalkActive = true;
45+app.realtimeTalkStatus = "error";
46+app.realtimeTalkSession = { stop: staleStop };
47+48+await app.toggleRealtimeTalk();
49+50+expect(staleStop).toHaveBeenCalledOnce();
51+expect(realtimeTalkCtor).toHaveBeenCalledOnce();
52+expect(startMock).toHaveBeenCalledOnce();
53+expect(stopMock).not.toHaveBeenCalled();
54+expect(app.realtimeTalkStatus).toBe("connecting");
55+expect(app.realtimeTalkSession).not.toBeNull();
56+});
57+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。