

























@@ -9,6 +9,7 @@ const openUrlMock = vi.hoisted(() => vi.fn());
99const formatControlUiSshHintMock = vi.hoisted(() => vi.fn());
1010const copyToClipboardMock = vi.hoisted(() => vi.fn());
1111const resolveSecretRefValuesMock = vi.hoisted(() => vi.fn());
12+const ensureGatewayReadyForOperationMock = vi.hoisted(() => vi.fn());
12131314vi.mock("../config/config.js", () => ({
1415readConfigFileSnapshot: readConfigFileSnapshotMock,
@@ -26,6 +27,10 @@ vi.mock("../infra/clipboard.js", () => ({
2627copyToClipboard: copyToClipboardMock,
2728}));
282930+vi.mock("./gateway-readiness.js", () => ({
31+ensureGatewayReadyForOperation: ensureGatewayReadyForOperationMock,
32+}));
33+2934vi.mock("../secrets/resolve.js", () => ({
3035resolveSecretRefValues: resolveSecretRefValuesMock,
3136}));
@@ -83,6 +88,12 @@ describe("dashboardCommand", () => {
8388openUrlMock.mockClear();
8489formatControlUiSshHintMock.mockClear();
8590copyToClipboardMock.mockClear();
91+ensureGatewayReadyForOperationMock.mockReset();
92+ensureGatewayReadyForOperationMock.mockResolvedValue({
93+ready: true,
94+status: {},
95+recovered: false,
96+});
8697delete process.env.OPENCLAW_GATEWAY_TOKEN;
8798delete process.env.CUSTOM_GATEWAY_TOKEN;
8899});
@@ -95,6 +106,13 @@ describe("dashboardCommand", () => {
9510696107await dashboardCommand(runtime);
97108109+expect(ensureGatewayReadyForOperationMock).toHaveBeenCalledWith({
110+ runtime,
111+operation: "open the dashboard",
112+yes: undefined,
113+probeUrl: "ws://127.0.0.1:18789",
114+readyWhenReachable: true,
115+});
98116expect(resolveControlUiLinksMock).toHaveBeenCalledWith({
99117port: 18789,
100118bind: "loopback",
@@ -291,4 +309,20 @@ describe("dashboardCommand", () => {
291309);
292310expectNoLogWith("Token auto-auth is disabled for SecretRef-managed");
293311});
312+313+it("does not copy or open when gateway readiness fails", async () => {
314+mockSnapshot("abc");
315+ensureGatewayReadyForOperationMock.mockResolvedValueOnce({
316+ready: false,
317+status: {},
318+reason: "Gateway is not running.",
319+recoverable: true,
320+});
321+322+await dashboardCommand(runtime);
323+324+expect(readConfigFileSnapshotMock).toHaveBeenCalledTimes(1);
325+expect(copyToClipboardMock).not.toHaveBeenCalled();
326+expect(openUrlMock).not.toHaveBeenCalled();
327+});
294328});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。