Files
openclaw/src/config/validation.allowed-values.test.ts
2026-03-02 20:05:12 -05:00

78 lines
2.5 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { validateConfigObjectRaw } from "./validation.js";
describe("config validation allowed-values metadata", () => {
it("adds allowed values for invalid union paths", () => {
const result = validateConfigObjectRaw({
update: { channel: "nightly" },
});
expect(result.ok).toBe(false);
if (!result.ok) {
const issue = result.issues.find((entry) => entry.path === "update.channel");
expect(issue).toBeDefined();
expect(issue?.message).toContain('(allowed: "stable", "beta", "dev")');
expect(issue?.allowedValues).toEqual(["stable", "beta", "dev"]);
expect(issue?.allowedValuesHiddenCount).toBe(0);
}
});
it("keeps native enum messages while attaching allowed values metadata", () => {
const result = validateConfigObjectRaw({
channels: { signal: { dmPolicy: "maybe" } },
});
expect(result.ok).toBe(false);
if (!result.ok) {
const issue = result.issues.find((entry) => entry.path === "channels.signal.dmPolicy");
expect(issue).toBeDefined();
expect(issue?.message).toContain("expected one of");
expect(issue?.message).not.toContain("(allowed:");
expect(issue?.allowedValues).toEqual(["pairing", "allowlist", "open", "disabled"]);
expect(issue?.allowedValuesHiddenCount).toBe(0);
}
});
it("includes boolean variants for boolean-or-enum unions", () => {
const result = validateConfigObjectRaw({
channels: {
telegram: {
botToken: "x",
allowFrom: ["*"],
dmPolicy: "allowlist",
streaming: "maybe",
},
},
});
expect(result.ok).toBe(false);
if (!result.ok) {
const issue = result.issues.find((entry) => entry.path === "channels.telegram.streaming");
expect(issue).toBeDefined();
expect(issue?.allowedValues).toEqual([
"true",
"false",
"off",
"partial",
"block",
"progress",
]);
}
});
it("skips allowed-values hints for unions with open-ended branches", () => {
const result = validateConfigObjectRaw({
cron: { sessionRetention: true },
});
expect(result.ok).toBe(false);
if (!result.ok) {
const issue = result.issues.find((entry) => entry.path === "cron.sessionRetention");
expect(issue).toBeDefined();
expect(issue?.allowedValues).toBeUndefined();
expect(issue?.allowedValuesHiddenCount).toBeUndefined();
expect(issue?.message).not.toContain("(allowed:");
}
});
});