|
| 1 | +import { spawnSync } from "node:child_process"; |
| 2 | +import { describe, expect, it } from "vitest"; |
| 3 | + |
| 4 | +const mockOpenAiPath = "scripts/e2e/mock-openai-server.mjs"; |
| 5 | +const webSearchMockPath = "scripts/e2e/lib/openai-web-search-minimal/mock-server.mjs"; |
| 6 | +const configReloadAssertPath = "scripts/e2e/lib/config-reload/assert-log.mjs"; |
| 7 | +const scrubbedEnvKeys = [ |
| 8 | +"MOCK_PORT", |
| 9 | +"MOCK_REQUEST_LOG", |
| 10 | +"OPENCLAW_CONFIG_RELOAD_LOG_MAX_READ_BYTES", |
| 11 | +"OPENCLAW_CONFIG_RELOAD_LOG_PATH", |
| 12 | +"OPENCLAW_CONFIG_RELOAD_LOG_TIMEOUT_MS", |
| 13 | +"OPENCLAW_MOCK_OPENAI_PORT", |
| 14 | +"RAW_SCHEMA_ERROR", |
| 15 | +"SUCCESS_MARKER", |
| 16 | +]; |
| 17 | + |
| 18 | +function runScript(scriptPath: string, env: Record<string, string>) { |
| 19 | +const childEnv = { ...process.env }; |
| 20 | +for (const key of scrubbedEnvKeys) { |
| 21 | +delete childEnv[key]; |
| 22 | +} |
| 23 | +return spawnSync(process.execPath, [scriptPath], { |
| 24 | +encoding: "utf8", |
| 25 | +env: { ...childEnv, ...env }, |
| 26 | +killSignal: "SIGKILL", |
| 27 | +timeout: 3_000, |
| 28 | +}); |
| 29 | +} |
| 30 | + |
| 31 | +describe("e2e mock and config helper numeric limits", () => { |
| 32 | +it("rejects loose mock OpenAI port env values", () => { |
| 33 | +const mockPort = runScript(mockOpenAiPath, { MOCK_PORT: "44080tcp" }); |
| 34 | +expect(mockPort.status).not.toBe(0); |
| 35 | +expect(mockPort.stderr).toContain("invalid MOCK_PORT: 44080tcp"); |
| 36 | + |
| 37 | +const fallbackPort = runScript(mockOpenAiPath, { |
| 38 | +OPENCLAW_MOCK_OPENAI_PORT: "44080http", |
| 39 | +}); |
| 40 | +expect(fallbackPort.status).not.toBe(0); |
| 41 | +expect(fallbackPort.stderr).toContain("invalid OPENCLAW_MOCK_OPENAI_PORT: 44080http"); |
| 42 | +}); |
| 43 | + |
| 44 | +it("rejects loose OpenAI web-search mock port env values", () => { |
| 45 | +const result = runScript(webSearchMockPath, { MOCK_PORT: "80http" }); |
| 46 | + |
| 47 | +expect(result.status).not.toBe(0); |
| 48 | +expect(result.stderr).toContain("invalid MOCK_PORT: 80http"); |
| 49 | +}); |
| 50 | + |
| 51 | +it("rejects loose config-reload log timeout env values", () => { |
| 52 | +const result = runScript(configReloadAssertPath, { |
| 53 | +OPENCLAW_CONFIG_RELOAD_LOG_TIMEOUT_MS: "30000ms", |
| 54 | +}); |
| 55 | + |
| 56 | +expect(result.status).not.toBe(0); |
| 57 | +expect(result.stderr).toContain("invalid OPENCLAW_CONFIG_RELOAD_LOG_TIMEOUT_MS: 30000ms"); |
| 58 | +}); |
| 59 | + |
| 60 | +it("rejects loose config-reload log read caps", () => { |
| 61 | +const result = runScript(configReloadAssertPath, { |
| 62 | +OPENCLAW_CONFIG_RELOAD_LOG_MAX_READ_BYTES: "256kb", |
| 63 | +}); |
| 64 | + |
| 65 | +expect(result.status).not.toBe(0); |
| 66 | +expect(result.stderr).toContain("invalid OPENCLAW_CONFIG_RELOAD_LOG_MAX_READ_BYTES: 256kb"); |
| 67 | +}); |
| 68 | +}); |