@flrande/browserctl 0.5.0-dev.22.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +34 -0
- package/dist/client.js +138 -0
- package/dist/commandRegistry.d.ts +16 -0
- package/dist/commandRegistry.js +21 -0
- package/dist/help.d.ts +4 -0
- package/dist/help.js +24 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +23 -0
- package/dist/runCli.d.ts +5 -0
- package/dist/runCli.js +170 -0
- package/package.json +32 -59
- package/INSTALL-CN.md +0 -92
- package/INSTALL.md +0 -92
- package/LICENSE +0 -21
- package/README-CN.md +0 -69
- package/README.md +0 -69
- package/apps/browserctl/src/commands/a11y-snapshot.ts +0 -20
- package/apps/browserctl/src/commands/act.test.ts +0 -71
- package/apps/browserctl/src/commands/act.ts +0 -64
- package/apps/browserctl/src/commands/command-wrappers.test.ts +0 -688
- package/apps/browserctl/src/commands/common.test.ts +0 -87
- package/apps/browserctl/src/commands/common.ts +0 -191
- package/apps/browserctl/src/commands/console-list.test.ts +0 -102
- package/apps/browserctl/src/commands/console-list.ts +0 -108
- package/apps/browserctl/src/commands/cookie-clear.ts +0 -18
- package/apps/browserctl/src/commands/cookie-get.ts +0 -18
- package/apps/browserctl/src/commands/cookie-set.ts +0 -22
- package/apps/browserctl/src/commands/dialog-arm.ts +0 -20
- package/apps/browserctl/src/commands/dom-query-all.ts +0 -18
- package/apps/browserctl/src/commands/dom-query.ts +0 -18
- package/apps/browserctl/src/commands/download-trigger.ts +0 -22
- package/apps/browserctl/src/commands/download-wait.test.ts +0 -67
- package/apps/browserctl/src/commands/download-wait.ts +0 -27
- package/apps/browserctl/src/commands/element-screenshot.ts +0 -20
- package/apps/browserctl/src/commands/frame-list.ts +0 -16
- package/apps/browserctl/src/commands/frame-snapshot.ts +0 -18
- package/apps/browserctl/src/commands/har-export.test.ts +0 -112
- package/apps/browserctl/src/commands/har-export.ts +0 -120
- package/apps/browserctl/src/commands/memory-delete.ts +0 -20
- package/apps/browserctl/src/commands/memory-inspect.ts +0 -20
- package/apps/browserctl/src/commands/memory-list.ts +0 -90
- package/apps/browserctl/src/commands/memory-mode-set.ts +0 -29
- package/apps/browserctl/src/commands/memory-purge.ts +0 -16
- package/apps/browserctl/src/commands/memory-resolve.ts +0 -56
- package/apps/browserctl/src/commands/memory-status.ts +0 -16
- package/apps/browserctl/src/commands/memory-ttl-set.ts +0 -28
- package/apps/browserctl/src/commands/memory-upsert.ts +0 -142
- package/apps/browserctl/src/commands/network-list.test.ts +0 -110
- package/apps/browserctl/src/commands/network-list.ts +0 -112
- package/apps/browserctl/src/commands/network-wait-for.test.ts +0 -90
- package/apps/browserctl/src/commands/network-wait-for.ts +0 -100
- package/apps/browserctl/src/commands/profile-list.ts +0 -16
- package/apps/browserctl/src/commands/profile-use.ts +0 -18
- package/apps/browserctl/src/commands/response-body.ts +0 -24
- package/apps/browserctl/src/commands/screenshot.ts +0 -16
- package/apps/browserctl/src/commands/session-drop.test.ts +0 -36
- package/apps/browserctl/src/commands/session-drop.ts +0 -16
- package/apps/browserctl/src/commands/session-list.test.ts +0 -81
- package/apps/browserctl/src/commands/session-list.ts +0 -70
- package/apps/browserctl/src/commands/snapshot.ts +0 -16
- package/apps/browserctl/src/commands/status.ts +0 -10
- package/apps/browserctl/src/commands/storage-get.ts +0 -20
- package/apps/browserctl/src/commands/storage-set.ts +0 -22
- package/apps/browserctl/src/commands/tab-close.ts +0 -20
- package/apps/browserctl/src/commands/tab-focus.ts +0 -20
- package/apps/browserctl/src/commands/tab-open.ts +0 -19
- package/apps/browserctl/src/commands/tabs.ts +0 -13
- package/apps/browserctl/src/commands/trace-get.test.ts +0 -61
- package/apps/browserctl/src/commands/trace-get.ts +0 -62
- package/apps/browserctl/src/commands/upload-arm.ts +0 -26
- package/apps/browserctl/src/commands/wait-element.test.ts +0 -80
- package/apps/browserctl/src/commands/wait-element.ts +0 -76
- package/apps/browserctl/src/commands/wait-text.test.ts +0 -110
- package/apps/browserctl/src/commands/wait-text.ts +0 -93
- package/apps/browserctl/src/commands/wait-url.test.ts +0 -80
- package/apps/browserctl/src/commands/wait-url.ts +0 -76
- package/apps/browserctl/src/daemon-client.test.ts +0 -512
- package/apps/browserctl/src/daemon-client.ts +0 -632
- package/apps/browserctl/src/e2e.test.ts +0 -103
- package/apps/browserctl/src/main.dispatch.test.ts +0 -461
- package/apps/browserctl/src/main.test.ts +0 -334
- package/apps/browserctl/src/main.ts +0 -957
- package/apps/browserctl/src/smoke.e2e.test.ts +0 -97
- package/apps/browserctl/src/test-port.ts +0 -26
- package/apps/browserd/src/bootstrap.ts +0 -432
- package/apps/browserd/src/chrome-relay-extension-bridge.test.ts +0 -250
- package/apps/browserd/src/chrome-relay-extension-bridge.ts +0 -506
- package/apps/browserd/src/container.ts +0 -3088
- package/apps/browserd/src/main.test.ts +0 -1522
- package/apps/browserd/src/main.ts +0 -7
- package/apps/browserd/src/test-port.ts +0 -26
- package/apps/browserd/src/tool-matrix.test.ts +0 -887
- package/bin/browserctl.cjs +0 -21
- package/bin/browserd.cjs +0 -21
- package/extensions/chrome-relay/README-CN.md +0 -39
- package/extensions/chrome-relay/README.md +0 -39
- package/extensions/chrome-relay/background.js +0 -1687
- package/extensions/chrome-relay/manifest.json +0 -15
- package/extensions/chrome-relay/popup.html +0 -369
- package/extensions/chrome-relay/popup.js +0 -972
- package/packages/core/src/bootstrap.test.ts +0 -10
- package/packages/core/src/driver-registry.test.ts +0 -45
- package/packages/core/src/driver-registry.ts +0 -22
- package/packages/core/src/driver.ts +0 -47
- package/packages/core/src/index.ts +0 -6
- package/packages/core/src/navigation-memory.test.ts +0 -259
- package/packages/core/src/navigation-memory.ts +0 -360
- package/packages/core/src/ref-cache.test.ts +0 -61
- package/packages/core/src/ref-cache.ts +0 -28
- package/packages/core/src/session-store.test.ts +0 -82
- package/packages/core/src/session-store.ts +0 -138
- package/packages/core/src/types.ts +0 -9
- package/packages/driver-chrome-relay/src/chrome-relay-driver.test.ts +0 -744
- package/packages/driver-chrome-relay/src/chrome-relay-driver.ts +0 -2429
- package/packages/driver-chrome-relay/src/chrome-relay-extension-runtime.test.ts +0 -264
- package/packages/driver-chrome-relay/src/chrome-relay-extension-runtime.ts +0 -521
- package/packages/driver-chrome-relay/src/index.ts +0 -26
- package/packages/driver-managed/src/index.ts +0 -22
- package/packages/driver-managed/src/managed-driver.test.ts +0 -183
- package/packages/driver-managed/src/managed-driver.ts +0 -341
- package/packages/driver-managed/src/managed-local-driver.test.ts +0 -608
- package/packages/driver-managed/src/managed-local-driver.ts +0 -2243
- package/packages/driver-remote-cdp/src/index.ts +0 -19
- package/packages/driver-remote-cdp/src/remote-cdp-driver.test.ts +0 -727
- package/packages/driver-remote-cdp/src/remote-cdp-driver.ts +0 -2264
- package/packages/protocol/src/envelope.test.ts +0 -25
- package/packages/protocol/src/envelope.ts +0 -31
- package/packages/protocol/src/errors.test.ts +0 -17
- package/packages/protocol/src/errors.ts +0 -11
- package/packages/protocol/src/index.ts +0 -3
- package/packages/protocol/src/tools.ts +0 -3
- package/packages/transport-mcp-stdio/src/index.ts +0 -3
- package/packages/transport-mcp-stdio/src/sdk-server.ts +0 -139
- package/packages/transport-mcp-stdio/src/server.test.ts +0 -281
- package/packages/transport-mcp-stdio/src/server.ts +0 -183
- package/packages/transport-mcp-stdio/src/tool-map.ts +0 -84
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
|
|
3
|
-
import * as actCommand from "./commands/act";
|
|
4
|
-
import * as daemonClient from "./daemon-client";
|
|
5
|
-
import * as screenshotCommand from "./commands/screenshot";
|
|
6
|
-
import * as statusCommand from "./commands/status";
|
|
7
|
-
import * as tabsCommand from "./commands/tabs";
|
|
8
|
-
import { EXIT_CODES, parseArgs, runCli } from "./main";
|
|
9
|
-
|
|
10
|
-
function createIoCapture() {
|
|
11
|
-
const state = {
|
|
12
|
-
stdout: "",
|
|
13
|
-
stderr: ""
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
return {
|
|
17
|
-
state,
|
|
18
|
-
io: {
|
|
19
|
-
stdout: {
|
|
20
|
-
write(content: string) {
|
|
21
|
-
state.stdout += content;
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
stderr: {
|
|
25
|
-
write(content: string) {
|
|
26
|
-
state.stderr += content;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
afterEach(() => {
|
|
34
|
-
vi.restoreAllMocks();
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
describe("cli", () => {
|
|
38
|
-
it("parses status command", () => {
|
|
39
|
-
expect(parseArgs(["status"]).command).toBe("status");
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it("treats removed template command as unknown", () => {
|
|
43
|
-
expect(parseArgs(["template-run"]).error).toBe("Unknown command: template-run");
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it("parses memory-status command", () => {
|
|
47
|
-
expect(parseArgs(["memory-status"]).command).toBe("memory-status");
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it("parses memory-mode-set command", () => {
|
|
51
|
-
expect(parseArgs(["memory-mode-set", "ask"]).command).toBe("memory-mode-set");
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it("parses memory-resolve command", () => {
|
|
55
|
-
expect(parseArgs(["memory-resolve", "forum.example", "open_profile"]).command).toBe("memory-resolve");
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it("preserves unknown flags and '--' separator as command args", () => {
|
|
59
|
-
expect(parseArgs(["status", "--profile", "default", "--", "--raw"])).toEqual({
|
|
60
|
-
command: "status",
|
|
61
|
-
commandArgs: ["--profile", "default", "--", "--raw"],
|
|
62
|
-
json: false
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it("consumes --json globally while preserving command args", () => {
|
|
67
|
-
expect(parseArgs(["--json", "tabs", "--verbose"])).toEqual({
|
|
68
|
-
command: "tabs",
|
|
69
|
-
commandArgs: ["--verbose"],
|
|
70
|
-
json: true
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it("parses --help as a global help request", () => {
|
|
75
|
-
expect(parseArgs(["--help"])).toEqual({
|
|
76
|
-
command: null,
|
|
77
|
-
commandArgs: [],
|
|
78
|
-
json: false,
|
|
79
|
-
helpTopic: "all"
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it("parses -h as a global help request", () => {
|
|
84
|
-
expect(parseArgs(["-h"])).toEqual({
|
|
85
|
-
command: null,
|
|
86
|
-
commandArgs: [],
|
|
87
|
-
json: false,
|
|
88
|
-
helpTopic: "all"
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it("parses command --help as command help request", () => {
|
|
93
|
-
expect(parseArgs(["status", "--help"])).toEqual({
|
|
94
|
-
command: null,
|
|
95
|
-
commandArgs: [],
|
|
96
|
-
json: false,
|
|
97
|
-
helpTopic: "status"
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it("writes JSON output on successful run", async () => {
|
|
102
|
-
vi.spyOn(statusCommand, "runStatusCommand").mockResolvedValue({
|
|
103
|
-
kind: "browserd",
|
|
104
|
-
ready: true
|
|
105
|
-
});
|
|
106
|
-
const { io, state } = createIoCapture();
|
|
107
|
-
|
|
108
|
-
const exitCode = await runCli(["status", "--json"], io);
|
|
109
|
-
|
|
110
|
-
expect(exitCode).toBe(EXIT_CODES.OK);
|
|
111
|
-
expect(state.stderr).toBe("");
|
|
112
|
-
expect(JSON.parse(state.stdout)).toEqual({
|
|
113
|
-
ok: true,
|
|
114
|
-
command: "status",
|
|
115
|
-
data: {
|
|
116
|
-
kind: "browserd",
|
|
117
|
-
ready: true
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it("returns INVALID_ARGS for unknown command", async () => {
|
|
123
|
-
const { io, state } = createIoCapture();
|
|
124
|
-
|
|
125
|
-
const exitCode = await runCli(["unknown"], io);
|
|
126
|
-
|
|
127
|
-
expect(exitCode).toBe(EXIT_CODES.INVALID_ARGS);
|
|
128
|
-
expect(state.stdout).toBe("");
|
|
129
|
-
expect(state.stderr).toContain("Unknown command: unknown");
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it("writes general help output for --help", async () => {
|
|
133
|
-
const { io, state } = createIoCapture();
|
|
134
|
-
|
|
135
|
-
const exitCode = await runCli(["--help"], io);
|
|
136
|
-
|
|
137
|
-
expect(exitCode).toBe(EXIT_CODES.OK);
|
|
138
|
-
expect(state.stderr).toBe("");
|
|
139
|
-
expect(state.stdout).toContain("Usage:");
|
|
140
|
-
expect(state.stdout).toContain("browserctl help [command]");
|
|
141
|
-
expect(state.stdout).toContain("session-list [--tenant <tenant>] [--limit <n>]");
|
|
142
|
-
expect(state.stdout).toContain("memory-status");
|
|
143
|
-
expect(state.stdout).toContain("memory-mode-set <mode>");
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
it("writes JSON help output when --json is provided", async () => {
|
|
147
|
-
const { io, state } = createIoCapture();
|
|
148
|
-
|
|
149
|
-
const exitCode = await runCli(["--json", "--help"], io);
|
|
150
|
-
|
|
151
|
-
expect(exitCode).toBe(EXIT_CODES.OK);
|
|
152
|
-
expect(state.stderr).toBe("");
|
|
153
|
-
expect(JSON.parse(state.stdout)).toEqual(
|
|
154
|
-
expect.objectContaining({
|
|
155
|
-
ok: true,
|
|
156
|
-
command: "help",
|
|
157
|
-
data: expect.objectContaining({
|
|
158
|
-
topic: "all",
|
|
159
|
-
text: expect.stringContaining("Usage:")
|
|
160
|
-
})
|
|
161
|
-
})
|
|
162
|
-
);
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it("writes command help output for help <command>", async () => {
|
|
166
|
-
const { io, state } = createIoCapture();
|
|
167
|
-
|
|
168
|
-
const exitCode = await runCli(["help", "status"], io);
|
|
169
|
-
|
|
170
|
-
expect(exitCode).toBe(EXIT_CODES.OK);
|
|
171
|
-
expect(state.stderr).toBe("");
|
|
172
|
-
expect(state.stdout).toContain("Usage:");
|
|
173
|
-
expect(state.stdout).toContain("browserctl status");
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
it("writes command help output for <command> --help", async () => {
|
|
177
|
-
const { io, state } = createIoCapture();
|
|
178
|
-
|
|
179
|
-
const exitCode = await runCli(["tab-open", "--help"], io);
|
|
180
|
-
|
|
181
|
-
expect(exitCode).toBe(EXIT_CODES.OK);
|
|
182
|
-
expect(state.stderr).toBe("");
|
|
183
|
-
expect(state.stdout).toContain("Usage:");
|
|
184
|
-
expect(state.stdout).toContain("browserctl tab-open <url>");
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
it("shows payload option in act command help", async () => {
|
|
188
|
-
const { io, state } = createIoCapture();
|
|
189
|
-
|
|
190
|
-
const exitCode = await runCli(["help", "act"], io);
|
|
191
|
-
|
|
192
|
-
expect(exitCode).toBe(EXIT_CODES.OK);
|
|
193
|
-
expect(state.stderr).toBe("");
|
|
194
|
-
expect(state.stdout).toContain("browserctl act <actionType> <targetId> [--payload-json <json>]");
|
|
195
|
-
expect(state.stdout).toContain("--payload-json <json>");
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it("returns INVALID_ARGS for unknown help topic", async () => {
|
|
199
|
-
const { io, state } = createIoCapture();
|
|
200
|
-
|
|
201
|
-
const exitCode = await runCli(["help", "unknown"], io);
|
|
202
|
-
|
|
203
|
-
expect(exitCode).toBe(EXIT_CODES.INVALID_ARGS);
|
|
204
|
-
expect(state.stdout).toBe("");
|
|
205
|
-
expect(state.stderr).toContain("Unknown help topic: unknown");
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
it("writes non-JSON output when --json is not provided", async () => {
|
|
209
|
-
vi.spyOn(tabsCommand, "runTabsCommand").mockResolvedValue({
|
|
210
|
-
driver: "managed",
|
|
211
|
-
tabs: ["target:1"]
|
|
212
|
-
});
|
|
213
|
-
const { io, state } = createIoCapture();
|
|
214
|
-
|
|
215
|
-
const exitCode = await runCli(["tabs"], io);
|
|
216
|
-
|
|
217
|
-
expect(exitCode).toBe(EXIT_CODES.OK);
|
|
218
|
-
expect(state.stderr).toBe("");
|
|
219
|
-
expect(state.stdout).toMatch(/^tabs: /);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
it("dispatches to act command handler with forwarded args", async () => {
|
|
223
|
-
const actSpy = vi.spyOn(actCommand, "runActCommand").mockResolvedValue({
|
|
224
|
-
ok: true
|
|
225
|
-
});
|
|
226
|
-
const { io } = createIoCapture();
|
|
227
|
-
|
|
228
|
-
const exitCode = await runCli(["act", "click", "tab:42"], io);
|
|
229
|
-
|
|
230
|
-
expect(exitCode).toBe(EXIT_CODES.OK);
|
|
231
|
-
expect(actSpy).toHaveBeenCalledTimes(1);
|
|
232
|
-
expect(actSpy).toHaveBeenCalledWith(["click", "tab:42"]);
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
it("dispatches to screenshot command handler with forwarded args", async () => {
|
|
236
|
-
const screenshotSpy = vi.spyOn(screenshotCommand, "runScreenshotCommand").mockResolvedValue({
|
|
237
|
-
ok: true
|
|
238
|
-
});
|
|
239
|
-
const { io } = createIoCapture();
|
|
240
|
-
|
|
241
|
-
const exitCode = await runCli(["screenshot", "tab:42"], io);
|
|
242
|
-
|
|
243
|
-
expect(exitCode).toBe(EXIT_CODES.OK);
|
|
244
|
-
expect(screenshotSpy).toHaveBeenCalledTimes(1);
|
|
245
|
-
expect(screenshotSpy).toHaveBeenCalledWith(["tab:42"]);
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
it("dispatches to status command handler", async () => {
|
|
249
|
-
const statusSpy = vi.spyOn(statusCommand, "runStatusCommand").mockResolvedValue({
|
|
250
|
-
kind: "browserd",
|
|
251
|
-
ready: true
|
|
252
|
-
});
|
|
253
|
-
const { io } = createIoCapture();
|
|
254
|
-
|
|
255
|
-
const exitCode = await runCli(["status", "--json"], io);
|
|
256
|
-
|
|
257
|
-
expect(exitCode).toBe(EXIT_CODES.OK);
|
|
258
|
-
expect(statusSpy).toHaveBeenCalledTimes(1);
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
it("dispatches daemon-status through daemon client", async () => {
|
|
262
|
-
const daemonStatusSpy = vi.spyOn(daemonClient, "getDaemonStatus").mockResolvedValue({
|
|
263
|
-
running: true,
|
|
264
|
-
port: 41337,
|
|
265
|
-
pid: 12345
|
|
266
|
-
});
|
|
267
|
-
const { io, state } = createIoCapture();
|
|
268
|
-
|
|
269
|
-
const exitCode = await runCli(["daemon-status", "--json"], io);
|
|
270
|
-
|
|
271
|
-
expect(exitCode).toBe(EXIT_CODES.OK);
|
|
272
|
-
expect(daemonStatusSpy).toHaveBeenCalledTimes(1);
|
|
273
|
-
expect(JSON.parse(state.stdout)).toEqual({
|
|
274
|
-
ok: true,
|
|
275
|
-
command: "daemon-status",
|
|
276
|
-
data: {
|
|
277
|
-
running: true,
|
|
278
|
-
port: 41337,
|
|
279
|
-
pid: 12345
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
it("forwards --browser preset to daemon-start", async () => {
|
|
285
|
-
const daemonStartSpy = vi.spyOn(daemonClient, "ensureDaemonRunning").mockResolvedValue({
|
|
286
|
-
running: true,
|
|
287
|
-
port: 41337,
|
|
288
|
-
pid: 12345
|
|
289
|
-
});
|
|
290
|
-
const { io } = createIoCapture();
|
|
291
|
-
|
|
292
|
-
const exitCode = await runCli(["daemon-start", "--json", "--browser", "edge"], io);
|
|
293
|
-
|
|
294
|
-
expect(exitCode).toBe(EXIT_CODES.OK);
|
|
295
|
-
expect(daemonStartSpy).toHaveBeenCalledTimes(1);
|
|
296
|
-
expect(daemonStartSpy).toHaveBeenCalledWith({
|
|
297
|
-
authToken: undefined,
|
|
298
|
-
startup: {
|
|
299
|
-
managedLocal: {
|
|
300
|
-
browserName: "chromium",
|
|
301
|
-
channel: "msedge"
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
});
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
it("adds relay setup guidance when chrome-relay connection fails", async () => {
|
|
308
|
-
vi.spyOn(statusCommand, "runStatusCommand").mockRejectedValue(
|
|
309
|
-
new Error("E_INTERNAL: connect ECONNREFUSED 127.0.0.1:9223")
|
|
310
|
-
);
|
|
311
|
-
const { io, state } = createIoCapture();
|
|
312
|
-
|
|
313
|
-
const exitCode = await runCli(["status", "--profile", "chrome-relay"], io);
|
|
314
|
-
|
|
315
|
-
expect(exitCode).toBe(EXIT_CODES.COMMAND_ERROR);
|
|
316
|
-
expect(state.stderr).toContain("chrome-relay 连接失败");
|
|
317
|
-
expect(state.stderr).toContain("扩展");
|
|
318
|
-
expect(state.stderr).toContain("BROWSERD_CHROME_RELAY_URL");
|
|
319
|
-
});
|
|
320
|
-
|
|
321
|
-
it("adds relay setup guidance when extension relay is not connected", async () => {
|
|
322
|
-
vi.spyOn(statusCommand, "runStatusCommand").mockRejectedValue(
|
|
323
|
-
new Error("E_INTERNAL: Chrome relay extension is not connected.")
|
|
324
|
-
);
|
|
325
|
-
const { io, state } = createIoCapture();
|
|
326
|
-
|
|
327
|
-
const exitCode = await runCli(["status", "--profile", "chrome-relay"], io);
|
|
328
|
-
|
|
329
|
-
expect(exitCode).toBe(EXIT_CODES.COMMAND_ERROR);
|
|
330
|
-
expect(state.stderr).toContain("chrome-relay 连接失败");
|
|
331
|
-
expect(state.stderr).toContain("BROWSERD_CHROME_RELAY_MODE=extension");
|
|
332
|
-
expect(state.stderr).toContain("extensions/chrome-relay");
|
|
333
|
-
});
|
|
334
|
-
});
|