
























@@ -9,11 +9,24 @@ const INSTALL_E2E_RUNNER_PATH = "scripts/docker/install-sh-e2e/run.sh";
99const LIVE_CLI_BACKEND_DOCKER_PATH = "scripts/test-live-cli-backend-docker.sh";
1010const LIVE_BUILD_DOCKER_PATH = "scripts/test-live-build-docker.sh";
1111const OPENAI_WEB_SEARCH_MINIMAL_E2E_PATH = "scripts/e2e/openai-web-search-minimal-docker.sh";
12+const OPENAI_WEB_SEARCH_MINIMAL_SCENARIO_PATH =
13+"scripts/e2e/lib/openai-web-search-minimal/scenario.sh";
14+const OPENAI_WEB_SEARCH_MINIMAL_CLIENT_PATH =
15+"scripts/e2e/lib/openai-web-search-minimal/client.mjs";
1216const BUNDLED_PLUGIN_INSTALL_UNINSTALL_E2E_PATH =
1317"scripts/e2e/bundled-plugin-install-uninstall-docker.sh";
18+const BUNDLED_PLUGIN_INSTALL_UNINSTALL_SWEEP_PATH =
19+"scripts/e2e/lib/bundled-plugin-install-uninstall/sweep.sh";
20+const BUNDLED_PLUGIN_INSTALL_UNINSTALL_PROBE_PATH =
21+"scripts/e2e/lib/bundled-plugin-install-uninstall/probe.mjs";
1422const PLUGINS_DOCKER_E2E_PATH = "scripts/e2e/plugins-docker.sh";
23+const PLUGINS_DOCKER_SWEEP_PATH = "scripts/e2e/lib/plugins/sweep.sh";
1524const PLUGIN_UPDATE_DOCKER_E2E_PATH = "scripts/e2e/plugin-update-unchanged-docker.sh";
25+const PLUGIN_UPDATE_SCENARIO_PATH = "scripts/e2e/lib/plugin-update/unchanged-scenario.sh";
26+const PLUGIN_UPDATE_PROBE_PATH = "scripts/e2e/lib/plugin-update/probe.mjs";
1627const DOCTOR_SWITCH_DOCKER_E2E_PATH = "scripts/e2e/doctor-install-switch-docker.sh";
28+const DOCTOR_SWITCH_SCENARIO_PATH = "scripts/e2e/lib/doctor-install-switch/scenario.sh";
29+const PACKAGE_COMPAT_PATH = "scripts/e2e/lib/package-compat.mjs";
1730const UPDATE_CHANNEL_SWITCH_DOCKER_E2E_PATH = "scripts/e2e/update-channel-switch-docker.sh";
1831const CENTRALIZED_BUILD_SCRIPTS = [
1932"scripts/docker/setup.sh",
@@ -109,24 +122,44 @@ describe("docker build helper", () => {
109122110123it("allows plugin update smoke to tolerate config metadata migrations", () => {
111124const runner = readFileSync(PLUGIN_UPDATE_DOCKER_E2E_PATH, "utf8");
112-113-expect(runner).toContain("plugin install record changed unexpectedly");
114-expect(runner).toContain("index.installRecords ?? index.records ?? config.plugins?.installs");
115-expect(runner).toContain("Config changed unexpectedly for modern package");
116-expect(runner).not.toContain("before_hash");
125+const scenario = readFileSync(PLUGIN_UPDATE_SCENARIO_PATH, "utf8");
126+const probe = readFileSync(PLUGIN_UPDATE_PROBE_PATH, "utf8");
127+128+expect(runner).toContain("scripts/e2e/lib/plugin-update/unchanged-scenario.sh");
129+expect(probe).toContain("plugin install record changed unexpectedly");
130+expect(probe).toContain("index.installRecords ?? index.records ?? config.plugins?.installs");
131+expect(scenario).toContain("Config changed unexpectedly for modern package");
132+expect(scenario).not.toContain("before_hash");
117133});
118134119135it("caps package acceptance legacy compatibility at 2026.4.25", () => {
136+const doctorScenario = readFileSync(DOCTOR_SWITCH_SCENARIO_PATH, "utf8");
137+const updateChannel = readFileSync(UPDATE_CHANNEL_SWITCH_DOCKER_E2E_PATH, "utf8");
138+const pluginsSweep = readFileSync(PLUGINS_DOCKER_SWEEP_PATH, "utf8");
139+const pluginUpdateScenario = readFileSync(PLUGIN_UPDATE_SCENARIO_PATH, "utf8");
140+const pluginUpdateProbe = readFileSync(PLUGIN_UPDATE_PROBE_PATH, "utf8");
141+const packageCompat = readFileSync(PACKAGE_COMPAT_PATH, "utf8");
120142const scripts = [
121-readFileSync(DOCTOR_SWITCH_DOCKER_E2E_PATH, "utf8"),
122-readFileSync(UPDATE_CHANNEL_SWITCH_DOCKER_E2E_PATH, "utf8"),
123-readFileSync(PLUGINS_DOCKER_E2E_PATH, "utf8"),
124-readFileSync(PLUGIN_UPDATE_DOCKER_E2E_PATH, "utf8"),
143+doctorScenario,
144+updateChannel,
145+pluginsSweep,
146+pluginUpdateScenario,
147+pluginUpdateProbe,
125148];
126149127-for (const script of scripts) {
128-expect(script).toContain("2026, 4, 25");
129-}
150+expect(readFileSync(DOCTOR_SWITCH_DOCKER_E2E_PATH, "utf8")).toContain(
151+"scripts/e2e/lib/doctor-install-switch/scenario.sh",
152+);
153+expect(readFileSync(PLUGINS_DOCKER_E2E_PATH, "utf8")).toContain(
154+"scripts/e2e/lib/plugins/sweep.sh",
155+);
156+expect(readFileSync(PLUGIN_UPDATE_DOCKER_E2E_PATH, "utf8")).toContain(
157+"scripts/e2e/lib/plugin-update/unchanged-scenario.sh",
158+);
159+expect(packageCompat).toContain("day <= 25");
160+expect(doctorScenario).toContain("scripts/e2e/lib/package-compat.mjs");
161+expect(pluginsSweep).toContain("scripts/e2e/lib/package-compat.mjs");
162+expect(pluginUpdateProbe).toContain("../package-compat.mjs");
130163expect(scripts.join("\n")).toContain("OPENCLAW_PACKAGE_ACCEPTANCE_LEGACY_COMPAT");
131164expect(scripts.join("\n")).toContain(
132165"Package $package_version must support gateway install --wrapper.",
@@ -139,15 +172,18 @@ describe("docker build helper", () => {
139172140173it("keeps bundled plugin install/uninstall sweep chunkable", () => {
141174const runner = readFileSync(BUNDLED_PLUGIN_INSTALL_UNINSTALL_E2E_PATH, "utf8");
175+const sweep = readFileSync(BUNDLED_PLUGIN_INSTALL_UNINSTALL_SWEEP_PATH, "utf8");
176+const probe = readFileSync(BUNDLED_PLUGIN_INSTALL_UNINSTALL_PROBE_PATH, "utf8");
142177143178expect(runner).toContain("OPENCLAW_BUNDLED_PLUGIN_SWEEP_TOTAL");
144179expect(runner).toContain("OPENCLAW_BUNDLED_PLUGIN_SWEEP_INDEX");
145-expect(runner).toContain('"openclaw.plugin.json"');
146-expect(runner).toContain("read -r plugin_id plugin_dir requires_config");
147-expect(runner).toContain('node "$OPENCLAW_ENTRY" plugins install "$plugin_id"');
148-expect(runner).toContain('node "$OPENCLAW_ENTRY" plugins uninstall "$plugin_id" --force');
149-expect(runner).toContain("assert_installed");
150-expect(runner).toContain("assert_uninstalled");
180+expect(runner).toContain("scripts/e2e/lib/bundled-plugin-install-uninstall/sweep.sh");
181+expect(probe).toContain('"openclaw.plugin.json"');
182+expect(sweep).toContain("read -r plugin_id plugin_dir requires_config");
183+expect(sweep).toContain('node "$OPENCLAW_ENTRY" plugins install "$plugin_id"');
184+expect(sweep).toContain('node "$OPENCLAW_ENTRY" plugins uninstall "$plugin_id" --force');
185+expect(sweep).toContain("assert-installed");
186+expect(sweep).toContain("assert-uninstalled");
151187});
152188153189it("passes installer tag env to bash, not curl", () => {
@@ -181,20 +217,26 @@ describe("docker build helper", () => {
181217182218it("keeps OpenAI web search smoke on one gateway agent connection", () => {
183219const runner = readFileSync(OPENAI_WEB_SEARCH_MINIMAL_E2E_PATH, "utf8");
184-185-expect(runner).toContain("const callGateway = await loadCallGateway();");
186-expect(runner).toContain('method: "agent"');
187-expect(runner).toContain("expectFinal: true");
188-expect(runner).toContain('scopes: ["operator.write"]');
189-expect(runner).not.toContain('"agent.wait"');
220+const scenario = readFileSync(OPENAI_WEB_SEARCH_MINIMAL_SCENARIO_PATH, "utf8");
221+const client = readFileSync(OPENAI_WEB_SEARCH_MINIMAL_CLIENT_PATH, "utf8");
222+223+expect(runner).toContain("scripts/e2e/lib/openai-web-search-minimal/scenario.sh");
224+expect(scenario).toContain("scripts/e2e/lib/openai-web-search-minimal/client.mjs");
225+expect(client).toContain("const callGateway = await loadCallGateway();");
226+expect(client).toContain('method: "agent"');
227+expect(client).toContain("expectFinal: true");
228+expect(client).toContain('scopes: ["operator.write"]');
229+expect(client).not.toContain('"agent.wait"');
190230});
191231192232it("keeps ClawHub plugin Docker smoke hermetic by default", () => {
193233const runner = readFileSync(PLUGINS_DOCKER_E2E_PATH, "utf8");
234+const sweep = readFileSync(PLUGINS_DOCKER_SWEEP_PATH, "utf8");
194235195-expect(runner).toContain("start_clawhub_fixture_server()");
196-expect(runner).toContain('OPENCLAW_CLAWHUB_URL="http://127.0.0.1:');
197-expect(runner).toContain("live ClawHub can rate-limit CI");
198-expect(runner).toContain('[[ -z "${OPENCLAW_CLAWHUB_URL:-}" && -z "${CLAWHUB_URL:-}" ]]');
236+expect(runner).toContain("scripts/e2e/lib/plugins/sweep.sh");
237+expect(sweep).toContain("start_clawhub_fixture_server()");
238+expect(sweep).toContain('OPENCLAW_CLAWHUB_URL="http://127.0.0.1:');
239+expect(sweep).toContain("live ClawHub can rate-limit CI");
240+expect(sweep).toContain('[[ -z "${OPENCLAW_CLAWHUB_URL:-}" && -z "${CLAWHUB_URL:-}" ]]');
199241});
200242});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。