🎉 init: 小龙的工作空间

This commit is contained in:
大海
2026-06-06 10:40:48 +08:00
commit a188ee1426
3201 changed files with 231817 additions and 0 deletions
+109
View File
@@ -0,0 +1,109 @@
/**
* PR-A Baseline Test 08: Config Loading
* Verifies: config loads correctly, invalid config is rejected
* Freezes: config loading contract
*/
import { describe, it } from "node:test";
import assert from "node:assert";
import { execSync } from "node:child_process";
import { existsSync, readFileSync, writeFileSync, unlinkSync } from "node:fs";
import { homedir } from "node:os";
import { join } from "node:path";
const CONFIG_PATH = join(homedir(), ".openclaw", "openclaw.json");
const TEMP_INVALID_CONFIG = join(homedir(), ".openclaw", "openclaw-invalid-test.json");
describe("test-08: Config Loading Baseline", () => {
it("08.01 - config file exists and is valid JSON", () => {
assert.ok(existsSync(CONFIG_PATH), "openclaw.json must exist");
const content = readFileSync(CONFIG_PATH, "utf8");
let parsed;
try {
parsed = JSON.parse(content);
} catch (e) {
assert.fail(`config must be valid JSON: ${e.message}`);
}
console.log("[BASELINE] config top-level keys:", Object.keys(parsed).join(", "));
assert.ok(typeof parsed === "object", "config must be object");
});
it("08.02 - config sections recorded", () => {
const config = JSON.parse(readFileSync(CONFIG_PATH, "utf8"));
const sections = {
gateway: !!config.gateway,
agents: !!config.agents,
models: !!config.models,
plugins: !!config.plugins,
channels: !!config.channels,
tools: !!config.tools,
diagnostics: !!config.diagnostics,
};
console.log("[BASELINE] config sections present:", JSON.stringify(sections));
assert.ok(sections.gateway, "gateway section must exist");
assert.ok(sections.models, "models section should exist");
});
it("08.03 - config validate CLI works", () => {
const out = execSync("openclaw config get gateway 2>&1", {
timeout: 10000,
encoding: "utf8",
}).trim();
console.log("[BASELINE] config get gateway:", out.substring(0, 200));
// Should not error
assert.ok(!out.toLowerCase().includes("error") || out.includes("Error"),
"config get must return data or clear error");
});
it("08.04 - invalid JSON config is rejected", () => {
// Create a temporary invalid config for testing rejection behavior
const invalidContent = "{ this is not valid json {{{";
try {
// Don't actually create it on the real config path
// Instead use openclaw config validate with a test file
writeFileSync(TEMP_INVALID_CONFIG, invalidContent, "utf8");
// Test that openclaw rejects it
try {
execSync(`OPENCLAW_CONFIG_PATH="${TEMP_INVALID_CONFIG}" openclaw config get gateway 2>&1`, {
timeout: 10000,
encoding: "utf8",
});
} catch (e) {
console.log("[BASELINE] invalid config rejection:", e.stderr?.substring(0, 200) || e.message?.substring(0, 200));
// Error on invalid config is expected behavior
assert.ok(e.stderr || e.message, "invalid config must produce error");
}
} finally {
try { unlinkSync(TEMP_INVALID_CONFIG); } catch {}
}
});
it("08.05 - config with unknown keys loads without crash", () => {
const config = JSON.parse(readFileSync(CONFIG_PATH, "utf8"));
// Check if unknown keys cause silent failure
// In practice, extra keys should be silently ignored or warned
console.log("[BASELINE] config key count:", Object.keys(config).length);
assert.ok(Object.keys(config).length > 0, "config must have sections");
});
it("08.06 - config dot-path get works", () => {
const paths = [
"gateway.bind",
"gateway.auth.mode",
"gateway.port",
];
for (const p of paths) {
try {
const out = execSync(`openclaw config get "${p}" 2>&1`, {
timeout: 10000,
encoding: "utf8",
}).trim();
console.log(`[BASELINE] config get ${p}:`, out.substring(0, 100));
} catch (e) {
console.log(`[BASELINE] config get ${p}: not found or error`);
}
}
assert.ok(true, "baseline frozen: dot-path get");
});
});