mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-09 11:47:41 +00:00
feat(gateway): add config hot reload
This commit is contained in:
63
src/gateway/config-reload.test.ts
Normal file
63
src/gateway/config-reload.test.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
buildGatewayReloadPlan,
|
||||
diffConfigPaths,
|
||||
resolveGatewayReloadSettings,
|
||||
} from "./config-reload.js";
|
||||
|
||||
describe("diffConfigPaths", () => {
|
||||
it("captures nested config changes", () => {
|
||||
const prev = { hooks: { gmail: { account: "a" } } };
|
||||
const next = { hooks: { gmail: { account: "b" } } };
|
||||
const paths = diffConfigPaths(prev, next);
|
||||
expect(paths).toContain("hooks.gmail.account");
|
||||
});
|
||||
|
||||
it("captures array changes", () => {
|
||||
const prev = { routing: { groupChat: { mentionPatterns: ["a"] } } };
|
||||
const next = { routing: { groupChat: { mentionPatterns: ["b"] } } };
|
||||
const paths = diffConfigPaths(prev, next);
|
||||
expect(paths).toContain("routing.groupChat.mentionPatterns");
|
||||
});
|
||||
});
|
||||
|
||||
describe("buildGatewayReloadPlan", () => {
|
||||
it("marks gateway changes as restart required", () => {
|
||||
const plan = buildGatewayReloadPlan(["gateway.port"]);
|
||||
expect(plan.restartGateway).toBe(true);
|
||||
expect(plan.restartReasons).toContain("gateway.port");
|
||||
});
|
||||
|
||||
it("restarts the Gmail watcher for hooks.gmail changes", () => {
|
||||
const plan = buildGatewayReloadPlan(["hooks.gmail.account"]);
|
||||
expect(plan.restartGateway).toBe(false);
|
||||
expect(plan.restartGmailWatcher).toBe(true);
|
||||
expect(plan.reloadHooks).toBe(true);
|
||||
});
|
||||
|
||||
it("restarts providers for web/telegram changes", () => {
|
||||
const plan = buildGatewayReloadPlan(["web.enabled", "telegram.botToken"]);
|
||||
expect(plan.restartGateway).toBe(false);
|
||||
expect(plan.restartProviders.has("whatsapp")).toBe(true);
|
||||
expect(plan.restartProviders.has("telegram")).toBe(true);
|
||||
});
|
||||
|
||||
it("treats gateway.remote as no-op", () => {
|
||||
const plan = buildGatewayReloadPlan(["gateway.remote.url"]);
|
||||
expect(plan.restartGateway).toBe(false);
|
||||
expect(plan.noopPaths).toContain("gateway.remote.url");
|
||||
});
|
||||
|
||||
it("defaults unknown paths to restart", () => {
|
||||
const plan = buildGatewayReloadPlan(["unknownField"]);
|
||||
expect(plan.restartGateway).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("resolveGatewayReloadSettings", () => {
|
||||
it("uses defaults when unset", () => {
|
||||
const settings = resolveGatewayReloadSettings({});
|
||||
expect(settings.mode).toBe("hybrid");
|
||||
expect(settings.debounceMs).toBe(300);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user