




























1+import { spawnSync } from "node:child_process";
2+import { mkdtempSync, readFileSync, rmSync } from "node:fs";
3+import { tmpdir } from "node:os";
4+import path from "node:path";
5+import { describe, expect, it } from "vitest";
6+7+const fixturePath = path.resolve("scripts/e2e/lib/fixture.mjs");
8+9+function makeTempRoot(): string {
10+return mkdtempSync(path.join(tmpdir(), "openclaw-fixture-config-"));
11+}
12+13+function runFixture(
14+root: string,
15+command: string,
16+args: string[] = [],
17+env: Record<string, string> = {},
18+) {
19+return spawnSync(process.execPath, [fixturePath, command, ...args], {
20+encoding: "utf8",
21+env: {
22+ ...process.env,
23+OPENCLAW_CONFIG_BATCH_PATH: path.join(root, "batch.json"),
24+OPENCLAW_CONFIG_PATH: path.join(root, "openclaw.json"),
25+OPENCLAW_GATEWAY_TOKEN: "test-token",
26+OPENCLAW_OPENWEBUI_MODEL: "openai/gpt-5.4-mini",
27+OPENCLAW_STATE_DIR: root,
28+ ...env,
29+},
30+});
31+}
32+33+describe("scripts/e2e/lib/fixture.mjs config commands", () => {
34+it("rejects loose gateway port env values instead of parsing prefixes", () => {
35+const root = makeTempRoot();
36+try {
37+const result = runFixture(root, "config-reload", [], { PORT: "18789tcp" });
38+39+expect(result.status).not.toBe(0);
40+expect(result.stderr).toContain("invalid PORT: 18789tcp");
41+} finally {
42+rmSync(root, { recursive: true, force: true });
43+}
44+});
45+46+it("writes strict positive browser CDP ports into generated config", () => {
47+const root = makeTempRoot();
48+try {
49+const result = runFixture(root, "browser-cdp", [], { CDP_PORT: "19223", PORT: "19000" });
50+51+expect(result.status).toBe(0);
52+const config = JSON.parse(readFileSync(path.join(root, "openclaw.json"), "utf8"));
53+expect(config.gateway.port).toBe(19000);
54+expect(config.browser.profiles["docker-cdp"].cdpUrl).toBe("http://127.0.0.1:19223");
55+} finally {
56+rmSync(root, { recursive: true, force: true });
57+}
58+});
59+60+it("rejects loose browser CDP port env values", () => {
61+const root = makeTempRoot();
62+try {
63+const result = runFixture(root, "browser-cdp", [], { CDP_PORT: "19222http" });
64+65+expect(result.status).not.toBe(0);
66+expect(result.stderr).toContain("invalid CDP_PORT: 19222http");
67+} finally {
68+rmSync(root, { recursive: true, force: true });
69+}
70+});
71+72+it("rejects loose Open WebUI provider timeout values", () => {
73+const root = makeTempRoot();
74+try {
75+const result = runFixture(root, "openwebui-config", ["test-key"], {
76+OPENCLAW_OPENWEBUI_PROVIDER_TIMEOUT_SECONDS: "300s",
77+});
78+79+expect(result.status).not.toBe(0);
80+expect(result.stderr).toContain("invalid OPENCLAW_OPENWEBUI_PROVIDER_TIMEOUT_SECONDS: 300s");
81+} finally {
82+rmSync(root, { recursive: true, force: true });
83+}
84+});
85+86+it("writes strict positive Open WebUI provider timeouts into generated config", () => {
87+const root = makeTempRoot();
88+try {
89+const result = runFixture(root, "openwebui-config", ["test-key"], {
90+OPENCLAW_OPENWEBUI_PROVIDER_TIMEOUT_SECONDS: "300",
91+});
92+93+expect(result.status).toBe(0);
94+const batch = JSON.parse(readFileSync(path.join(root, "batch.json"), "utf8"));
95+expect(
96+batch.find(
97+(entry: { path: string }) => entry.path === "models.providers.openai.timeoutSeconds",
98+)?.value,
99+).toBe(300);
100+} finally {
101+rmSync(root, { recursive: true, force: true });
102+}
103+});
104+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。