mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-05 02:12:33 +00:00
188 lines
4.1 KiB
TypeScript
188 lines
4.1 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { validateConfigObject } from "./config.js";
|
|
|
|
describe("config schema regressions", () => {
|
|
it("accepts nested telegram groupPolicy overrides", () => {
|
|
const res = validateConfigObject({
|
|
channels: {
|
|
telegram: {
|
|
groups: {
|
|
"-1001234567890": {
|
|
groupPolicy: "open",
|
|
topics: {
|
|
"42": {
|
|
groupPolicy: "disabled",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(true);
|
|
});
|
|
|
|
it('accepts memorySearch fallback "voyage"', () => {
|
|
const res = validateConfigObject({
|
|
agents: {
|
|
defaults: {
|
|
memorySearch: {
|
|
fallback: "voyage",
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(true);
|
|
});
|
|
|
|
it('accepts memorySearch provider "mistral"', () => {
|
|
const res = validateConfigObject({
|
|
agents: {
|
|
defaults: {
|
|
memorySearch: {
|
|
provider: "mistral",
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(true);
|
|
});
|
|
|
|
it("accepts safe iMessage remoteHost", () => {
|
|
const res = validateConfigObject({
|
|
channels: {
|
|
imessage: {
|
|
remoteHost: "bot@gateway-host",
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(true);
|
|
});
|
|
|
|
it("accepts channels.whatsapp.enabled", () => {
|
|
const res = validateConfigObject({
|
|
channels: {
|
|
whatsapp: {
|
|
enabled: true,
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(true);
|
|
});
|
|
|
|
it("rejects unsafe iMessage remoteHost", () => {
|
|
const res = validateConfigObject({
|
|
channels: {
|
|
imessage: {
|
|
remoteHost: "bot@gateway-host -oProxyCommand=whoami",
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(false);
|
|
if (!res.ok) {
|
|
expect(res.issues[0]?.path).toBe("channels.imessage.remoteHost");
|
|
}
|
|
});
|
|
|
|
it("accepts iMessage attachment root patterns", () => {
|
|
const res = validateConfigObject({
|
|
channels: {
|
|
imessage: {
|
|
attachmentRoots: ["/Users/*/Library/Messages/Attachments"],
|
|
remoteAttachmentRoots: ["/Volumes/relay/attachments"],
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(true);
|
|
});
|
|
|
|
it("accepts string values for agents defaults model inputs", () => {
|
|
const res = validateConfigObject({
|
|
agents: {
|
|
defaults: {
|
|
model: "anthropic/claude-opus-4-6",
|
|
imageModel: "openai/gpt-4.1-mini",
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(true);
|
|
});
|
|
|
|
it("accepts pdf default model and limits", () => {
|
|
const res = validateConfigObject({
|
|
agents: {
|
|
defaults: {
|
|
pdfModel: {
|
|
primary: "anthropic/claude-opus-4-6",
|
|
fallbacks: ["openai/gpt-5-mini"],
|
|
},
|
|
pdfMaxBytesMb: 12,
|
|
pdfMaxPages: 25,
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(true);
|
|
});
|
|
|
|
it("rejects non-positive pdf limits", () => {
|
|
const res = validateConfigObject({
|
|
agents: {
|
|
defaults: {
|
|
pdfModel: { primary: "openai/gpt-5-mini" },
|
|
pdfMaxBytesMb: 0,
|
|
pdfMaxPages: 0,
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(false);
|
|
if (!res.ok) {
|
|
expect(res.issues.some((issue) => issue.path.includes("agents.defaults.pdfMax"))).toBe(true);
|
|
}
|
|
});
|
|
|
|
it("rejects relative iMessage attachment roots", () => {
|
|
const res = validateConfigObject({
|
|
channels: {
|
|
imessage: {
|
|
attachmentRoots: ["./attachments"],
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(false);
|
|
if (!res.ok) {
|
|
expect(res.issues[0]?.path).toBe("channels.imessage.attachmentRoots.0");
|
|
}
|
|
});
|
|
|
|
it("accepts browser.extraArgs for proxy and custom flags", () => {
|
|
const res = validateConfigObject({
|
|
browser: {
|
|
extraArgs: ["--proxy-server=http://127.0.0.1:7890"],
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(true);
|
|
});
|
|
|
|
it("rejects browser.extraArgs with non-array value", () => {
|
|
const res = validateConfigObject({
|
|
browser: {
|
|
extraArgs: "--proxy-server=http://127.0.0.1:7890" as unknown,
|
|
},
|
|
});
|
|
|
|
expect(res.ok).toBe(false);
|
|
});
|
|
});
|