Files
Moltbot/src/gateway/server.config-apply.e2e.test.ts
2026-02-17 15:50:07 +09:00

83 lines
2.1 KiB
TypeScript

import { afterAll, beforeAll, describe, expect, it } from "vitest";
import { WebSocket } from "ws";
import {
connectOk,
getFreePort,
installGatewayTestHooks,
onceMessage,
startGatewayServer,
} from "./test-helpers.js";
installGatewayTestHooks({ scope: "suite" });
let server: Awaited<ReturnType<typeof startGatewayServer>>;
let port = 0;
beforeAll(async () => {
port = await getFreePort();
server = await startGatewayServer(port, { controlUiEnabled: true });
});
afterAll(async () => {
await server.close();
});
const openClient = async () => {
const ws = new WebSocket(`ws://127.0.0.1:${port}`);
await new Promise<void>((resolve) => ws.once("open", resolve));
await connectOk(ws);
return ws;
};
describe("gateway config.apply", () => {
it("rejects invalid raw config", async () => {
const ws = await openClient();
try {
const id = "req-1";
ws.send(
JSON.stringify({
type: "req",
id,
method: "config.apply",
params: {
raw: "{",
},
}),
);
const res = await onceMessage<{ ok: boolean; error?: { message?: string } }>(ws, (o) => {
const msg = o as { type?: string; id?: string };
return msg.type === "res" && msg.id === id;
});
expect(res.ok).toBe(false);
expect(res.error?.message ?? "").toMatch(/invalid|SyntaxError/i);
} finally {
ws.close();
}
});
it("requires raw to be a string", async () => {
const ws = await openClient();
try {
const id = "req-2";
ws.send(
JSON.stringify({
type: "req",
id,
method: "config.apply",
params: {
raw: { gateway: { mode: "local" } },
},
}),
);
const res = await onceMessage<{ ok: boolean; error?: { message?: string } }>(ws, (o) => {
const msg = o as { type?: string; id?: string };
return msg.type === "res" && msg.id === id;
});
expect(res.ok).toBe(false);
expect(res.error?.message ?? "").toContain("raw");
} finally {
ws.close();
}
});
});